|
@@ -9922,6 +9922,152 @@ Function LoadIconWithScaleDown( hinst:HINST; pszName:LPCWStr;cx:cint;cy:cint;var
|
|
|
function DrawShadowText(hdc:HDC;pszText:LPCWSTR;cch:UINT;prc:PRECT;dwFlags:DWORD;crText:COLORREF;crShadow:COLORREF;ixOffset:cint;iyOffset:cint):cint; stdcall; external commctrldll name 'DrawShadowText';
|
|
|
{$ENDIF}
|
|
|
|
|
|
+// ===================== 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
|
|
|
|
|
@@ -13552,4 +13698,53 @@ begin
|
|
|
Result:=HFONT(SendMessage(hdp, DTM_GETMCFONT, 0, 0));
|
|
|
end;
|
|
|
|
|
|
+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.
|