I am trying to calculate the width and height pixels of a Delphi form in the exact dialog to create a .rc (resource script) file that uses the DIALOGEX statement. So far, I have not been able to calculate the correct dialog modules using the Microsoft formula described here: https://support.microsoft.com/en-us/help/145994/how-to-calculate-dialog-box-units-based- on-the-current-font-in-visual
The link above uses the GetDialogBaseUnitsWin32 API call , but this does not work because the API function uses the system font. So it's useless. Even Microsoft says we should use MapDialogRectinstead. So, using the formula given here on how to calculate the base units of a dialog box with non-system fonts https://support.microsoft.com/en-us/help/125681/how-to-calculate-dialog-base-units-with- non-system-based-font
1 base dialog box horz == (2 * medium char dialog font width / medium char system font width) pixels
dialogue base unit 1 vert == (2 * medium char font size / medium char system height font) pixels
I tried something like this:
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:
:
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;
begin
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 );
end;
400z200 , 269 123 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"
{
}
