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);
}
}