gpt4 book ai didi

c - SetWindowPos() 在转换对话框单位时设置了错误的大小?

转载 作者:太空宇宙 更新时间:2023-11-04 08:03:50 25 4
gpt4 key购买 nike

我正在努力将对话单位 (DLU) 转换为像素,但我没能做到。

我附上了一个演示问题的示例程序,一个只有一个按钮的对话框。我先解释一下:我的 .rc 文件将对话框定义为“IDD_DIALOG1 DIALOG 0, 0, 320, 240”,因此 DLU 中的大小为 320x240。

我在调用 MapDialogRect() 时输入了这个大小,然后收到 rec.right 是 480,rec.bottom 是 390。

如果我截取窗口并移除边框,我将得到一个正好为 480x390 像素的客户区。万岁!转换有效,但是......

当我使用固定值 480x390 或返回的 rec.right 和 rec.bottom 调用 SetWindowPos() 时,窗口变小,客户区为 474x362。

我错过了什么吗?客户区不应该正好保持 480 x 390 像素吗?

.c文件:

#include <windows.h>
#include "resource.h"

BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_RSZ:
{
RECT rec;
rec.left = 0;
rec.top = 0;
rec.right = 320;
rec.bottom = 240;
MapDialogRect(hwnd, &rec);
SetWindowPos(hwnd, NULL, 0, 0, rec.right, rec.bottom, SWP_NOMOVE);
//SetWindowPos(hwnd, NULL, 0, 0, 480, 390, SWP_NOMOVE);
}
break;
}
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
default:
return FALSE;
}
return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}

.rc 文件:

// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 320, 240
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
PUSHBUTTON "Resize!", ID_RSZ, 144, 102, 35, 21, 0, WS_EX_LEFT
}

[编辑] 尝试使用 AdjustWindowRectEx():

[Edit2]5 月 23 日,更正我的复制粘贴错误:

    case ID_RSZ:
{
RECT rec;
rec.left = 0;
rec.top = 0;
rec.right = 320;
rec.bottom = 240;
MapDialogRect(hwnd, &rec);
AdjustWindowRectEx(&rec, DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU, FALSE, 0);
if(rec.left < 0) rec.right += (rec.left*-1);
if(rec.top < 0) rec.bottom += (rec.top*-1);
SetWindowPos(hwnd, NULL, 0, 0, rec.right, rec.bottom, SWP_NOMOVE);
}
break;

[Edit3] - 5 月 29 日

我最初的问题是关于 SetWindowPos() 及其行为,我收到了一个有效的答案。

但是,在经历了设计调整大小的窗口、复制每个大小和位置、用代码编写然后以编程方式转换它的费力过程后,我意识到自己很笨。

我所要做的就是在我的资源编辑器中为每个所需的大小创建另一个对话框,当用户更改大小时,我只需使用 EndDialog() 销毁窗口并使用提供对话框名称的 DialogBox() 再次调用该过程适合所选尺寸的对话窗口。

最佳答案

SetWindowPos 设置窗口外边缘的大小,包括窗口的非客户区部分,如标题栏和边框。如果您的申请不是 DPI aware那么 Windows 可能会对您的窗口应用缩放。 DWM 阴影也可能影响感知大小,但不应包含在您的计算中。

AdjustWindowRectEx可用于根据客户矩形的所需大小计算窗口矩形的所需大小。

关于c - SetWindowPos() 在转换对话框单位时设置了错误的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44122632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com