Browse Source

* Copied TaskDialog headers from Lazarus' win32extra at Paul's request.

git-svn-id: trunk@16337 -
marco 14 years ago
parent
commit
83d92fb0fc
1 changed files with 197 additions and 0 deletions
  1. 197 0
      packages/winunits-base/src/shlobj.pp

+ 197 - 0
packages/winunits-base/src/shlobj.pp

@@ -2294,5 +2294,202 @@ Const External_Library = 'shell32';
 //             pvData:pointer; pvHint:pointer; piIndex:plongint; piIndexSel:plongint):HRESULT;StdCall;external External_library name 'SHMapIDListToImageListIndexAsync';
   function SHMapPIDLToSystemImageListIndex(pshf:IShellFolder; pidl:LPCITEMIDLIST; piIndexSel:plongint):Longint;StdCall;external External_library name 'SHMapPIDLToSystemImageListIndex';
 
+
+// ===================== Task Dialog =========================
+
+Type
+  PFTASKDIALOGCALLBACK = function(hwnd: HWND; msg: UINT; wParam: WPARAM; lParam: LPARAM; lpRefData: LONG_PTR): HRESULT; stdcall;
+
+  // _TASKDIALOG_FLAGS enum
+const
+  TDF_ENABLE_HYPERLINKS               = $0001;
+  TDF_USE_HICON_MAIN                  = $0002;
+  TDF_USE_HICON_FOOTER                = $0004;
+  TDF_ALLOW_DIALOG_CANCELLATION       = $0008;
+  TDF_USE_COMMAND_LINKS               = $0010;
+  TDF_USE_COMMAND_LINKS_NO_ICON       = $0020;
+  TDF_EXPAND_FOOTER_AREA              = $0040;
+  TDF_EXPANDED_BY_DEFAULT             = $0080;
+  TDF_VERIFICATION_FLAG_CHECKED       = $0100;
+  TDF_SHOW_PROGRESS_BAR               = $0200;
+  TDF_SHOW_MARQUEE_PROGRESS_BAR       = $0400;
+  TDF_CALLBACK_TIMER                  = $0800;
+  TDF_POSITION_RELATIVE_TO_WINDOW     = $1000;
+  TDF_RTL_LAYOUT                      = $2000;
+  TDF_NO_DEFAULT_RADIO_BUTTON         = $4000;
+  TDF_CAN_BE_MINIMIZED                = $8000;
+
+type
+  TASKDIALOG_FLAGS = Integer;                         // Note: _TASKDIALOG_FLAGS is an int
+
+  // _TASKDIALOG_MESSAGES enum
+const
+  TDM_NAVIGATE_PAGE                   = WM_USER+101;
+  TDM_CLICK_BUTTON                    = WM_USER+102; // wParam = Button ID
+  TDM_SET_MARQUEE_PROGRESS_BAR        = WM_USER+103; // wParam = 0 (nonMarque) wParam != 0 (Marquee)
+  TDM_SET_PROGRESS_BAR_STATE          = WM_USER+104; // wParam = new progress state
+  TDM_SET_PROGRESS_BAR_RANGE          = WM_USER+105; // lParam = MAKELPARAM(nMinRange, nMaxRange)
+  TDM_SET_PROGRESS_BAR_POS            = WM_USER+106; // wParam = new position
+  TDM_SET_PROGRESS_BAR_MARQUEE        = WM_USER+107; // wParam = 0 (stop marquee), wParam != 0 (start marquee), lparam = speed (milliseconds between repaints)
+  TDM_SET_ELEMENT_TEXT                = WM_USER+108; // wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR)
+  TDM_CLICK_RADIO_BUTTON              = WM_USER+110; // wParam = Radio Button ID
+  TDM_ENABLE_BUTTON                   = WM_USER+111; // lParam = 0 (disable), lParam != 0 (enable), wParam = Button ID
+  TDM_ENABLE_RADIO_BUTTON             = WM_USER+112; // lParam = 0 (disable), lParam != 0 (enable), wParam = Radio Button ID
+  TDM_CLICK_VERIFICATION              = WM_USER+113; // wParam = 0 (unchecked), 1 (checked), lParam = 1 (set key focus)
+  TDM_UPDATE_ELEMENT_TEXT             = WM_USER+114; // wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR)
+  TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE = WM_USER+115; // wParam = Button ID, lParam = 0 (elevation not required), lParam != 0 (elevation required)
+  TDM_UPDATE_ICON                     = WM_USER+116; // wParam = icon element (TASKDIALOG_ICON_ELEMENTS), lParam = new icon (hIcon if TDF_USE_HICON_* was set, PCWSTR otherwise)
+
+  // _TASKDIALOG_NOTIFICATIONS enum
+const
+  TDN_CREATED                         = 0;
+  TDN_NAVIGATED                       = 1;
+  TDN_BUTTON_CLICKED                  = 2;            // wParam = Button ID
+  TDN_HYPERLINK_CLICKED               = 3;            // lParam = (LPCWSTR)pszHREF
+  TDN_TIMER                           = 4;            // wParam = Milliseconds since dialog created or timer reset
+  TDN_DESTROYED                       = 5;
+  TDN_RADIO_BUTTON_CLICKED            = 6;            // wParam = Radio Button ID
+  TDN_DIALOG_CONSTRUCTED              = 7;
+  TDN_VERIFICATION_CLICKED            = 8;             // wParam = 1 if checkbox checked, 0 if not, lParam is unused and always 0
+  TDN_HELP                            = 9;
+  TDN_EXPANDO_BUTTON_CLICKED          = 10;           // wParam = 0 (dialog is now collapsed), wParam != 0 (dialog is now expanded)
+
+type
+  _TASKDIALOG_BUTTON = packed record
+      nButtonID: Integer;
+      pszButtonText: PCWSTR;
+  end;
+  TASKDIALOG_BUTTON = _TASKDIALOG_BUTTON;
+  TTASKDIALOG_BUTTON = TASKDIALOG_BUTTON;
+  PTASKDIALOG_BUTTON = ^TASKDIALOG_BUTTON;
+
+  // _TASKDIALOG_ELEMENTS enum
+const
+  TDE_CONTENT              = 0;
+  TDE_EXPANDED_INFORMATION = 1;
+  TDE_FOOTER               = 2;
+  TDE_MAIN_INSTRUCTION     = 3;
+
+  // _TASKDIALOG_ICON_ELEMENTS enum
+  TDIE_ICON_MAIN   = 0;
+  TDIE_ICON_FOOTER = 1;
+
+  TD_WARNING_ICON         = MAKEINTRESOURCEW(Word(-1));
+  TD_ERROR_ICON           = MAKEINTRESOURCEW(Word(-2));
+  TD_INFORMATION_ICON     = MAKEINTRESOURCEW(Word(-3));
+  TD_SHIELD_ICON          = MAKEINTRESOURCEW(Word(-4));
+  TD_SHIELD_GRADIENT_ICON = MAKEINTRESOURCEW(Word(-5));
+  TD_SHIELD_WARNING_ICON  = MAKEINTRESOURCEW(Word(-6));
+  TD_SHIELD_ERROR_ICON    = MAKEINTRESOURCEW(Word(-7));
+  TD_SHIELD_OK_ICON       = MAKEINTRESOURCEW(Word(-8));
+  TD_SHIELD_GRAY_ICON     = MAKEINTRESOURCEW(Word(-9));
+
+  // _TASKDIALOG_COMMON_BUTTON_FLAGS enum
+  TDCBF_OK_BUTTON            = $0001; // selected control return value IDOK
+  TDCBF_YES_BUTTON           = $0002; // selected control return value IDYES
+  TDCBF_NO_BUTTON            = $0004; // selected control return value IDNO
+  TDCBF_CANCEL_BUTTON        = $0008; // selected control return value IDCANCEL
+  TDCBF_RETRY_BUTTON         = $0010; // selected control return value IDRETRY
+  TDCBF_CLOSE_BUTTON         = $0020; // selected control return value IDCLOSE
+
+type
+  TASKDIALOG_COMMON_BUTTON_FLAGS = Integer;           // Note: _TASKDIALOG_COMMON_BUTTON_FLAGS is an int
+
+  _TASKDIALOGCONFIG = packed record
+    cbSize: UINT;
+    hwndParent: HWND;
+    hInstance: HINST;                                 // used for MAKEINTRESOURCE() strings
+    dwFlags: TASKDIALOG_FLAGS;                        // TASKDIALOG_FLAGS (TDF_XXX) flags
+    dwCommonButtons: TASKDIALOG_COMMON_BUTTON_FLAGS;  // TASKDIALOG_COMMON_BUTTON (TDCBF_XXX) flags
+    pszWindowTitle: PCWSTR;                           // string or MAKEINTRESOURCE()
+    case PtrInt of
+      0: (hMainIcon: HICON);
+      1: (
+        pszMainIcon: PCWSTR;
+        pszMainInstruction: PCWSTR;
+        pszContent: PCWSTR;
+        cButtons: UINT;
+        pButtons: PTASKDIALOG_BUTTON;
+        nDefaultButton: Integer;
+        cRadioButtons: UINT;
+        pRadioButtons: PTASKDIALOG_BUTTON;
+        nDefaultRadioButton: Integer;
+        pszVerificationText: PCWSTR;
+        pszExpandedInformation: PCWSTR;
+        pszExpandedControlText: PCWSTR;
+        pszCollapsedControlText: PCWSTR;
+        case PtrInt of
+          0: (hFooterIcon: HICON);
+          1: (
+            pszFooterIcon: PCWSTR;
+            pszFooter: PCWSTR;
+            pfCallback: PFTASKDIALOGCALLBACK;
+            lpCallbackData: LONG_PTR;
+            cxWidth: UINT;                                // width of the Task Dialog's client area in DLU's. If 0, Task Dialog will calculate the ideal width.
+          );
+      );
+  end;
+  TASKDIALOGCONFIG = _TASKDIALOGCONFIG;
+  PTASKDIALOGCONFIG = ^TASKDIALOGCONFIG;
+  TTASKDIALOGCONFIG = TASKDIALOGCONFIG;
+
+var
+  TaskDialogIndirect: function(const pTaskConfig: PTASKDIALOGCONFIG; pnButton: PInteger; pnRadioButton: PInteger; pfVerificationFlagChecked: PBOOL): HRESULT; stdcall;
+  TaskDialog: function(hwndParent: HWND; hInstance: HINST; pszWindowTitle: PCWSTR; pszMainInstruction: PCWSTR; pszContent: PCWSTR;
+      dwCommonButtons: TASKDIALOG_COMMON_BUTTON_FLAGS; pszIcon: PCWSTR; pnButton: PInteger): HRESULT; stdcall;
+
+
+// ==================== End TaskDialog =======================
+
 implementation
+
+const
+  comctl32lib = 'comctl32.dll';
+
+var
+  comctl32handle: THandle = 0;
+
+function _TaskDialogIndirect(const pTaskConfig: PTASKDIALOGCONFIG; pnButton: PInteger; pnRadioButton: PInteger; pfVerificationFlagChecked: PBOOL): HRESULT; stdcall;
+begin
+  Result := E_NOTIMPL;
+end;
+
+function _TaskDialog(hwndParent: HWND; hInstance: HINST; pszWindowTitle: PCWSTR; pszMainInstruction: PCWSTR; pszContent: PCWSTR;
+    dwCommonButtons: TASKDIALOG_COMMON_BUTTON_FLAGS; pszIcon: PCWSTR; pnButton: PInteger): HRESULT; stdcall;
+begin
+  Result := E_NOTIMPL;
+end;
+
+procedure Initialize;
+var
+  p: Pointer;
+begin
+  // Defaults
+  Pointer(TaskDialogIndirect) := @_TaskDialogIndirect;
+  Pointer(TaskDialog) := @_TaskDialog;
+
+  comctl32handle := LoadLibrary(comctl32lib);
+  if comctl32handle <> 0 then
+  begin
+    p := GetProcAddress(comctl32handle, 'TaskDialogIndirect');
+    if p <> nil
+    then Pointer(TaskDialogIndirect) := p;
+
+    p := GetProcAddress(comctl32handle, 'TaskDialog');
+    if p <> nil
+    then Pointer(TaskDialog) := p;
+  end;
+end;
+
+procedure Finalize;
+begin
+  if comctl32handle <> 0 then
+    FreeLibrary(comctl32handle);
+  comctl32handle := 0;
+end;
+
+initialization
+  Initialize;
+Finalization
+  Finalize;  
 end.