在win32中调用WM_PAINT之间保留绘制的客户区

时间:2012-11-26 15:11:37

标签: c++ winapi

我试图在窗口上的客户区域上绘制(绘制)文本以响应某些事件(不在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 for skin绘制窗口dc,然后使用dc for text(在WM_LBUTTONDOWN中创建内存dc)。

皮肤位图按原样显示,但文本不显示。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

如果我理解正确你想要在WM_PAINT之外绘制内容并让它们持久存在。不幸的是,这不是窗户的运作方式。

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

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