Mfc 在激活GDI缩放的情况下,将位图图像复制到Win 10中的剪贴板

Mfc 在激活GDI缩放的情况下,将位图图像复制到Win 10中的剪贴板,mfc,clipboard,gdi,bitmapimage,hidpi,Mfc,Clipboard,Gdi,Bitmapimage,Hidpi,我有一个生成图形图像的MFC桌面应用程序,我希望用户能够将其作为位图复制到剪贴板。我使用标准的剪贴板API例程,到目前为止,它们工作得很好。然而,我现在已经激活了GDI缩放(通过清单),这样程序就可以在HiDPI显示器上运行(相当好),我发现放在剪贴板上的图像只是实际图像的左上象限。 这可能是由于图像的内部缩放-显示器以200%的速度运行。 如何复制整个图像?前面问题的答案中给出了关键点: 但我花了一些时间来适应我的特殊问题的答案,所以我想我会分享一下,以防它对其他人有帮助。(免责声明-我不是专

我有一个生成图形图像的MFC桌面应用程序,我希望用户能够将其作为位图复制到剪贴板。我使用标准的剪贴板API例程,到目前为止,它们工作得很好。然而,我现在已经激活了GDI缩放(通过清单),这样程序就可以在HiDPI显示器上运行(相当好),我发现放在剪贴板上的图像只是实际图像的左上象限。 这可能是由于图像的内部缩放-显示器以200%的速度运行。
如何复制整个图像?

前面问题的答案中给出了关键点: 但我花了一些时间来适应我的特殊问题的答案,所以我想我会分享一下,以防它对其他人有帮助。(免责声明-我不是专家,所以可能有更好的方法…)

bool CopyRectToClipboard(CWnd *pW, CRect rctCopy)
{
    if (!pW->OpenClipboard())
        return false;
    if (!EmptyClipboard())
        return false;

    CClientDC dc(pW);
    CDC dcMem;
    VERIFY(dcMem.CreateCompatibleDC(&dc));

    CBitmap bmTrial;    // need a trial bitmap to get GDI Scaled size
    VERIFY(bmTrial.CreateCompatibleBitmap(&dc, rctCopy.Width(), rctCopy.Height()));
// see https://stackoverflow.com/questions/51169846/saving-bitmaps-on-windows-10-with-gdi-scaling-active
    BITMAPINFO bi = {};
    bi.bmiHeader.biSize = sizeof(bi);
    int result = GetDIBits(dc.GetSafeHdc(), (HBITMAP)bmTrial.GetSafeHandle(), 0, 0, NULL, &bi, DIB_RGB_COLORS);

    CBitmap bm;
    VERIFY(bm.CreateCompatibleBitmap(&dc, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight));
    ASSERT(bm.m_hObject != NULL);
    CBitmap* pbmOld = dcMem.SelectObject(&bm);

    //dcMem.PatBlt(0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, WHITENESS);  // legacy
    VERIFY(dcMem.BitBlt(0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,
        &dc, rctCopy.left - 1, rctCopy.top - 1, SRCCOPY));

    HGDIOBJ hBM = bm.Detach();
    VERIFY(::EmptyClipboard());
    VERIFY(::SetClipboardData(CF_BITMAP, hBM));
    VERIFY(::CloseClipboard());

    dcMem.SelectObject(pbmOld);
    dcMem.DeleteDC();
    return true;
}