【发布时间】: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处理程序,“嘿,当你画画的时候,你能不能也画登录文本?谢谢。”