Domanda

Ho un problema con WM_PAINT. Fondamentalmente voglio WM_PAINT di essere chiamato dopo un WM_COMMAND utente, ma per qualche ragione si chiama comunque nella funzione principale.

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

Secondo MSDN, WM_PAINT viene chiamato solo automaticamente dopo il verificarsi UpdateWindow () o RedrawWindow (), oppure quando SendMessage con esso come un messaggio. Faccio nessuno, però. Io fondamentalmente voglio solo chiamare WM_PAINT dopo un'interazione con l'utente, non prima ... c'è un modo per risolvere questo problema? Che cosa sta causando questo? (Credo che la sua un po 'bizare effetto collaterale non posso trovare la documentazione per>. <)

È stato utile?

Soluzione

WM_PAINT si chiama qualsiasi momento la finestra deve essere ridisegnata. Questo è ciò che è per. Mostrando la finestra, ridimensionare la finestra, ripristinando la finestra da stato ridotto al minimo, portando la finestra in primo piano dopo che è stato coperto da un'altra finestra, riducendo al minimo un'altra app che stava coprendo la finestra ... queste sono solo alcune delle cose che invierà un WM_PAINT.

credo che tu stia cercando di utilizzare WM_PAINT per qualcosa che non è destinato.

Altri suggerimenti

Che cosa sta causando questo?

La mia ipotesi è che quando l'utente seleziona la voce di menu dal menu, l'atto di visualizzare il menu ha una parte coperta della finestra del client.

Così, quando il menu è finalmente rimuovere, a * * WM_PAINT messaggio viene generato per ricreato che manca parte della finestra del client.

Secondo MSDN, WM_PAINT viene chiamato solo automaticamente dopo il verificarsi UpdateWindow () o RedrawWindow (), o quando si SendMessage con esso come messaggio.

E 'più complicato di così. WM_PAINT potrebbe essere generato quasi in qualunque momento; per esempio si veda anche sincrone e asincrone Disegno .

Non credo che si può prevenire un WM_PAINT. È possibile:

  • Forza un WM_PAINT immediata (per esempio chiamando Update)
  • Prova a combinare / ritardare diversi colori in un unico (ad esempio utilizzando diverse chiamate alla InvalidateRect)

Invece di impedire WM_PAINT, si dovrebbe concentrarsi su come evitare / fissaggio qualunque "effetto collaterale" dici che stai ricevendo quando WM_PAINT viene elaborato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top