我正在尝试将Delphi窗体的宽度和高度像素计算为准确的对话框单位,以创建使用DIALOGEX语句的.rc(资源脚本)文件。到目前为止,我无法使用Microsoft在此处描述的公式计算正确的对话框单位:https://support.microsoft.com/en-us/help/145994/how-to-calculate-dialog-box-units-based-on-the-current-font-in-visual
上述链接使用GetDialogBaseUnits Win32 API调用,但这不起作用,因为该API函数使用系统字体。所以这是无用的。即使Microsoft也说我们应该改用MapDialogRect。因此,使用此处提供的公式计算非系统字体的对话框基本单位https://support.microsoft.com/en-us/help/125681/how-to-calculate-dialog-base-units-with-non-system-based-font
请注意,
我已经看了两天了,似乎找不到最简单的方法来获取对话框单位。 我完全错了吗? 更新2: 我的更新函数:
我尝试了类似于以下内容:1个水平对话框基本单位==(2 *平均字符宽度对话框字体/平均字符宽度系统字体)像素
1个垂直对话框基本单位==(2 *平均字符高度对话框字体/平均字符高度系统字体)像素
xPixels := 200
yPixels := 50;
dc := GetDC(0);
SelectObject(dc,handle); // handle := f.Font.Handle (f := TForm created)
if not GetTextMetrics(dc, tm) then
ShowMessage('Error');
avgHeight := tm.tmHeight / 8.0;
GetTextExtentPoint32(dc,
PChar('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'), 52,
size);
avgWidth := size.cx / 52.0;
avgSysWidth := 5; // Made up value, how to calculate?
avgSysHeight := 1; // Made up value, how to calculate?
horzPixels := Round(2 * 1 * (avgWidth / avgSysWidth));
vertPixels := Round(2 * 1 * (avgHeight / avgSysHeight));
HorizontalDialogBaseUnit := Round(xPixels / horzPixels);
VerticalDialogBaseUnit := Round(yPixels / vertPixels);
请注意,
handle
来自创建的表单字体句柄。我不确定如何获得 avgSysWidth
和 avgSysHeight
的值。我已经看了两天了,似乎找不到最简单的方法来获取对话框单位。 我完全错了吗? 更新2: 我的更新函数:
// xPixesl := 400
// yPixels := 200
procedure Tdm.GetDlgBaseUnits(handle: HWND; xPixels, yPixels: integer; out HorizontalDLUs, VerticalDLUs: integer);
var
dc: HDC;
tm: TTextMetric;
size: TSize;
avgWidth, avgHeight: real;
VerticalDlu, HorizontalDlu: real;
// DialogUnits: Cardinal;
begin
// DialogUnits := GetDialogBaseUnits;
dc := GetDC(0);
SelectObject(dc,handle);
GetTextMetrics(dc, tm);
avgHeight := tm.tmHeight;
GetTextExtentPoint32(dc,
PChar('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'), 52,
size);
avgWidth := size.cx / 52.0;
HorizontalDLUs := Round( (4 * xPixels) / avgWidth );
VerticalDLUs := Round( (8 * yPixels) / avgHeight );
// HorizontalDLUs := Round( (xPixels / (avgWidth * LOWORD(DialogUnits))));
// VerticalDLUs := Round( (yPixels / (avgHeight * HIWORD(DialogUnits))));
end;
给定一个400x200像素的表单,上述函数生成了269x123个DLU。下面是该表单的图片。左边是设计好的400x200像素表单,右边是根据以下内容生成的表单:
DesignForm DIALOGEX 0, 0, 269, 123
STYLE WS_CAPTION | WS_SIZEBOX | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP
CAPTION "DesignForm"
CLASS "DLGCLASS"
FONT 8, "Tahoma"
{
}