我们有一个Delphi应用程序,它在单独的(非UI)线程中使用WinAPI显示对话框。它工作正常。现在我们要将VCL样式应用于此应用程序。但样式只适用于UI线程中的表单,而不适用于其他线程中的对话框。即使我在其他线程中显示对话框之前调用了TStyleManager.SetStyle。如果我在UI线程中调用TStyleManager.SetStyle和DialogBoxParamW,则成功应用样式。是否有任何workaroud来强制VCL样式到在其他线程中创建的对话框?
简单示例:
procedure ApplyStyle;
begin
TStyleManager.SetStyle('Obsidian');
end;
function DialogProc(Dialog: HWnd; Msg: DWord; WParam: DWord;
LParam: integer): LongBool; stdcall;
begin
end;
procedure ShowDialog;
begin
DialogBoxParamW(hInstance, PChar('CUSTOM_DIALOG'), 0, @DialogProc, 0);
if GetLastError <> 0 then
ShowMessage(SysErrorMessage(GetLastError));
end;
type
TDialogThread = class(TThread)
public
procedure Execute; override;
end;
procedure TDialogThread.Execute;
begin
inherited;
ApplyStyle;
ShowDialog;
end;
// same thread
procedure TForm4.Button2Click(Sender: TObject);
begin
ApplyStyle;
ShowDialog;
end;
// other thread
procedure TForm4.Button3Click(Sender: TObject);
var
t: TDialogThread;
begin
t := TDialogThread.Create(True);
t.FreeOnTerminate := false;
t.Start;
end;