Compartilhar via


Window Layout and Mirroring

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

O layout janela define como texto e objetos Microsoft Windows Graphics Device Interface (GDI) são apresentados em uma janela ou dispositivo contexto (DC). A maioria dos idiomas, como inglês, francês e alemão, requerem uma ESQUERDA - para - layout direito (EPD). Outros idiomas, como árabe e hebraico, requerem layout right-to-Left (RTL).

O layout janela se aplica ao texto mas também afeta os outros elementos GDI da janela. Esses outros elementos GDI incluem bitmaps, ícones, a localidade de origem, botões, em cascata controles árvore, e se a coordenar horizontal aumenta conforme você ir esquerdo ou direito. De exemplo, após um aplicativo foi definido layout RTL, a origem é posicionada no direito borda da janela ou dispositivo e o número que representa a coordenar horizontal aumenta como mover esquerda.

No entanto, nem todos os elementos GDI são afetados pelo layout de uma janela. Por exemplo, o layout para diálogo caixas, mensagem caixas e contextos dispositivo que não são associado com uma janela, such as metarquivo e impressora controladores de domínio, deve ser tratado separadamente. Especificações para esses mencionados posteriormente neste tópico.

Observação

O Windows Embedded CE padrão Shell, anteriormente conhecido como o Shell HPC, tem sido espelhado.Você pode usar este shell como um exemplo de uma implementação de espelhamento.A exibição de shell espelhado em tempo de execução, você precisa compilar um executar-imagem tempo com o idioma árabe ou hebraico como sua linguagem usar como padrão.

Por padrão, o layout janela é EPD. Para definir o layout janela RTL, chamar CreateWindowEx Com o estilo WS_EX_LAYOUTRTL. Também Por padrão, um janela filho (um criado com o estilo estilo um válido e pai hWnd parâmetro na chamar para CreateWindow Ou CreateWindowEx) tem o mesmo layout como seu pai.

Para desativar herança de espelhamento para um individual janela, as in a maiúsculas e minúsculas de um janela filho que não deve herdar o layout de seu pai, processo de WM_CREATE mensagem com GetWindowLong e SetWindowLong Para desativar o sinalizador WS_EX_LAYOUTRTL. Adição esse processamento é qualquer outro processamento é necessária. O seguinte fragmento de código mostra como isso é feito.

SetWindowLong (hWnd, 
               GWL_EXSTYLE, 
               GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))

Para espelhada qualquer DC, chamar SetLayout (hdc, LAYOUT_RTL). A consulta configurações de contexto de dispositivo, chamar layout GetLayout. Após um bem-sucedido retornar, GetLayout Retorna uma DWORD que indica as configurações layout pelas configurações de bit de LAYOUT_RTL.

Após ter sido criada uma janela, alteração o layout usando o SetWindowLong função. De exemplo, isso é necessário quando o usuário altera a linguagem interface do usuário de uma janela existente do idioma árabe ou hebraico para alemão. No entanto, ao alterar o layout de uma janela existente, você deve invalidar e atualização de janela para garantir que o conteúdo da janela é Todos mostrado no mesmo layout. O seguinte altera o layout janela amostra de código quando necessário:

lExStyles = GetWindowLong(hWnd, GWL_EXSTYLE);

// Check whether new layout is opposite the current layout
if (!(pLState -> IsRTLLayout) != !(lExStyles & WS_EX_LAYOUTRTL))
{
    // the following lines will update the window layout

    lExStyles ^= WS_EX_LAYOUTRTL;        // toggle layout
    SetWindowLong(hWnd, GWL_EXSTYLE, lExStyles);
    InvalidateRect(hWnd, NULL, TRUE);    // to update layout in the client area
}

No espelhamento, é útil pensar em termos de "perto" e "muito" Em vez de "esquerda" e "direito". Caso contrário, pode causar problemas. Um comum codificação prática que causa problemas em uma janela espelhada ocorre ao mapeamento entre coordenadas Tela e cliente coordenadas. De exemplo, aplicativos geralmente usam codificar semelhante ao seguinte para posição um controle em uma janela:

// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW

// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);  

// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left); 
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);

Isso causa problemas no espelhamento porque a borda esquerda do retângulo se torna o direito de borda em uma janela espelhada e vice-versa. Para evitar esse problema, substituir o ScreenToClient Chamadas com um chamar para MapWindowPoints da seguinte maneira:

// USE THIS FOR MIRRORING

GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)

Este codificar funciona porque, em plataformas que suporte o espelhamento, MapWindowPoints é modificado para trocar esquerdo e direito coordenadas apontar quando a janela cliente é espelhada. Para obter mais informações, consulte a seção " Comentários " do MapWindowPoints.

Comum outra prática que podem causar problemas no Windows espelhados é posicionamento objetos em uma janela cliente usando os deslocamentos em coordenadas Tela instead of coordenadas cliente. De exemplo, a seguinte codificar usa a diferença em coordenadas Tela o posição x no cliente coordenadas a posição um controle em uma caixa diálogo.

// OK if LTR layout but WRONG for a mirrored dialog 

RECT rdDialog;
RECT rcControl;

HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog);             // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
           rcControl.left - rcDialog.left,  // uses x position in client coords
           rcControl.top - rcDialog.top,
           nWidth,
           nHeight,
           FALSE);

Este codificar é aplicável quando a janela diálogo tem layout EPD e a modo de mapeamento do cliente é MM_TEXT, porque o novo posição x em corresponder coordenadas de cliente para a diferença no deixado bordas do controle e o caixa de diálogo em coordenadas Tela. No entanto, em uma caixa diálogo espelhado, esquerdo e direito são revertidas, portanto, em vez disso, que você deve usar MapWindowPoints da seguinte maneira:

RECT rcDialog;
RECT rcControl;

HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);

// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);

// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)

O espelhamento caixas de diálogo e caixas de mensagens

Mensagem caixas de diálogo e não herdam layout, portanto, você deve definir o layout explicitamente. Para uma caixa mensagem, chamar espelhada MessageBox Com a opção MB_RTLREADING. Para dispor um caixa de diálogo right-to-Left, use o estendido estilo WS_EX_LAYOUTRTL na estrutura de modelo diálogo DLGTEMPLATEEX. Folhas de propriedades são uma maiúsculas e minúsculas especiais das caixas diálogo. Cada guia é tratado como um separar caixa diálogo, portanto, você precisa incluir o estilo WS_EX_LAYOUTRTL em cada guia que você desejar espelhado.

O espelhamento contextos de dispositivos não associados uma janela

Controladores de domínio que não são associado com uma janela, such as metarquivo ou impressora controladores de domínio, não herda layout, portanto, você deve definir o layout explicitamente. A alteração de layout contexto dispositivo, use o SetLayout função.

O SetLayout função raramente é usada com janelas. Em geral, janelas receber um associado DC somente em processamento uma mensagem WM_PAINT. Ocasionalmente, um programa cria um DC para uma janela por chamado GetDC. De qualquer maneira, o layout inicial para o DC é definido por BeginPaint Ou GetDC de acordo com WS_EX_LAYOUTRTL sinalizador a janela.

See Also

Other Resources

Uniscribe Application Development