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

时间:2014-02-04 00:10:05

标签: c++ winapi gdi

当我尝试使用以下代码将应用程序图标复制到客户区左上角时,我使用了如下代码:

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框中完成的。

1 个答案:

答案 0 :(得分: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。