📄 dlgsize.dpr
字号:
program DlgSize;
{$R DlgSize.res}
uses Windows, Messages, Layout in 'Layout.pas';
const
IDC_B1 = 1001; // 控件ID列表
IDC_B2 = 1002;
IDC_B3 = 1003;
IDC_E1 = 2001;
IDC_E2 = 2002;
IDC_G1 = 3001;
IDD_LAYOUT = 101; // 对话框模板ID
IDI_LAYOUT = 102; // 对话框图标ID
// WM_SIZE消息处理
procedure DlgSize_OnSize(hWnd: HWND; state: UINT; cx, cy: Integer);
const
// Action Act-on Relative-to Offset ..
// ------ ------ ----------- ------ ..
Rules: array[0..13] of TRule= (
( Action: lMOVE;
ActOn:( nPart: Integer(lpRIGHT); idc: IDC_B1; nPercent: 0);
RelTo:( nPart: Integer(lpRIGHT); idc: lPARENT; nPercent: 0);
nOffset: -8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lEND;
ActOn:( nPart: Integer(lpWIDTH); idc: IDC_B1; nPercent: 0);
RelTo:( nPart: Integer(lpWIDTH); idc: lPARENT; nPercent: 15);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lMOVE;
ActOn:( nPart: Integer(lpTOP); idc: IDC_B2; nPercent: 0);
RelTo:( nPart: Integer(lpBOTTOM); idc: IDC_B1; nPercent: 0);
nOffset: +8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lMOVE;
ActOn:( nPart: Integer(lpLEFT); idc: IDC_B2; nPercent: 0);
RelTo:( nPart: Integer(lpLEFT); idc: IDC_B1; nPercent: 0);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lSTRETCH;
ActOn:( nPart: Integer(lpWIDTH); idc: IDC_B2; nPercent: 100);
RelTo:( nPart: Integer(lpWIDTH); idc: IDC_B1; nPercent: 100);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lVCENTER;
ActOn:( nPart: Integer(lpGROUP); idc: IDC_B3; nPercent: IDC_B3);
RelTo:( nPart: Integer(lpGROUP); idc: IDC_G1; nPercent: IDC_G1);
nOffset: +2; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lHCENTER;
ActOn:( nPart: Integer(lpGROUP); idc: IDC_B3; nPercent: IDC_B3);
RelTo:( nPart: Integer(lpGROUP); idc: IDC_G1; nPercent: IDC_G1);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lVCENTER;
ActOn:( nPart: Integer(lpGROUP); idc: IDC_B1; nPercent: IDC_B2);
RelTo:( nPart: Integer(lpGROUP); idc: IDC_E2; nPercent: IDC_E2);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lSTRETCH;
ActOn:( nPart: Integer(lpWIDTH); idc: IDC_E1; nPercent: 100);
RelTo:( nPart: Integer(lpWIDTH); idc: IDC_E2; nPercent: 50);
nOffset: +0; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lSTRETCH;
ActOn:( nPart: Integer(lpBOTTOM); idc: IDC_E2; nPercent: 0);
RelTo:( nPart: Integer(lpBOTTOM); idc: lPARENT; nPercent: 0);
nOffset: -8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lSTRETCH;
ActOn:( nPart: Integer(lpRIGHT); idc: IDC_E2; nPercent: 0);
RelTo:( nPart: Integer(lpLEFT); idc: IDC_B1; nPercent: 0);
nOffset: -8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lMOVE;
ActOn:( nPart: Integer(lpLEFT); idc: IDC_G1; nPercent: 0);
RelTo:( nPart: Integer(lpRIGHT); idc: IDC_E1; nPercent: 0);
nOffset: +8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lSTRETCH;
ActOn:( nPart: Integer(lpRIGHT); idc: IDC_G1; nPercent: 0);
RelTo:( nPart: Integer(lpRIGHT); idc: lPARENT; nPercent: 0);
nOffset: -8; fState: UNAPPLIED; nPixelOffset: 0),
( Action: lEND;
ActOn:( nPart: Integer(0); idc: 0; nPercent: 0);
RelTo:( nPart: Integer(0); idc: 0; nPercent: 0);
nOffset: 0; fState: UNAPPLIED; nPixelOffset: 0)
);
begin
// 根据规则Rules调整控件
Layout_ComputeLayout(hWnd, @Rules[0]);
end;
// WM_INITDIALOG消息处理
function DlgSize_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
var
Rc: TRect;
pptMin: PPoint;
begin
// 设置窗体图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, LoadIcon(HInstance, MakeIntResource(IDI_LAYOUT)));
// 保存最小尺寸
GetWindowRect(hWnd, Rc);
GetMem(pptMin, SizeOf(TPoint));
if (pptMin <> nil) then
begin
pptMin.X := Rc.Right - Rc.Left;
pptMin.Y := Rc.Bottom - Rc.Top;
end;
// 保存结构指针
SetWindowLong(hWnd, GWL_USERDATA, Integer(pptMin));
// 接收默认焦点
Result := TRUE;
end;
// WM_DESTROY消息处理
procedure DlgSize_OnDestroy(hWnd: HWND);
var
pptMin: PPoint;
begin
// 取出指针
pptMin := PPoint(GetWindowLong(hWnd, GWL_USERDATA));
// 释放结构
FreeMem(pptMin);
end;
// WM_GETMINMAXINFO消息处理
procedure DlgSize_OnGetMinMaxInfo(hWnd: HWND; lpMinMaxInfo: PMinMaxInfo);
begin
// 设置最小尺寸
lpMinMaxInfo.ptMinTrackSize := PPoint(GetWindowLong(hWnd, GWL_USERDATA))^;
end;
// WM_COMMAND消息处理
procedure DlgSize_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
begin
// 结束模态对话框
if (id = IDCANCEL) then EndDialog(hWnd, id);
end;
// 对话框过程
function DlgSize_DlgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
Result := TRUE;
case (uMsg) of
WM_INITDIALOG:
begin
Result := BOOL(SetWindowLong(hWnd, DWL_MSGRESULT,
Longint(DlgSize_OnInitDialog(hWnd, wParam, lParam))));
end;
WM_COMMAND:
begin
DlgSize_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
end;
WM_SIZE:
begin
DlgSize_OnSize(hWnd, wParam, LOWORD(lParam), HIWORD(lParam));
end;
WM_GETMINMAXINFO:
begin
DlgSize_OnGetMinMaxInfo(hWnd, PMinMaxInfo(lParam));
end;
WM_DESTROY:
begin
DlgSize_OnDestroy(hWnd);
end;
else Result := FALSE;
end;
end;
// 程序'主线程'入口
begin
DialogBox(HInstance, MakeIntResource(IDD_LAYOUT), 0, @DlgSize_DlgProc);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -