为什么BitBlt不能复制正确的部分

3
当我尝试使用以下代码将应用程序图标复制到客户区左上角时,我使用了如下代码:
case WM_PAINT:
    hdcClient = BeginPaint (hwnd, &ps) ;
    hdcWindow = GetWindowDC (hwnd) ;

    cxSource = GetSystemMetrics (SM_CXSIZEFRAME) + GetSystemMetrics (SM_CXSIZE) ;
    cySource = GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION) ;

    BitBlt (hdcClient, 0, 0, cxSource, cySource, hdcWindow, 0, 0, SRCCOPY) ;

    ReleaseDC (hwnd, hdcWindow) ;
    EndPaint (hwnd, &ps) ;
    return 0 ;
    ......

然而,我总是得到这样的结果:

enter image description here

看起来hdcWindow获取的是它下方窗口的hdc。我无法理解我的BitBlt()调用有什么问题。
  • 我是在Windows 7上完成的。

这完全取决于所使用的 hwnd。它是否是可用的客户区域? - Abhinav
尝试:BitBlt(hdcWindow,0,0,cxSource,cySource,hdcWindow,0,0,SRCCOPY); - fileoffset
1
只需使用WM_GETICON和DrawIcon()。 - Hans Passant
请告诉我一下,您是否在尝试修改 Petzold 的书《Programming Windows 5th edition》中的示例代码?这对我会很有帮助。 - AlwaysLearningNewStuff
是的,我正在修改这个例子。 - IcyBrk
警告:在多监视器的情况下,使用 0, 0, SRCCOPY); 是非法的,请改用 GetSystemMetrics(SM_XVIRTUALSCREEN), GetSystemMetrics(SM_YVIRTUALSCREEN), SRCCOPY); - Grim
1个回答

0
hdcClient = BeginPaint (hwnd, &ps) ;
hdcWindow = GetWindowDC (hwnd) ;

cxSource = GetSystemMetrics (SM_CXSIZEFRAME) + GetSystemMetrics (SM_CXSIZE) ;
cySource = GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION) ;

BitBlt (hdcClient, 0, 0, cxSource, cySource, hdcWindow, 0, 0, SRCCOPY) ;

在这里,复制的目标hdcClient,它是由BeginPaint提供的句柄。但是BeginPaint返回客户区上下文的句柄,这不是你想要的。你想要在窗口区域的任何地方写入(包括滚动条/菜单等),所以你可能想要把目标设置为hdcWindow。


确切地说,我想将它复制到我的客户区域。 - IcyBrk
哦,抱歉,我误解了。所以它在正确的位置打印,但不是你想要的完整图像,是吗? - fileoffset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接