Frage

Ich habe ein Problem mit WM_PAINT haben. Grundsätzlich möchte ich WM_PAINT, nachdem ein Benutzer WM_COMMAND aufgerufen werden, aber aus irgendeinem Grund es ohnehin in der Hauptfunktion genannt.

 case WM_PAINT:
    {
     createFont();
     PAINTSTRUCT ps;
     HBRUSH hbruzh = CreateSolidBrush(RGB(0,0,0));
     HDC hdz = BeginPaint(hWnd,&ps);
     string s = "Memory Address";

     SelectBrush(hdz,hbruzh);
     SelectFont(hdz,hf);
     TextOut(hdz,0,0,s.c_str(),s.length());
     EndPaint(hWnd,&ps);

     DeleteObject(hbruzh);
     DeleteObject(hdz);

     break;
    }




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
 hThisInstance = hInstance;
 LoadLibrary("Riched20.dll");

 wc.cbSize = sizeof(WNDCLASSEX);
 wc.style = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = WindowProc;
 wc.hInstance = hInstance;
 wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
 if(!(wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON)))) {
  HRESULT res = GetLastError();

 }
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
 wc.lpszClassName = TEXT("Testcpp");
 RegisterClassEx(&wc);

 hWnd = CreateWindowEx(NULL, 
       wc.lpszClassName,
       TEXT("uTest"),
       WS_OVERLAPPEDWINDOW,
       300,
       200,
       450,
       300,
       NULL,
       NULL,
       hInstance,
       NULL);
 ShowWindow(hWnd,nCmdShow);

 MSG msg;
 while (GetMessage(&msg, NULL,0,0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);

 }


 return msg.wParam;
}

Laut MSDN wird WM_PAINT nur automatisch nach jeder Update () oder RedrawWindow () oder wenn Sie Sendmessage mit ihm als Nachricht bezeichnet. Ich mache keine, aber. Ich im Grunde nur WM_PAINT nach einer Interaktion mit dem Benutzer aufgerufen werden soll, nicht vor ... ist es eine Möglichkeit, dieses Problem beheben? Was verursacht das? (Ich denke, seine etwas bizare Nebeneffekt I cant Dokumentation finden>. <)

War es hilfreich?

Lösung

WM_PAINT ist jederzeit Ihre Fenster muss genannt neu gezeichnet werden. Das ist, was es ist für. Zeigen Sie das Fenster, die Größe des Fensters, die Wiederherstellung der Fenster von minimierten Zustand, womit sich die Fenster in den Vordergrund, nachdem es von einem anderen Fenster überdeckt worden ist, minimiert wird eine andere Anwendung, die Fenster wurde vertuscht ... das sind nur einige der Dinge, die eine WM_PAINT senden.

Ich glaube, Sie versuchen WM_PAINT für etwas zu verwenden, es ist nicht für gedacht.

Andere Tipps

Was verursacht das?

Meine Vermutung ist, dass, wenn der Benutzer den Menüpunkt aus dem Menü, das Gesetz zur Anzeige der Menüs hat überdachten Teil des Client-Fensters.

Also, wenn das Menü schließlich entfernen, a * WM_PAINT * Nachricht erzeugt, um neu erstellt, dass fehlender Teil des Client-Fensters.

Laut MSDN wird WM_PAINT nur automatisch nach jeder Update () oder RedrawWindow () oder wenn Sie Sendmessage mit ihm als Nachricht bezeichnet.

Es ist komplizierter als das. WM_PAINT könnte fast jederzeit erzeugt werden; zum Beispiel auch Synchrone und asynchrone Zeichnung .

Ich glaube nicht, dass Sie eine WM_PAINT verhindern können. Sie können:

  • Kraft eine sofortige WM_PAINT (zum Beispiel durch Update Aufruf)
  • Versuchen Sie, zu kombinieren / verzögern mehrere Anstriche in einer (beispielsweise durch mehrere Anrufe InvalidateRect verwenden)

Statt WM_PAINT zu verhindern, sollten Sie konzentrieren sich auf die Vermeidung / Fixierung, was „Nebeneffekt“ Sie sagen, Sie bekommen, wenn WM_PAINT verarbeitet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top