0

WM_PAINT に問題があります。基本的に、ユーザー WM_COMMAND の後に WM_PAINT を呼び出したいのですが、何らかの理由でメイン関数で呼び出されます。

 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() の後、またはそれをメッセージとして SendMessage したときにのみ自動的に呼び出されます。しかし、私は何もしません。基本的に、WM_PAINT を呼び出したいのは、ユーザーとのやり取りの前ではなく、後だけです...これを修正する方法はありますか? これは何が原因ですか?(私はそのいくつかの奇妙な副作用を推測します >.< のドキュメントを見つけることができません)

4

3 に答える 3

6

WM_PAINT は、ウィンドウの再描画が必要になるたびに呼び出されます。それがそのためです。ウィンドウを表示する、ウィンドウのサイズを変更する、最小化された状態からウィンドウを復元する、別のウィンドウに隠れていたウィンドウを最前面に移動する、ウィンドウを隠していた別のアプリを最小化する…これらはほんの一部です。 WM_PAINT を送信します。

WM_PAINT を意図していないものに使用しようとしていると思います。

于 2010-12-22T21:18:26.703 に答える
3

これは何が原因ですか?

私の推測では、ユーザーがメニューからメニュー項目を選択すると、メニューを表示する行為がクライアント ウィンドウの一部を覆っています。

そのため、メニューが最終的に削除されると、*WM_PAINT* メッセージが生成され、クライアント ウィンドウの欠落部分が再作成されます。

于 2010-12-23T02:18:33.697 に答える
2

MSDN によると、WM_PAINT は UpdateWindow() または ReDrawWindow() の後、またはそれをメッセージとして SendMessage したときにのみ自動的に呼び出されます。

それよりも複雑です。WM_PAINT はほぼいつでも生成される可能性があります。たとえば、同期および非同期描画も参照してください。

WM_PAINT を防ぐことはできないと思います。あなたはできる:

  • すぐに WM_PAINT を強制する (例: を呼び出すUpdate)
  • 複数のペイントを 1 つに結合/遅らせるようにしてください (たとえば、 への複数の呼び出しを使用してInvalidateRect) 。

WM_PAINT を防止する代わりに、WM_PAINT の処理時に発生する「副作用」を回避/修正することに集中する必要があります。

于 2010-12-22T21:28:31.633 に答える