⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgsize.dpr

📁 这一系列是我平时收集的pascal深入核心变成
💻 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 + -