Вопрос

У меня проблема с 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 только после взаимодействия с пользователем, а не раньше ... есть ли способ это исправить? Чем это вызвано? (Думаю, это какой-то странный эффект, я не могу найти документацию для>. <)

Это было полезно?

Решение

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

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

Другие советы

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

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

Таким образом, когда меню наконец удаляется, для воссоздания генерируется сообщение * wm_paint *.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top