win32 控件:resource.rc 和 CreateWindow 中的不同坐标

win32 controls: different coordinates in resource.rc and CreateWindow?

本文关键字:坐标 CreateWindow 控件 resource rc win32      更新时间:2023-10-16

我正在创建一个小型的win32应用程序。目前我在资源文件中编码了 6 个文本标签,如下所示:

IDD_MAIN DIALOGEX 0, 0, 465, 279
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "SpiderPigOverseer"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "sample text",IDC_STATIC1,"Static",SS_SIMPLE | WS_GROUP,344,70,33,8
    [...]
END

但是我想在 for 循环中访问它们,所以我想我会使用以下代码动态(?)创建它们:

IRValues[i] = CreateWindow("static", "sample text", SS_SIMPLE | WS_VISIBLE | WS_CHILD, 344, 70+10*i, 33, 8, hDlg, NULL, NULL, NULL);

但是,这使文本更大。x 和 y 位置比使用资源文件创建的位置要小得多,宽度和高度似乎也不同。这是为什么呢?

编辑:我尝试使用以下代码进行转换,但无法使其完全匹配。

HDC hdc = GetDC(hWnd);
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
cxAveChar = tm.tmAveCharWidth;
cyAveChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC( hWnd, hdc );

.rc 文件中的坐标表示为不等于像素的对话框单位。它用于根据系统字体大小自动调整控件大小。您可以按如下方式将对话框单位转换为像素:

pixelX = MulDiv(templateunitX, LOWORD(GetDialogBaseUnits()), 4);
pixelY = MulDiv(templateunitY, HIWORD(GetDialogBaseUnits()), 8);

或者干脆使用MapDialogRect()