gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:22:53 27 4
gpt4 key购买 nike

我正在尝试在窗口的客户区上绘制(绘制)文本以响应某些事件(不在 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)绘制窗口 dc。

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

我如何实现这一点?

最佳答案

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

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

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

关于c++ - 在 win32 中保留对 WM_PAINT 调用之间绘制的客户区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13567628/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com