在将图复制到剪贴板之前,需要先将设备上下文切换到一个虚拟设备上下文中,然后再进行复制操作。在虚拟设备上下文中,获取文本大小的函数会返回正确的值。以下是示例代码:

// 将图复制到剪贴板
void CopyToClipboard(HWND hWnd, HDC hDC)
{
    // 创建虚拟设备上下文
    HDC hVirtDC = CreateCompatibleDC(hDC);
    HBITMAP hVirtBitmap = CreateCompatibleBitmap(hDC, GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES));
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hVirtDC, hVirtBitmap);

    // 将图复制到虚拟设备上下文中
    BitBlt(hVirtDC, 0, 0, GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES), hDC, 0, 0, SRCCOPY);

    // 将虚拟设备上下文中的图复制到剪贴板
    OpenClipboard(hWnd);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hVirtBitmap);
    CloseClipboard();

    // 删除虚拟设备上下文
    SelectObject(hVirtDC, hOldBitmap);
    DeleteObject(hVirtBitmap);
    DeleteDC(hVirtDC);
}

注意:在使用虚拟设备上下文时,需要在最后删除虚拟设备上下文和相关的位图对象

用vc画图为了让x坐标上各数值的位置右对齐用TextOut使用了GetTextExtent函数来获得坐标值的字符串长度。当把图复制到剪贴板时相当于在剪贴板里画这个函数返回的坐标字符串长度就不正确提供正确的代码

原文地址: https://www.cveoy.top/t/topic/epBV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录