首页 文章

如何在c中调试WM_PAINT中的代码?

提问于
浏览
1

我在主窗口的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 回答

  • 2

    看起来没有人回答过这个问题 .

    首先,我不知道你正在使用什么框架,但在开始绘画之前通常会有一些检查 . 典型的涂料处理程序开始如下:

    RECT r;
    if (GetUpdateRect(&r) == 0)
    {
        // Nothing to paint, exit function.
        return 0;
    }
    
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    
    if (hdc == 0)
    {
        // No display device context available, exit function.
        return 0;
    }
    

    其次,我不知道'皮肤'是什么(HBITMAP,但我不知道它是如何创建的,它来自何处,尺寸和位深度) .

    第三,你的清理是不正确的 . 始终调用SelectObject以恢复先前选择的位图,笔,画笔等 . 然后在您创建的任何内容上调用DeleteObject .

    至于如何调试,如果在绘制处理程序中出现问题,应始终将其剥离到最低限度,验证功能,并开始添加内容直到它中断 . 在这种情况下,我会用一个奇怪颜色的简单填充矩形替换所有现有代码,看看是否有效 . 然后我会直接从时髦颜色上的“皮肤”位图做一个BitBlt,看看是否有效 .

    GDI编程中最常见的错误是由于使用错误的坐标(例如Window坐标而不是Client坐标,或者在BitBlt调用中将错误的偏移量放入源中),无法正确创建资源(例如CreateCompatibleDC,然后调用) CreateCompatibleBitmap使用新DC,导致单色位图),或无法正确清理(例如,在处理新创建的资源之前没有选择旧资源的方式) . 甚至不能正确启动重绘也是很常见的,这样你的WM_PAINT处理程序甚至不会被击中 . 第一步始终是一个断点,以确保您的代码甚至执行!

相关问题