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

📄 modalles.pas

📁 这一系列是我平时收集的pascal深入核心变成
💻 PAS
字号:
unit Modalles;

interface

uses Windows;

  // 建立modalless对话框(Ansi版)
function Modalless_CreateDlgA(szTemplateName: PChar;
  hWndOwner: HWND; pfnDlgProc: TFNDlgProc; lParamInit: LPARAM): HWND; stdcall;

  // 建立modalless对话框(Unicode版)
function Modalless_CreateDlgW(szTemplateName: PWideChar;
  hWndOwner: HWND; pfnDlgProc: TFNDlgProc; lParamInit: LPARAM): HWND; stdcall;

  // 显示modalless对话框
function Modalless_ShowDlg(hWnd: HWND): Integer; stdcall;

  // 隐藏modalless对话框
function Modalless_EndDlg(hWnd: HWND; nResult: Integer): BOOL; stdcall;

  // 删除modalless对话框
function Modalless_DestroyDlg(hWnd: HWND): BOOL; stdcall;

implementation

const
  g_szModallessResult = 'ModallessResult'; // Properties 字符串

  // 建立modalless对话框(Ansi版)
function Modalless_CreateDlgA(szTemplateName: PChar;
  hWndOwner: HWND; pfnDlgProc: TFNDlgProc; lParamInit: LPARAM): HWND; stdcall;
begin
  Result := CreateDialogParamA(HInstance, szTemplateName, hWndOwner, pfnDlgProc, lParamInit);
end;

  // 建立modalless对话框(Unicode版)
function Modalless_CreateDlgW(szTemplateName: PWideChar;
  hWndOwner: HWND; pfnDlgProc: TFNDlgProc; lParamInit: LPARAM): HWND; stdcall;
begin
  Result := CreateDialogParamW(HInstance, szTemplateName, hWndOwner, pfnDlgProc, lParamInit);
end;

  // 显示modalless对话框
function Modalless_ShowDlg(hWnd: HWND): Integer; stdcall;
var
  hWndOwner: LongWord; // HWND
  Msg: TMsg;
begin
  hWndOwner := GetParent(hWnd);

 // 禁止属主窗口响应鼠标键盘消息
  if IsWindow(hWndOwner) then EnableWindow(hWndOwner, FALSE);

 // 显示 modalless 对话框
  ShowWindow(hWnd, SW_SHOW);

 // 下面进行消息循环,
 // 直至EndModalLessDlg()将'ModallessResult'与对话框相关联
  repeat
   // 取出消息并处理, 如果当前消息队列为空, 则GetMessage()会挂起调用线程, 直至有消息进入队列
    GetMessage(Msg, 0, 0, 0);
    if (not IsDialogMessage(hWnd, Msg)) then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;

   // 取'ModallessResult'属性, 如果出错, 则返回0
    Result := Integer(GetProp(hWnd, g_szModallessResult));

 // 尝试删除和对话框窗体关联的'ModallessResult'属性,
 // 如果出错, 说明EndModalLessDlg()还未调用, 则继续循环
  until (RemoveProp(hWnd, g_szModallessResult) <> 0);

 // 允许属主窗口响应鼠标键盘消息
  if IsWindow(hWndOwner) then EnableWindow(hWndOwner, TRUE);

 // 隐藏 modalless 对话框
  ShowWindow(hWnd, SW_HIDE);
end;

  // 隐藏modalless对话框
function Modalless_EndDlg(hWnd: HWND; nResult: Integer): BOOL; stdcall;
begin
 // 关联'ModallessResult'属性, 使得Modalless_ShowDlg()内的消息循环停止
  Result := SetProp(hWnd, g_szModallessResult, nResult);
end;

  // 删除modalless对话框
function Modalless_DestroyDlg(hWnd: HWND): BOOL; stdcall;
begin
  Result := DestroyWindow(hWnd);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -