繁体   English   中英

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

[英]Preserve painted client area between calls to WM_PAINT in win32

我试图在窗口的客户区上绘制(绘制)文本以响应某些事件(不在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 为文本(在WM_LBUTTONDOWN创建的内存 dc )。

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

我如何实现这一目标?

如果我理解正确,你想在 WM_PAINT 之外绘制东西并让它们持久化。 不幸的是,这不是 Windows 的工作方式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM