【问题标题】:Preserve painted client area between calls to WM_PAINT in win32在 win32 中对 WM_PAINT 的调用之间保留绘制的客户区
【发布时间】:2012-11-26 23:45:16
【问题描述】:

我正在尝试在窗口的客户区上绘制(绘制)文本以响应某些事件(不在WM_PAINT 消息中),那么如何在调用@987654322 之间保留客户区的状态@?我知道每次有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 为文本绘制(在WM_LBUTTONDOWN 中创建的内存 dc)。

皮肤位图按预期显示,但文本没有。

我如何做到这一点?

【问题讨论】:

  • 你需要做的是告诉你的WM_PAINT处理程序,“嘿,当你画画的时候,你能不能也画登录文本?谢谢。”

标签: c++ winapi


【解决方案1】:

如果我对您的理解正确,您想在 WM_PAINT 之外绘制东西并让它们持续存在。不幸的是,Windows 不是这样工作的。

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

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

【讨论】:

  • 我知道我必须重绘WM_PAINT中的所有内容,这就是我保存“mdc”的原因,但我认为我错了,我需要保存内存位图?我已经编辑了代码,请看一下。我考虑过设置标志,但不幸的是在绘制文本时需要考虑很多变量,所以我放弃了这个想法。帮我改正代码。
  • 好的,重新阅读您的帖子我认为您确实知道所有这些,而我的回复不值得赞成。我不想删除它,因为它可能对某人有用,但我怎么能否认它的功劳呢?至于代码,我稍后会尝试看看出了什么问题,因为您似乎正在尝试按照我的建议进行操作,现在没有时间了。我希望其他人可以介入:)
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多