1

我正在尝试在窗口的客户区上绘制(绘制)文本以响应某些事件(不在WM_PAINT消息中),那么如何在调用之间保留客户区的状态WM_PAINT?我知道每次有WM_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 之外绘制东西并让它们持续存在。不幸的是,这不是 Windows 的工作方式。

您需要能够重绘WM_PAINT 处理程序中的所有内容,因为窗口的内容可以随时销毁并重绘,因此您必须构建程序才能做到这一点。不要在 WM_PAINT 处理程序之外绘制任何东西,而是设置一些标志或其他状态来告诉程序应该在屏幕上显示什么,然后使屏幕区域无效,以便发出 WM_PAINT 来绘制该区域。

对您来说可能更容易的一种替代方法是在需要更新时将所有内容绘制到屏幕外位图,并让 WM_PAINT 函数仅在屏幕上绘制该位图,以便它始终是最新的。

于 2012-11-26T15:25:07.050 回答