1

WM_PAINT何らかのイベント (メッセージではなく) に応答して、ウィンドウのクライアント領域にテキストをペイント (描画) しようとしていますWM_PAINTWM_PAINTメッセージが表示される (またはウィンドウが更新される) たびに、ウィンドウが再描画され、外側のすべてWM_PAINTがもはや問題にならないことを理解しています。コードでよりよくコミュニケーションできるようになると思うので、これが私が今持っているものです。

HDC mdc;

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, 
                    LPSTR lpszArgument, int nFunsterStil)
{   
    LoadBitmap(...); // for skinning the app.
    stuff.. 
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     case WM_PAINT:
         PAINTSTRUCT ps;

             HDC hdc = BeginPaint(hwnd, &ps);
             BITMAP bm;

             HDC dcSkin = CreateCompatibleDC(hdc);
             GetObject(hSkinBmp, sizeof(bm), &bm);
             SelectObject(dcSkin, hSkinBmp);

             BitBlt(dcSkin, 0, 0, wWidth, wHeight, mdc, 0, 0, SRCCOPY);
             BitBlt(hdc, 0, 0, wWidth, wHeight, dcSkin, 0, 0, SRCCOPY);

             DeleteDC(dcSkin);

             EndPaint(hwnd, &ps);
     break;


     case WM_LBUTTONDOWN;

          HDC hdc = GetDC( hwnd );

          mdc = CreateCompatibleDC( hdc );


          LPRECT rect;
          GetClientRect( hwnd, rect);

          SelectObject( mdc, CreateCompatibleBitmap( hdc, rect->right, rect->bottom ) );

          BitBlt( mdc,0,0,rect->right,rect->bottom,hdc,0,0,SRCCOPY );


          HFONT hfont = CreateFont( 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, 
                          DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
                          PROOF_QUALITY, DEFAULT_PITCH | FF_SWISS   , 0 );

          HFONT hOldFont = (HFONT)SelectObject( mdc, hfont );

          SetTextColor( mdc, RGB(255,0,0) );
          SetBkColor( mdc, RGB(255,255,0) );
          TextOut( mdc, 50, 150, logintext.c_str(), strlen( logintext.c_str() ) );

          SelectObject( mdc, hOldFont );
          ReleaseDC( hwnd, hdc);
          InvalidateRect( hwnd, 0, TRUE );

     break;
}

ご覧のとおり、ウィンドウのクライアント領域を bmp でペイントする必要があります。次に、マウス ボタン ダウン メッセージが表示されたら、スキンされたクライアント領域の上にテキストを出力する必要があります。私がやっていることは、WM_LBUTTONDOWNメッセージで作成されたメモリ DC を保存し、最初にスキン用の DC でウィンドウ DC をペイントしてから、テキスト用の DC (メモリ DC で作成されたものWM_LBUTTONDOWN) をペイントしようとすることです。

スキン ビットマップは想定どおりに表示されますが、テキストは表示されません。

どうすればこれを達成できますか?

4

1 に答える 1

2

私があなたを正しく理解しているなら、あなたは WM_PAINT の外にあるものを描画し、それらを持続させたいと思っています。残念ながら、それはウィンドウの仕組みではありません。

ウィンドウの内容はいつでも破棄されて再描画される可能性があるため、WM_PAINT ハンドラー内のすべてを再描画できる必要があるため、これを実行できるようにプログラムを構築する必要があります。WM_PAINT ハンドラーの外側に何かを描画する代わりに、画面に何を表示するかをプログラムに伝えるフラグまたはその他の状態を設定し、画面の領域を無効にして、その領域を描画するために WM_PAINT が発行されるようにします。

更新が必要なときはいつでもオフスクリーン ビットマップにすべてを描画し、WM_PAINT 関数を使用してそのビットマップを画面上に描画するだけで、常に最新の状態に保つことができます。

于 2012-11-26T15:25:07.050 に答える