Inno setup 查找Inno Setup WizardForm标题字体大小、字体名称和字体颜色,并将WizardForm标题居中

Inno setup 查找Inno Setup WizardForm标题字体大小、字体名称和字体颜色,并将WizardForm标题居中,inno-setup,caption,pascalscript,Inno Setup,Caption,Pascalscript,我需要找到Inno SetupWizardForm.Caption的Font.Color、Font.Size和Font.Name是什么,以使用GetTextExtentPoint32获取其(它是一个字符串)扩展点 请告诉我如何找到WizardForm的上述属性。(不是系统字体属性)。我想根据我使用的.cjstyles外观获取WizardForm的当前字体信息 我还想知道,在了解了这些字体信息之后,如何使用Pascal脚本将向导窗口标题居中 提前谢谢。我认为这是不可能的 窗口标题由ISSkin D

我需要找到Inno Setup
WizardForm.Caption的
Font.Color
Font.Size
Font.Name
是什么,以使用
GetTextExtentPoint32
获取其(它是一个字符串)扩展点

请告诉我如何找到WizardForm的上述属性。(不是系统字体属性)。我想根据我使用的.cjstyles外观获取WizardForm的当前字体信息

我还想知道,在了解了这些字体信息之后,如何使用Pascal脚本将向导窗口标题居中


提前谢谢。

我认为这是不可能的

窗口标题由ISSkin DLL自定义绘制。因此Windows不知道字体大小,因此无法使用Windows API


ISSkin不会导出任何函数来检索此信息。

WizardForm的窗口标题属性由ISSkin.DLL根据您的视觉样式皮肤在内部加载。所以,如果用户在控制面板的高级外观设置中配置了窗口标题的任何系统指标,如:

窗口标题-字体名称
Segoe UI
和字体大小
10

加载指定的视觉样式时,所有这些都将被ISSKin.DLL覆盖,因为它在其.INI文件中具有不同的字体和字体大小配置,其由函数
LoadSkin
加载,如下所示

procedure-LoadSkin(lpszPath:String;lpszIniFileName:String);
您在这里提供的.INI文件几乎包含了有关如何从存储在Skin文件中的bitmpa等资源加载Skin的所有信息


但是,您可以使用两个不同的选项将向导表单标题居中

使用资源黑客:

使用资源黑客,可以很容易地将皮肤的窗口标题(标题)对齐设置为中心

1.使用资源黑客打开视觉样式外观(.cjstyles或.msstyles)文件,并查找名为
TEXTFILE
的资源组

2.展开它并根据ISSkin.dll默认加载的配色方案查找.INI文件。在大多数情况下,如果系统字体大小为100%(默认),则应为正常配色方案。因此,单击.INI文件,该文件的名称中包含单词NORMAL,如下所示:

例如,如果您的皮肤文件名为
ele雅.cjstyles
,则具有正常配色方案的.INI文件应类似于
normalele雅_INI
或包含单词
Normal
的文件

3.在Resource Hacker自带的内部文本编辑器中打开此.INI文件,找到行
窗口。标题
如下所示:

4.并确保其
ContentAlignment
设置为
Center
。如果默认情况下不是,请将其更改为
Center

现在,向导的窗口标题应该在皮肤被ISSkin.DLL加载后居中

注意:此居中不准确,因为居中是在标题左侧和最小化按钮之间进行的,因此即使以这种方式居中,标题仍可能靠近左侧


使用Pascal脚本[代码]部分:

您可以通过在向导窗体标题的前面添加空格来居中显示标题。(但不建议这样做。)

这样的代码可以满足您的需要

[代码]
类型
TSize=记录
cx,cy:整数;
结束;
函数GetTextExtentPoint32(hdc:THandle;s:string;c:Integer;变量大小:TSize):布尔;
外部的GetTextExtentPoint32W@Gdi32.dllstdcall';
函数GetDC(hWnd:THandle):THandle;
外部的GetDC@User32.dllstdcall';
function SelectObject(hdc:THandle;hgdiobj:THandle):THandle;
外部的SelectObject@Gdi32.dllstdcall';
函数AlignStringToCenter(S:String;常量FontName:String;常量MaxWidth,FontSize:Integer):字符串;
变量
SWidth、SX、NSWidth:整数;
山德尔:山德尔;
StringModifier:TNewStaticText;
尺寸:t尺寸;
shandlex:TForm;
开始
如果S='',那么
RaiseException('指定的标题为空字符串')
否则开始
尝试
shandlex:=TForm.Create(nil);
StringModifier:=TNewStaticText.Create(shandlex);
StringModifier.Font.Name:=FontName;
StringModifier.Font.Size:=FontSize;
StringModifier.Parent:=shandlex;
SX:=0;
StringModifier.Caption:=S;
SHandle:=GetDC(StringModifier.Handle);
SFont:=SelectObject(SHandle、StringModifier.Font.Handle);
GetTextExtentPoint32(SHandle,StringModifier.Caption,长度(StringModifier.Caption),StringDimensions);
选择对象(SHandle、SFont);
SWidth:=StringDimensions.cx;
重复
插入(“”、S、SX);
StringModifier.Caption:=S;
结果:=S;
SHandle:=GetDC(StringModifier.Handle);
SFont:=SelectObject(SHandle、StringModifier.Font.Handle);
GetTextExtentPoint32(SHandle,StringModifier.Caption,长度(StringModifier.Caption),StringDimensions);
选择对象(SHandle、SFont);
NSWidth:=StringDimensions.cx;
SX:=SX+1;
直到(NSWidth-SWidth)>=(MaxWidth-NSWidth);
最后
StringModifier.标题:='';
免费的;
Shandlex.Free;
shandlex.Close;
结束;
结束;
结束;
上面的代码一直在要居中的字符串前面添加空格,直到它在给定的最大字符串宽度中正确居中为止,并输出添加空格的修改字符串

注意:此处的
MaxWidth
参数应该是要将字符串居中的宽度。宽度大于此处指定宽度的字符串无法正确居中。使用上述功能,不需要视觉样式外观来居中向导窗口标题

用法:

如果要使用此功能将向导风居中