Criando um Loop de mensagem

O sistema automaticamente cria uma fila de mensagens para cada thread. Se o thread cria uma ou mais janelas, um loop de mensagem devem ser previstas; Esta executar um loop mensagem recupera as mensagens da fila de mensagem do thread e distribui-las para os procedimentos de janela apropriada.

Porque o sistema direciona mensagens para janelas individuais em um aplicativo, um thread deve criar pelo menos uma janela antes de iniciar seu loop de mensagem. A maioria dos aplicativos baseados em Win32 contêm um único segmento que cria janelas. Um aplicativo típico registra a classe de janela para a janela principal, cria e mostra a janela principal e, em seguida, inicia o seu loop de mensagem — tudo em WinMain função.

Você cria um loop de mensagem usando o GetMessage e DispatchMessage funções. Se seu aplicativo deve obter entrada de caracteres do usuário, inclua a TranslateMessage função no loop. TranslateMessage converte virtual-chave mensagens em mensagens caractere. O exemplo a seguir mostra o loop de mensagem na WinMain função de um aplicativo baseado em Win32 simple.

HINSTANCE hinst; 
HWND hwndMain; 
 
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) de PASCAL {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Registrar a classe de janela para a janela principal. 
 
    se (! hPrevInstance) {wc.style = 0; 
        WC.lpfnWndProc = WndProc (WNDPROC); 
        WC.cbClsExtra = 0; 
        WC.cbWndExtra = 0; 
        WC.HINSTANCE = hInstance; 
        WC.hIcon = NULL LoadIcon((HINSTANCE), IDI_APPLICATION); 
        WC.hCursor = NULL LoadCursor((HINSTANCE), IDC_ARROW); 
        WC.hbrBackground = GetStockObject(WHITE_BRUSH); 
        WC.lpszMenuName = "MainMenu"; 
        WC.lpszClassName = "MainWndClass"; 
 
        if (!.RegisterClass(amp;wc)) retornar FALSE; 
    } hinst = hInstance;  / / Salvar identificador instância / / cria a janela principal. 
 
    hwndMain = CreateWindow ("MainWndClass", "Amostra", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, NULL (HMENU), hinst, (LPVOID) NULL); 
 
    / / Se não é possível criar a janela principal, finalizar / / o aplicativo. 
 
    se (! hwndMain) retornar FALSE; 
 
    / / Mostrar a janela e pintar seu conteúdo. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Iniciar o loop de mensagem. 
 
    ao mesmo tempo (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Return a codificar sair para o sistema. 
 
    retornar wParam; 
} 

 

O exemplo a seguir mostra um loop de mensagem para um segmento que usa aceleradores e exibe uma caixa de diálogo sem janela restrita. Quando TranslateAccelerator ou IsDialogMessage retorna TRUE (indicando que a mensagem tiver sido processada), TranslateMessage e DispatchMessage não são chamados. A razão para isto é que TranslateAccelerator e IsDialogMessage executam todas as convertendo necessárias e envio de mensagens.

HWND hwndMain; 
HwndDlgModeless HWND = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Executar inicialização e criar uma janela principal. 
/ / enquanto (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {se (hwndDlgModeless = = NULL (HWND) | | 
            !IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index