2012-04-29 97 views
2

我使用的需求,以合作形式的处理多个WINAPI功能,由于其当VCL风格改变许多调用这些函数形式的手柄被重建停止工作。所以,我需要一种方法来检测在当前VCL风格,以更新这些functions.The问题的呼吁修改(改变)是How detect when a vcl style is changed?如何检测vcl样式何时更改?

+3

表单可能因其他原因而重新创建。对于更安全的方法,您可以重写'CreateWindowHandle'。 –

+1

虽然RRUZ回答了这个问题,但Sertac实际上解决了根本问题。 –

回答

8

当VCL风格通过TStyleManager.SetStyle方法发送CM_CUSTOMSTYLECHANGED消息改变该应用程序的所有形式,那么messgae在形式的WndProc方法处理,然后被发送CM_STYLECHANGED消息通知该VCL风格已经改变,所以你可以听的CM_STYLECHANGED消息时VCL风格具有检测改变。

试试这个示例代码。

type 
    TForm17 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; 
    public 
    { Public declarations } 
    end; 

var 
    Form17: TForm17; 

implementation 

uses 
Vcl.Themes; 

{$R *.dfm} 

procedure TForm17.Button1Click(Sender: TObject); 
begin 
    TStyleManager.SetStyle('Carbon'); 
end; 

procedure TForm17.CMStyleChanged(var Message: TMessage); 
begin 
    ShowMessage('The vcl style has changed'); 
end; 

end.