Элементы управления Win32: разные координаты в resource.rc и CreateWindow? - PullRequest
2 голосов
/ 15 мая 2011

Я создаю небольшое приложение 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 );

1 Ответ

8 голосов
/ 15 мая 2011

Координаты в файлах .rc представлены как Единицы диалога , которые не равны пикселям. Это сделано для автоматической настройки размера элементов управления в зависимости от размера системного шрифта. Вы можете конвертировать диалоговые единицы в пиксели следующим образом:

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

Или просто используйте MapDialogRect()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...