To paint or not to paint

Thomasio

Erfahrenes Mitglied
Ich habe ein globales Flag, anhand dem mein Fenster seine Hintergrundgrafik aussucht

Im WM_PAINT steht also:

Code:
case WM_PAINT:
{
    int ABC = IDB_MYBACKGROUND2;
    if(bgsetting == 1)
      {
          ABC = IDB_MYBACKGROUND1;
      }
    HDC hdc;
    HBITMAP g_hbmBG = NULL;
    BITMAP bm;
    PAINTSTRUCT ps;
    g_hbmBG = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ABC));

...
...
...

}
break;

Das funktioniert so weit prima, habe ich schon in diversen Anwendungen benutzt

Aber jetzt habe ich ein Problem, das verstehe ich nicht

Mache ich:

Code:
case WM_LBUTTONDOWN:
{
    if(bgsetting == 1)
      {
          bgsetting = 0;
          SendMessage(myWindow, WM_PAINT, 0, 0);
          return 0;
      }
    if(bgsetting == 0)
      {
          bgsetting = 1;
          SendMessage(myWindow, WM_PAINT, 0, 0);
          return 0;
      }
}
break;

dann macht er gar nichts, bzw. er macht schon, aber die Grafik im Fenster ändert sich nicht
Ich habe mir ein dutzend MessageBoxen quer über den Code verteilt, er kommt auf klick schön brav zum paint, wählt dort auch die richtige Grafik aus, läuft quer durch den WM_PAINT, aber im Fenster sehe ich keine Änderung, sprich die Grafik bleibt immer die Gleiche

Mache ich dagegen:

Code:
case WM_LBUTTONDOWN:
{
    if(bgsetting == 1)
      {
          bgsetting = 0;
          ShowWindow(myWindow, SW_HIDE);
          ShowWindow(myWindow, SW_SHOW);
          return 0;
      }
    if(bgsetting == 0)
      {
          bgsetting = 1;
          ShowWindow(myWindow, SW_HIDE);
          ShowWindow(myWindow, SW_SHOW);
          return 0;
      }
}
break;

dann wechselt er schön brav bei jedem Klick die Grafik aus

Man berichtige mich wenn ich etwas übersehen habe, aber HIDE / SHOW macht doch auch nur einen WM_PAINT hinterher

Warum funktioniert WM_PAINT direkt bei mir nicht?
 
Es ist nicht unbedingt eine gute Idee Systemmessages "von hand" zu verschicken. Ich könnte jetzt auch nicht sagen was man alles beachten muß dazu.

Besser ist es wenn Du Invalidate() bzw InvalidateRect() benutzt. damit gibst du der Window-Engine an welche Bereich neu gezeichnet werden sollen udn die kann dann entsprechende WM_PAINT messages mti den passenden Parametern selbst erzeugen.
 

Neue Beiträge

Zurück