用vc画图为了让x坐标上各数值的位置右对齐用TextOut使用了GetTextExtent函数来获得坐标值的字符串长度。当把图复制到剪贴板时相当于在剪贴板里画这个函数返回的坐标字符串长度就不正确。请提供正确的代码
在使用GetTextExtent函数时,需要传入正确的设备上下文,如果在剪贴板上画图,需要先获取剪贴板的设备上下文。以下是一个使用GetTextExtent函数并在剪贴板上画图的示例代码:
void DrawToClipboard(HWND hWnd)
{
// 打开剪贴板
if (!OpenClipboard(hWnd))
{
return;
}
// 获取剪贴板设备上下文
HDC hdc = GetDCEx(GetClipboardOwner(), NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
// 创建一个内存设备上下文,用于画图
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP memBmp = CreateCompatibleBitmap(hdc, 800, 600);
HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);
// 设置画笔和字体
HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
HFONT font = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Arial");
HFONT oldFont = (HFONT)SelectObject(memDC, font);
HGDIOBJ oldPen = SelectObject(memDC, pen);
// 画坐标轴
MoveToEx(memDC, 50, 550, NULL);
LineTo(memDC, 750, 550);
MoveToEx(memDC, 50, 550, NULL);
LineTo(memDC, 50, 50);
// 画坐标值
int x = 0;
for (int i = 0; i < 10; i++)
{
x += 50;
wchar_t str[10];
swprintf_s(str, L"%d", x);
SIZE size;
GetTextExtentPoint32(memDC, str, wcslen(str), &size);
TextOut(memDC, x - size.cx / 2, 560, str, wcslen(str));
}
// 释放资源
SelectObject(memDC, oldPen);
SelectObject(memDC, oldFont);
SelectObject(memDC, oldBmp);
DeleteObject(pen);
DeleteObject(font);
DeleteDC(memDC);
// 把图像复制到剪贴板上
SetClipboardData(CF_BITMAP, memBmp);
// 关闭剪贴板
ReleaseDC(NULL, hdc);
CloseClipboard();
}
``
原文地址: https://www.cveoy.top/t/topic/eo8h 著作权归作者所有。请勿转载和采集!