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.
Du har skapat ditt fönster. Nu vill du visa något inuti den. I Windows-terminologi kallas detta för att måla fönstret. För att blanda metaforer är ett fönster en tom arbetsyta som väntar på att du ska fylla den.
Ibland initierar programmet målningen för att uppdatera utseendet på fönstret. Vid andra tillfällen meddelar operativsystemet dig att du måste måla om en del av fönstret. När detta inträffar skickar operativsystemet fönstret ett WM_PAINT meddelande. Den del av fönstret som måste målas kallas uppdateringsområde.
Första gången ett fönster visas måste hela klientområdet i fönstret målas. Därför får du alltid minst ett WM_PAINT meddelande när du visar ett fönster.
Du ansvarar bara för att måla klientområdet. Den omgivande ramen, inklusive namnlisten, målas automatiskt av operativsystemet. När du är klar med att måla klientområdet rensar du uppdateringsregionen, som meddelar operativsystemet att det inte behöver skicka ett annat WM_PAINT meddelande förrän något ändras.
Anta nu att användaren flyttar ett annat fönster så att det döljer en del av fönstret. När den dolda delen blir synlig igen läggs den delen till i uppdateringsregionen och ditt fönster tar emot ett annat WM_PAINT meddelande.
Uppdateringsregionen ändras också om användaren sträcker ut fönstret. I följande diagram sträcker användaren ut fönstret till höger. Det nyligen exponerade området till höger i fönstret läggs till i uppdateringsregionen:
I vårt första exempelprogram är målningsrutinen mycket enkel. Det fyller bara hela klientytan med en enhetlig färg. Det här exemplet räcker dock för att demonstrera några av de viktiga begreppen.
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
Starta målningsåtgärden genom att anropa funktionen BeginPaint. Den här funktionen fyller i PAINTSTRUCT--strukturen med information om omritningsbegäran. Den aktuella uppdateringsregionen anges i rcPaint medlemsvariabeln i PAINTSTRUCT. Den här uppdateringsregionen definieras i förhållande till klientområdet:
I din målarkod har du två grundläggande alternativ:
- Måla hela klientområdet, oavsett storleken på uppdateringsregionen. Allt som faller utanför uppdateringsregionen klipps bort. Operativsystemet ignorerar det.
- Optimera genom att måla bara delen av fönstret i uppdateringsregionen.
Om du alltid målar hela klientområdet blir koden enklare. Om du har komplicerad mållogik kan det dock vara mer effektivt att hoppa över områden utanför uppdateringsregionen.
Följande kodrad fyller uppdateringsregionen med en enda färg med hjälp av den systemdefinierade fönsterbakgrundsfärgen (COLOR_WINDOW). Den faktiska färg som anges av COLOR_WINDOW beror på användarens aktuella färgschema.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
Informationen om FillRect är inte viktig för det här exemplet, men den andra parametern ger koordinaterna för rektangeln att fylla. I det här fallet skickar vi hela uppdateringsregionen (rcPaint medlem i PAINTSTRUCT). På det första WM_PAINT meddelandet måste hela klientområdet målas, så rcPaint kommer att innehålla hela klientområdet. Vid efterföljande WM_PAINT meddelanden kan rcPaint innehålla en mindre rektangel.
Funktionen FillRect är en del av GDI (Graphics Device Interface), som har drivit Windows-grafik under mycket lång tid. I Windows 7 introducerade Microsoft en ny grafikmotor med namnet Direct2D, som stöder grafikåtgärder med höga prestanda, till exempel maskinvaruacceleration. Direct2D är också tillgängligt för Windows Vista via Platform Update för Windows Vista och för Windows Server 2008 via Plattformsuppdatering för Windows Server 2008. (GDI stöds fortfarande fullt ut.)
När du är klar med målningen anropar du funktionen EndPaint. Den här funktionen rensar uppdateringsregionen, vilket signalerar till Windows att fönstret har slutfört själva målningen.