以下是一个示例代码,可以在使用GetTextExtent函数时进行调整,以在剪贴板中正确显示字符串长度:

#include <Windows.h>
#include <string>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);

        // 设置字体
        HFONT hFont = 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");
        SelectObject(hdc, hFont);

        // 绘制坐标轴
        MoveToEx(hdc, 50, 50, NULL);
        LineTo(hdc, 50, 250);
        LineTo(hdc, 350, 250);

        // 绘制坐标轴刻度和标签
        for (int i = 0; i <= 10; i++)
        {
            int x = 50 + i * 30;
            int y = 250;
            MoveToEx(hdc, x, y, NULL);
            LineTo(hdc, x, y + 5);

            // 获取坐标字符串长度
            std::wstring str = std::to_wstring(i * 10);
            SIZE size;
            GetTextExtentPoint32(hdc, str.c_str(), str.length(), &size);

            // 右对齐坐标标签
            TextOut(hdc, x - size.cx / 2, y + 10, str.c_str(), str.length());
        }

        EndPaint(hWnd, &ps);
        break;
    }
    case WM_COPY:
    {
        // 创建内存设备上下文
        HDC hdc = GetDC(hWnd);
        HDC hMemDC = CreateCompatibleDC(hdc);
        HBITMAP hBitmap = CreateCompatibleBitmap(hdc, 400, 300);
        SelectObject(hMemDC, hBitmap);

        // 绘制图像
        SendMessage(hWnd, WM_PRINTCLIENT, (WPARAM)hMemDC, PRF_CLIENT);

        // 将图像复制到剪贴板
        OpenClipboard(hWnd);
        EmptyClipboard();
        SetClipboardData(CF_BITMAP, hBitmap);
        CloseClipboard();

        // 释放资源
        DeleteDC(hMemDC);
        ReleaseDC(hWnd, hdc);

        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 注册窗口类
    WNDCLASSEX wcex;
    memset(&wcex, 0, sizeof(wcex));
    wcex.cbSize = sizeof(wcex);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = hInstance;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.lpszClassName = L"MyWndClass";
    RegisterClassEx(&wcex);

    // 创建窗口
    HWND hWnd = CreateWindow(L"MyWndClass", L"VC画图示例", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        400, 300, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
        return FALSE;
    }

    // 显示窗口
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}
``

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

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