使用Win32

时间:2017-08-01 18:17:50

标签: c++ winapi

我正在编写一个Win32应用程序,并且我试图让窗口的大小与我在其中绘制的内容一致。作为一个最简单的案例,我试图创建一个窗口,其中包含一个完全填充窗口的绘制矩形。

documentation for CreateWindow()表示宽度和高度参数是以设备为单位,而documentation for Rectangle()表示宽度和高度参数是逻辑坐标,我认为这意味着他们以逻辑方式测量单位。我想设置一个POINT结构,其长度和宽度用于创建窗口,将POINT传递给DPtoLP(),然后使用生成的x和y值,因为我的矩形的宽度和高度应该可以工作,但矩形最终比窗户大。实际上,在我将它们用于矩形之前,差异似乎完全与我在尝试翻译窗口尺寸时完全相同。我哪里错了?我正在使用的完整测试程序:

POINT logicalUnitSize;

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    WNDCLASS wc{};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = L"Main";
    RegisterClass(&wc);

    POINT deviceUnitSize{ 200,200 };//width and height of window in device units

    HWND hwnd = CreateWindow(wc.lpszClassName, L"Size Test", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, deviceUnitSize.x, deviceUnitSize.y, nullptr, nullptr, hInstance, nullptr);

    //get width and height of window in logical units
    HDC hdc{ GetDC(hwnd) };
    logicalUnitSize = deviceUnitSize;
    DPtoLP(hdc, &logicalUnitSize, 1);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc{ BeginPaint(hWnd, &ps) };
        Rectangle(hdc, 0, 0, logicalUnitSize.x, logicalUnitSize.y);
        EndPaint(hWnd, &ps);
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为这里的主要问题是CreateWindow的大小参数是针对非客户区域的,即包括标题栏和边框等装饰。

创建窗口以获取客户区后使用GetClientRect,或使用AdjustWindowRect[Ex]