我正在编写一个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;
}
答案 0 :(得分:1)
我认为这里的主要问题是CreateWindow
的大小参数是针对非客户区域的,即包括标题栏和边框等装饰。
创建窗口以获取客户区后使用GetClientRect
,或使用AdjustWindowRect[Ex]
。