.rc скрипт: скалярность контролов: есть пара "добрых" слов
пишу парсер .rc скриптов и проверяю работоспособность его путем создания окна с контролами что описаны в скрипте. Все ок. НО! Почему-то размер всех котролов меньше примерно в два раза. Нет, я не делю все значения загруженные из файла на два :)
Кто сталкивался с такой проблемой?
[SIZE="1"][COLOR="DimGray"]PS:
Не удивлюсь, если выяснится что rc скрипты в м$ придуманы.[/COLOR][/SIZE]
[SIZE="1"][COLOR="DimGray"]PS:
Не удивлюсь, если выяснится что rc скрипты в м$ придуманы.[/COLOR][/SIZE]
[SIZE="1"][COLOR="DimGray"]удивлюсь, если это сильно не так[/COLOR][/SIZE]
Это формат описания ресурсов, придуманный для Windows.
Кстати, как я понимаю, ничего странного в растяжении контролов нет - у каждого может быть своё разрешение экрана (DPI), под это они и масштабируются.
Они масштабируются в соответствии с выбранным для диалога шрифтом. В референсах к функции, ссылку на которую я дал, об этом и говорится (в общем-то я и давал не функцию а "чтобы почитать").
Я так понял, что "screen units" - это как раз DPI:
Хотя там дальше про SETFONT говорится, но не понятно, в дополнение к этому или как определение "screen units".
тоесть скрин юниты - это пикселы. А св-ва диалога задаются в неких абстрактных dialog units, и взаимно однозначное соответствие между первыми и вторыми устанавливается конкретным шрифтом диалога - там же формулы через некие baseunits, которые суть
или же GetDialogBaseUnits().
На самом деле с DPI тут связи прямой нет, но т.к. для экранов с большим DPI зачастую устанавливают большие шрифты, объяснить это сложно. :)
int base_x, base_y;
TEXTMETRIC tm;
HDC hdc = GetDC (hwnd);
SIZE size;
SelectObject (hdc, hfont);
GetTextMetrics (hdc, &tm);
GetTextExtentPoint32 (hdc, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &size);
ReleaseDC (hwnd, hdc);
base_x = (size.cx / 26 + 1) / 2;
base_y = tm.tmHeight;
r->left = MulDiv (r->left, base_x, 4);
r->right = MulDiv (r->right, base_x, 4);
r->top = MulDiv (r->top, base_y, 8);
r->bottom = MulDiv (r->bottom, base_y, 8);
}
главная фича здесь конечно в
base_x = (size.cx / 26 + 1) / 2;
ети две строчки нашел в сети
msdn:
For a dialog box that does not use the system font, the base units are the average width and height, in pixels, of the characters in the dialog's font. You can use the GetTextMetrics and GetTextExtentPoint32 functions to calculate these values for a selected font.
GetTextMetrics - ето еще понятно, но вот что скормить GetTextExtentPoint32 - ето была задача :)
Теперь, хоть я и непонимаю как, но оно работает.
Вопрос решен. Всем спасибо.
Естественно. Но я специально дал ссылкой чтоб почитать описание к этой функции, а не то что бы ее сразу так использовать. А потом даже заострил на этом внимание.
GetTextMetrics - ето еще понятно
а как насчет tmAveCharWidth?
а как насчет tmAveCharWidth?
Та никак.
[FONT="Courier New"]tmAveCharWidth[/FONT] обычно меньше чем [FONT="Courier New"](size.cx / 26 + 1) / 2[/FONT]