将VCL样式应用于在其他线程中创建的WinAPI对话框

时间:2018-03-08 06:47:08

标签: multithreading delphi winapi vcl-styles

我们有一个Delphi应用程序,它在单独的(非UI)线程中使用WinAPI显示对话框。它工作正常。现在我们要将VCL样式应用于此应用程序。但样式只适用于UI线程中的表单,而不适用于其他线程中的对话框。即使我在其他线程中显示对话框之前调用了TStyleManager.SetStyle。如果我在UI线程中调用TStyleManager.SetStyle和DialogBoxParamW,则成功应用样式。是否有任何workaroud来强制VCL样式到在其他线程中创建的对话框?

enter image description here

简单示例:

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;

0 个答案:

没有答案