📄 tabstops.dpr
字号:
program TabStops;
{$R TabStops.res}
uses Windows, Messages;
const
IDD_TABSTOPS = 102; // 主对话框模板ID
IDD_CTRLPRNT = 103; // 子对话框模板ID
IDI_TABSTOPS = 104; // 主对话框图标ID
IDC_CTRLPRNT = 101; // Static文字控件ID
IDC_ADDDLGCNTL = 1006; // 'Add..'按钮ID
// 修改窗体风格(添加&去除)
procedure ModifyWndStyle(hWnd: HWND; dwRemove, dwAdd: DWORD; fExtendedStyles: BOOL);
var
nOffset: Integer;
begin
if fExtendedStyles then nOffset := GWL_EXSTYLE else nOffset := GWL_STYLE;
SetWindowLong(hWnd, nOffset, (GetWindowLong(hWnd, nOffset) and (not dwRemove)) or dwAdd);
end;
// 处理WM_INITDIALOG消息
function DlgTabs_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
begin
SendMessage(hWnd, WM_SETICON, ICON_BIG, // 设置图标
LoadIcon(Hinstance, MakeIntResource(IDI_TABSTOPS)));
Result := TRUE; // 允许Windows设置焦点给hWndFocus
end;
// 处理WM_COMMAND消息
procedure DlgTabs_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
var
hWndCtlOld, hWndCtlNew: LongWord; // HWND
Rc: TRect;
begin
case (id) of
IDOK, IDCANCEL:
begin
EndDialog(hWnd, id); // 关闭对话框
end;
IDC_ADDDLGCNTL:
begin
// 取Static文字控件尺寸&位置
hWndCtlOld := GetDlgItem(hWnd, IDC_CTRLPRNT);
if (IsWindow(hWndCtlOld) = FALSE) then Exit;
GetWindowRect(hWndCtlOld, Rc);
MapWindowPoints(HWND_DESKTOP, hWnd, Rc, 2);
// 根据资源模板建立子对话框,
// 注意: 给CreateDialog()的回调是nil, 因为我们并不需要处理子对话框的消息
hWndCtlNew := CreateDialog(HInstance, MakeIntResource(IDD_CTRLPRNT), hWnd, nil);
if (IsWindow(hWndCtlNew) = FALSE) then Exit;
// 设置子对话框尺寸和位置, 并插入到Static之后
SetWindowPos(hWndCtlNew, hWndCtlOld,
Rc.Left, Rc.Top, Rc.Right - Rc.Left, Rc.Bottom - Rc.Top, SWP_SHOWWINDOW);
// 添加WS_EX_CONTROLPARENT风格, 使其子控件可由Tab获得焦点
ModifyWndStyle(hWndCtlNew, 0, WS_EX_CONTROLPARENT, TRUE);
// 删除Static文字控件
DestroyWindow(hWndCtlOld);
// 禁用'Add ..'按钮
EnableWindow(hWndCtl, FALSE);
// 去掉默认按钮样式
SetWindowLong(hWndCtl, GWL_STYLE,
(GetWindowLong(hWndCtl, GWL_STYLE) and (not BS_DEFPUSHBUTTON)) or BS_PUSHBUTTON);
// 设置默认按钮样式
SendMessage(hWnd, DM_SETDEFID, IDOK, 0);
// 转移焦点, 因为'Add ..'按钮已禁用
SetFocus(GetNextDlgTabItem(hWnd, hWndCtl, FALSE));
end;
end;
end;
// 对话框消息处理回调函数
function DlgTabs_DlgProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
case (uMsg) of
WM_INITDIALOG:
begin
Result := BOOL(
SetWindowLong(hWnd, DWL_MSGRESULT, Longint(
DlgTabs_OnInitDialog(hWnd, wParam, lParam)))
);
end;
WM_COMMAND:
begin
DlgTabs_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
Result := TRUE;
end;
else
Result := FALSE;
end;
end;
// 程序'主线程'入口
begin
DialogBox(HInstance, MakeIntResource(IDD_TABSTOPS), 0, @DlgTabs_DlgProc);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -