mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 19:19:19 +02:00
CustomDrawn-Windows: Fixes endless loop in PromptUser
git-svn-id: trunk@48831 -
This commit is contained in:
parent
929fbbbbf6
commit
4a4b47c394
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -6826,6 +6826,7 @@ lcl/interfaces/customdrawn/cocoagdiobjects.pas svneol=native#text/pascal
|
|||||||
lcl/interfaces/customdrawn/cocoautils.pas svneol=native#text/pascal
|
lcl/interfaces/customdrawn/cocoautils.pas svneol=native#text/pascal
|
||||||
lcl/interfaces/customdrawn/customdrawn_androidproc.pas svneol=native#text/pascal
|
lcl/interfaces/customdrawn/customdrawn_androidproc.pas svneol=native#text/pascal
|
||||||
lcl/interfaces/customdrawn/customdrawn_cocoaproc.pas svneol=native#text/plain
|
lcl/interfaces/customdrawn/customdrawn_cocoaproc.pas svneol=native#text/plain
|
||||||
|
lcl/interfaces/customdrawn/customdrawn_winextra.pas svneol=native#text/pascal
|
||||||
lcl/interfaces/customdrawn/customdrawn_winproc.pas svneol=native#text/pascal
|
lcl/interfaces/customdrawn/customdrawn_winproc.pas svneol=native#text/pascal
|
||||||
lcl/interfaces/customdrawn/customdrawn_x11proc.pas svneol=native#text/pascal
|
lcl/interfaces/customdrawn/customdrawn_x11proc.pas svneol=native#text/pascal
|
||||||
lcl/interfaces/customdrawn/customdrawndefines.inc svneol=native#text/pascal
|
lcl/interfaces/customdrawn/customdrawndefines.inc svneol=native#text/pascal
|
||||||
|
1102
lcl/interfaces/customdrawn/customdrawn_winextra.pas
Normal file
1102
lcl/interfaces/customdrawn/customdrawn_winextra.pas
Normal file
File diff suppressed because it is too large
Load Diff
@ -30,7 +30,7 @@ uses
|
|||||||
// XML
|
// XML
|
||||||
XMLRead, Dom,
|
XMLRead, Dom,
|
||||||
// Platform specific
|
// Platform specific
|
||||||
{$ifdef CD_Windows}Windows, customdrawn_WinProc,{$endif}
|
{$ifdef CD_Windows}Windows, customdrawn_WinProc, customdrawn_winextra,{$endif}
|
||||||
{$ifdef CD_Cocoa}MacOSAll, CocoaAll, customdrawn_cocoaproc, CocoaGDIObjects,Types,{$endif}
|
{$ifdef CD_Cocoa}MacOSAll, CocoaAll, customdrawn_cocoaproc, CocoaGDIObjects,Types,{$endif}
|
||||||
{$ifdef CD_X11}X, XLib, XUtil, BaseUnix, customdrawn_x11proc,{$ifdef CD_UseNativeText}xft, fontconfig,{$endif}{$endif}
|
{$ifdef CD_X11}X, XLib, XUtil, BaseUnix, customdrawn_x11proc,{$ifdef CD_UseNativeText}xft, fontconfig,{$endif}{$endif}
|
||||||
{$ifdef CD_Android}
|
{$ifdef CD_Android}
|
||||||
@ -48,7 +48,7 @@ uses
|
|||||||
// LCL
|
// LCL
|
||||||
customdrawn_common, customdrawncontrols, customdrawndrawers,
|
customdrawn_common, customdrawncontrols, customdrawndrawers,
|
||||||
lazcanvas, lazregions, lazdeviceapis,
|
lazcanvas, lazregions, lazdeviceapis,
|
||||||
InterfaceBase, Themes,
|
InterfaceBase, Themes, Dialogs, Buttons,
|
||||||
Controls, Forms, lclproc, IntfGraphics, GraphType,
|
Controls, Forms, lclproc, IntfGraphics, GraphType,
|
||||||
LCLType, LMessages, Graphics, LCLStrConsts, Menus, LazLoggerBase;
|
LCLType, LMessages, Graphics, LCLStrConsts, Menus, LazLoggerBase;
|
||||||
|
|
||||||
|
@ -125,9 +125,91 @@ function TCDWidgetSet.PromptUser(const DialogCaption : string;
|
|||||||
ButtonCount : LongInt;
|
ButtonCount : LongInt;
|
||||||
DefaultIndex : LongInt;
|
DefaultIndex : LongInt;
|
||||||
EscapeResult : LongInt) : LongInt;
|
EscapeResult : LongInt) : LongInt;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Caption: String;
|
||||||
|
TaskConfig: TTASKDIALOGCONFIG;
|
||||||
|
DialogButtons: PTASKDIALOG_BUTTON;
|
||||||
|
State: TApplicationState;
|
||||||
begin
|
begin
|
||||||
Result := 0;
|
//TaskDialogIndirect is available in Vista and up, but only if app was built with manifest.
|
||||||
Application.MessageBox(PChar(DialogMessage), PChar(DialogCaption), MB_OK);
|
//The check for the latter is done by checking for ComCtlVersionIE6 (which is set in the manifest)
|
||||||
|
//The availability of TaskDialogIndirect does not depend on the status of ThemeServices
|
||||||
|
//Issue #0027664
|
||||||
|
if (WindowsVersion >= wvVista) and (GetFileVersion(comctl32) >= ComCtlVersionIE6) then
|
||||||
|
begin
|
||||||
|
FillChar(TaskConfig, SizeOf(TaskConfig), 0);
|
||||||
|
TaskConfig.cbSize := SizeOf(TaskConfig);
|
||||||
|
// if we skip hwndParent our form will be a root window - with the taskbar item and icon
|
||||||
|
// this is unwanted
|
||||||
|
if Assigned(Screen.ActiveCustomForm) then
|
||||||
|
TaskConfig.hwndParent := Screen.ActiveCustomForm.Handle
|
||||||
|
else
|
||||||
|
if Assigned(Application.MainForm) then
|
||||||
|
TaskConfig.hwndParent := Application.MainFormHandle
|
||||||
|
else
|
||||||
|
TaskConfig.hwndParent := AppHandle;
|
||||||
|
TaskConfig.hInstance := HInstance;
|
||||||
|
TaskConfig.dwFlags := TDF_ALLOW_DIALOG_CANCELLATION;
|
||||||
|
if DialogCaption <> '' then
|
||||||
|
Caption := DialogCaption
|
||||||
|
else
|
||||||
|
case DialogType of
|
||||||
|
idDialogConfirm,
|
||||||
|
idDialogInfo,
|
||||||
|
idDialogWarning,
|
||||||
|
idDialogError: Caption := GetDialogCaption(DialogType);
|
||||||
|
else
|
||||||
|
Caption := Application.Title;
|
||||||
|
end;
|
||||||
|
TaskConfig.pszWindowTitle := PWideChar(UTF8ToUTF16(Caption));
|
||||||
|
|
||||||
|
case DialogType of
|
||||||
|
idDialogConfirm:
|
||||||
|
begin
|
||||||
|
TaskConfig.hMainIcon := Windows.LoadIcon(0, IDI_QUESTION);
|
||||||
|
TaskConfig.dwFlags := TaskConfig.dwFlags or TDF_USE_HICON_MAIN;
|
||||||
|
end;
|
||||||
|
idDialogInfo: TaskConfig.pszMainIcon := TD_INFORMATION_ICON;
|
||||||
|
idDialogWarning: TaskConfig.pszMainIcon := TD_WARNING_ICON;
|
||||||
|
idDialogError: TaskConfig.pszMainIcon := TD_ERROR_ICON;
|
||||||
|
idDialogShield: TaskConfig.pszMainIcon := TD_SHIELD_ICON;
|
||||||
|
else
|
||||||
|
TaskConfig.dwFlags := TaskConfig.dwFlags or TDF_USE_HICON_MAIN;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TaskConfig.pszContent := PWideChar(UTF8ToUTF16(DialogMessage));
|
||||||
|
|
||||||
|
TaskConfig.cButtons := ButtonCount;
|
||||||
|
GetMem(DialogButtons, SizeOf(TTASKDIALOG_BUTTON) * ButtonCount);
|
||||||
|
for i := 0 to ButtonCount - 1 do
|
||||||
|
begin
|
||||||
|
DialogButtons[i].nButtonID := Buttons[i];
|
||||||
|
DialogButtons[i].pszButtonText := UTF8StringToPWideChar(GetButtonCaption(Buttons[i]));
|
||||||
|
end;
|
||||||
|
TaskConfig.pButtons := DialogButtons;
|
||||||
|
//we need idButtonXX value
|
||||||
|
if DefaultIndex < ButtonCount then
|
||||||
|
TaskConfig.nDefaultButton := Buttons[DefaultIndex]
|
||||||
|
else
|
||||||
|
TaskConfig.nDefaultButton := 0;
|
||||||
|
|
||||||
|
State := SaveApplicationState;
|
||||||
|
try
|
||||||
|
Result := IDCANCEL;
|
||||||
|
TaskDialogIndirect(@TaskConfig, @Result, nil, nil);
|
||||||
|
if Result = IDCANCEL then
|
||||||
|
Result := EscapeResult;
|
||||||
|
finally
|
||||||
|
RestoreApplicationState(State);
|
||||||
|
for i := 0 to ButtonCount - 1 do
|
||||||
|
FreeMem(DialogButtons[i].pszButtonText);
|
||||||
|
FreeMem(DialogButtons);
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := inherited PromptUser(DialogCaption, DialogMessage, DialogType,
|
||||||
|
Buttons, ButtonCount, DefaultIndex, EscapeResult);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user