我在主窗口的WM_PAINT消息处理程序中有以下代码:
void BossController::paint ( HWND hwnd, HBITMAP skin )
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint ( hwnd, &ps );
HDC dcSkin = CreateCompatibleDC ( hdc ); // memory dc for skin
HDC hMemDc = CreateCompatibleDC ( hdc ); // memory dc for painting
HBITMAP hmemBmp = CreateCompatibleBitmap ( hdc, width, height ); // Create bitmap to draw on
HBITMAP hOldMemBmp = (HBITMAP)SelectObject ( hMemDc, hmemBmp ); // select memory bitmap in memory dc
HBITMAP hOldSkinBmp = (HBITMAP)SelectObject ( dcSkin, skin ); //select skin bitmap in skin memory dc
BitBlt ( hMemDc, 0, 0, width, height, dcSkin, 0, 0, SRCCOPY ); // Paint Skin on Memory DC
BitBlt ( hdc, 0, 0, width, height, hMemDc, 0, 0, SRCCOPY ); // Paint Skin on Window DC
DeleteObject ( hOldSkinBmp );
DeleteObject ( hOldMemBmp );
DeleteObject( hmemBmp );
DeleteDC ( hMemDc );
DeleteDC ( dcSkin );
EndPaint ( hwnd, &ps );
};
我将在皮肤上绘制文本,这也就是为什么我在内存DC上使用内存位图进行BitBlt,我已尝试直接绘制(直接到hdc),但没有一个工作,我不知道如何调试它 . 我唯一可以检查的是在LoadBitmap函数的返回值和void BossController :: paint(HWND hwnd,HBITMAP外观)中检查外观是否为NULL . 和BitBlt的返回值 .
它始终显示一个矩形,其中包含我在创建窗口时选择的背景颜色 . (窗口是一个自定义皮肤,所以没有 Headers 栏等 .
有人可以指出错误,如果有任何或潜在的陷阱或可能如何调试它?
1 回答
看起来没有人回答过这个问题 .
首先,我不知道你正在使用什么框架,但在开始绘画之前通常会有一些检查 . 典型的涂料处理程序开始如下:
其次,我不知道'皮肤'是什么(HBITMAP,但我不知道它是如何创建的,它来自何处,尺寸和位深度) .
第三,你的清理是不正确的 . 始终调用SelectObject以恢复先前选择的位图,笔,画笔等 . 然后在您创建的任何内容上调用DeleteObject .
至于如何调试,如果在绘制处理程序中出现问题,应始终将其剥离到最低限度,验证功能,并开始添加内容直到它中断 . 在这种情况下,我会用一个奇怪颜色的简单填充矩形替换所有现有代码,看看是否有效 . 然后我会直接从时髦颜色上的“皮肤”位图做一个BitBlt,看看是否有效 .
GDI编程中最常见的错误是由于使用错误的坐标(例如Window坐标而不是Client坐标,或者在BitBlt调用中将错误的偏移量放入源中),无法正确创建资源(例如CreateCompatibleDC,然后调用) CreateCompatibleBitmap使用新DC,导致单色位图),或无法正确清理(例如,在处理新创建的资源之前没有选择旧资源的方式) . 甚至不能正确启动重绘也是很常见的,这样你的WM_PAINT处理程序甚至不会被击中 . 第一步始终是一个断点,以确保您的代码甚至执行!