2014-02-16 24 views
2

我正在使用Inno Setup(Unicode)和一组我在Delphi XE2中编写的DLL。该DLL具有在安装向导/进度期间显示的VCL表单。如何将VCL样式应用于Inno安装程序中基于DLL的表单?

我在我的Inno Setup安装程序中试用过implementing VCL Styles。一切都很好,除了在这些DLL中创建的表单。有些形式是皮肤,但不是所有的...

Partial Skin

正如你可以看到,表格的背景色,列表视图背景颜色和字体颜色都变了。但是,列表视图标题,进度条和表单的边框仍旧是旧样式。

如何让这些DLL中的窗体显示正确的样式?

+0

实际上,我猜,我有通过将风格的文件名到它加载这个样式文件到每个DLL,使用例如像'ApplyVclStyle导出程序(const的文件名:WideS tring);' –

+0

该插件只能对inno setup创建的表单和控件进行皮肤处理。对于你的DLL的形式,你必须像你在评论中所说的那样加载VCL样式。 – RRUZ

回答

4

Inno Setup的VCL样式插件仅用于在Inno Setup中的窗体和控件上绘制样式。为了获得这些DLL的形式来剥皮,你需要导出从DLL中的函数,Inno Setup的可以在文件传递...

Inno Setup的

[Code] 
#define public VclStyleFile "Carbon (2).vsf" 

procedure DllLoadStyle(const StyleFilename: WideString); 
    external '[email protected] stdcall'; 

function InitializeSetup: Boolean; 
begin 
    ExtractTemporaryFile('{#VclStyleFile}'); 
    LoadVCLStyleW(ExpandConstant('{tmp}\{#VclStyleFile}')); 
    DllInit; //Presumed your DLL needs to initialize/instantiate the form 
    DllLoadStyle(ExpandConstant('{tmp}\{#VclStyleFile}')); 
    ... 
end; 

德尔福DLL

uses 
    Vcl.Themes, 

procedure DllLoadStyle(const StyleFilename: WideString); stdcall; 
begin 
    TStyleManager.SetStyle(TStyleManager.LoadFromFile(StyleFilename)) 
end; 

exports 
    DllLoadStyle; 
+0

OT:你不需要扩展你的预处理器变量,除非它们的值中包含一些Inno Setup常量(你需要扩展它们)。预处理器只是将变量的值发送给脚本。所以'ExtractTemporaryFile'函数调用中的'ExpandConstant'函数完全没有任何作用。 – TLama

+1

@TLama我看到了,感谢指针! –

相关问题