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

📄 tabstops.dpr

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