win32: WM_PAINT вызывает, но не должен быть! - PullRequest
0 голосов
/ 23 декабря 2010

У меня проблема с WM_PAINT.По сути, я хочу, чтобы WM_PAINT вызывался после пользователя WM_COMMAND, но по какой-то причине он вызывается в любом случае в основной функции.

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

Согласно MSDN, WM_PAINT вызывается автоматически только после UpdateWindow () или ReDrawWindow (), или когда вы отправляете сообщение с сообщением.Я ничего не делаю, однако.Я в основном хочу вызывать WM_PAINT только после взаимодействия с пользователем, а не раньше ... Есть ли способ исправить это?Чем это вызвано?(Я думаю, это какой-то странный побочный эффект, я не могу найти документацию для>. <) </p>

Ответы [ 3 ]

6 голосов
/ 23 декабря 2010

WM_PAINT вызывается каждый раз, когда ваше окно необходимо перерисовать. Вот для чего это. Отображение окна, изменение его размера, восстановление окна из свернутого состояния, вывод окна на передний план после того, как оно было закрыто другим окном, сворачивание другого приложения, которое закрывало ваше окно ... это лишь некоторые из отправит WM_PAINT.

Я думаю, вы пытаетесь использовать WM_PAINT для чего-то, для чего он не предназначен.

3 голосов
/ 23 декабря 2010

Что вызывает это?

Я предполагаю, что когда пользователь выбирает пункт меню из меню, действие по отображению меню покрывает часть окна клиента.удалить, сообщение * WM_PAINT * генерируется для воссоздания этой недостающей части окна клиента.

2 голосов
/ 23 декабря 2010

Согласно MSDN, WM_PAINT вызывается автоматически только после UpdateWindow () или ReDrawWindow () или когда вы отправляете сообщение с сообщением в виде сообщения.

Это сложнее, чем это. WM_PAINT может быть сгенерирован почти в любое время; например, см. также Синхронное и асинхронное рисование .

Не думаю, что вы можете предотвратить WM_PAINT. Вы можете:

  • Принудительное немедленное WM_PAINT (например, путем вызова Update)
  • Попробуйте объединить / задержать несколько красок в одну (например, используя несколько вызовов InvalidateRect)

Вместо того, чтобы предотвращать WM_PAINT, вы должны сосредоточиться на том, чтобы избегать / исправлять любой «побочный эффект», который вы получаете, когда получаете WM_PAINT.

...