Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Funktionen DispatchMessage anropar fönsterproceduren för fönstret som är målet för meddelandet. Fönsterproceduren har följande signatur.
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Det finns fyra parametrar:
- hwnd är ett handtag till fönstret.
 - uMsg är meddelandekoden. Meddelandet WM_SIZE anger till exempel att fönstret har storleksändrats.
 - wParam och lParam innehåller ytterligare data, som gäller meddelandet. Den exakta innebörden beror på meddelandekoden.
 
LRESULT- är ett heltalsvärde som programmet returnerar till Windows. Den innehåller programmets svar på ett visst meddelande. Innebörden av det här värdet beror på meddelandekoden. CALLBACK är anropande konvention för funktionen.
En typisk fönsterprocedur är helt enkelt en stor switch-instruktion som växlar på meddelandekoden. Lägg till ärenden för varje meddelande som du vill hantera.
switch (uMsg)
{
    case WM_SIZE: // Handle window resizing
    // etc
}
Ytterligare data för meddelandet finns i parametrarna lParam och wParam. Båda parametrarna är heltalsvärden storleken på en pekarbredd (32 bitar eller 64 bitar). Innebörden av var och en beror på meddelandekoden (uMsg). För varje meddelande måste du leta upp meddelandekoden och omvandla parametrarna till rätt datatyp. Vanligtvis är data antingen ett numeriskt värde eller en pekare till en struktur. Vissa meddelanden har inga data.
Dokumentationen för WM_SIZE-meddelandet anger till exempel att:
- wParam är en flagga som anger om fönstret minimerades, maximerades eller ändrades storlek.
 - lParam innehåller fönstrets nya bredd och höjd som 16-bitarsvärden packade i ett 32- eller 64-bitarsnummer. Du måste utföra lite bit-skiftning för att hämta dessa värden. Lyckligtvis innehåller huvudfilen WinDef.h hjälpmakron som gör detta.
 
En typisk fönsterprocedur hanterar dussintals meddelanden, så att den kan växa ganska länge. Ett sätt att göra koden mer modulär är att placera logiken för att hantera varje meddelande i en separat funktion. I fönstret skickar du parametrarna wParam och lParam till rätt datatyp och skickar dessa värden till funktionen. Om du till exempel vill hantera WM_SIZE meddelande ser fönsterproceduren ut så här:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_SIZE:
        {
            int width = LOWORD(lParam);  // Macro to get the low-order word.
            int height = HIWORD(lParam); // Macro to get the high-order word.
            // Respond to the message:
            OnSize(hwnd, (UINT)wParam, width, height);
        }
        break;
    }
}
void OnSize(HWND hwnd, UINT flag, int width, int height)
{
    // Handle resizing
}
              
              LOWORD och HIWORD makronen hämtar 16-bitars bredd och höjdvärden från lParam. Fönsterproceduren extraherar bredden och höjden och skickar sedan dessa värden till funktionen OnSize.
Standardhantering av meddelanden
Om du inte hanterar ett visst meddelande i fönsterproceduren skickar du meddelandeparametrarna direkt till funktionen DefWindowProc. Den här funktionen utför standardåtgärden för meddelandet, som varierar beroende på meddelandetyp.
return DefWindowProc(hwnd, uMsg, wParam, lParam);
Undvik flaskhalsar i din fönsterprocedur
Medan fönsterproceduren körs blockerar den alla andra meddelanden för fönster som skapats i samma tråd. Undvik därför långvarig bearbetning i fönsterproceduren. Anta till exempel att programmet öppnar en TCP-anslutning och väntar på obestämd tid på att servern ska svara. Om du gör det i fönsterproceduren svarar inte användargränssnittet förrän begäran har slutförts. Under den tiden kan fönstret inte bearbeta mus- eller tangentbordsindata, måla om sig själv eller ens stänga.
I stället bör du flytta arbetet till en annan tråd med någon av de multitasking-funktioner som är inbyggda i Windows.
- Skapa en ny tråd.
 - Använd en trådpool.
 - Använd asynkrona I/O-anrop.
 - Använd asynkrona proceduranrop.