找出Inno Setup WizardForm Caption字体大小,字体名称和字体颜色,并将WizardForm标题置于中心

时间:2016-10-03 12:12:23

标签: inno-setup caption pascalscript

我需要找到Inno Setup Font.Color的{​​{1}},Font.SizeFont.Name,以使用{{1}来获取它(它是一个字符串)的范围点}}。

请让我知道如何找到WizardForm的上述属性。 (不是系统字体属性)。我想根据我正在使用的.cjstyles Skin获取当前的WizardForm字体信息。

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

先谢谢。

2 个答案:

答案 0 :(得分:2)

我认为这不可能。

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

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

答案 1 :(得分:1)

WizardForm的Window Title属性由ISSkin.DLL根据您的Visual Styles Skin在内部加载。因此,如果在控制面板的高级外观设置中配置了任何窗口标题的系统度量标准用户,请执行以下操作:

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

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

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);

您在此处提供的.INI文件几乎包含有关如何从存储在皮肤文件中的Bitmpas等资源加载Skin的所有信息。

但是,您可以使用两个不同的选项来集中WizardForm标题。

使用资源黑客:

使用Resource Hacker,可以非常轻松地将Skin的窗口标题(标题)对齐设置为中心。

1.使用Resource Hacker打开您的视觉样式皮肤(.cjstyles或.msstyles)文件,并查找名为TEXTFILE的资源组。

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

例如,如果您的皮肤文件名称为Elegance.cjstyles,则具有正常颜色方案的.INI文件应该类似于NORMALELEGANCE_INI或包含单词NORMAL的内容。

3.在内部文本编辑器中打开此.INI文件随Resource Hacker一起找到如下所示的行Window.Caption

enter image description here

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

现在,在ISSkin.DLL加载外观之后,向导的窗口标题应该居中。

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

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

您可以通过在其正面添加空格来居中使用WizardForm标题。(但不推荐。)

这样的代码可以满足您的需求。

[Code]
Type
  TSize = Record
    cx, cy: Integer;
end;

function GetTextExtentPoint32(hdc: THandle; s: string; c: Integer; var Size: TSize): Boolean;
    external 'GetTextExtentPoint32W@Gdi32.dll stdcall';
function GetDC(hWnd: THandle): THandle;
    external 'GetDC@User32.dll stdcall';
function SelectObject(hdc: THandle; hgdiobj: THandle): THandle;
    external 'SelectObject@Gdi32.dll stdcall';

function AlignStringToCenter(S: String; const FontName: String; const MaxWidth, FontSize: Integer): String;
var
  SWidth, SX, NSWidth: Integer;
  SFont, SHandle: THandle;
  StringModifier: TNewStaticText;
  StringDimensions: TSize;
  SHandleEx: TForm;
begin
  if S = '' then
    RaiseException('The specified Caption is an empty String')
  else begin
    Try
      SHandleEx := TForm.Create(nil);
      StringModifier := TNewStaticText.Create(SHandleEx);
      StringModifier.Font.Name := FontName;
      StringModifier.Font.Size := FontSize;
      StringModifier.Parent := SHandleEx;
      SX := 0;
      StringModifier.Caption := S;
      SHandle := GetDC(StringModifier.Handle);
      SFont := SelectObject(SHandle, StringModifier.Font.Handle);
      GetTextExtentPoint32(SHandle, StringModifier.Caption, Length(StringModifier.Caption), StringDimensions);
      SelectObject(SHandle, SFont);
      SWidth := StringDimensions.cx;
      Repeat
        Insert(' ', S, SX);
        StringModifier.Caption := S;
        Result := S;
        SHandle := GetDC(StringModifier.Handle);
        SFont := SelectObject(SHandle, StringModifier.Font.Handle);
        GetTextExtentPoint32(SHandle, StringModifier.Caption, Length(StringModifier.Caption), StringDimensions);
        SelectObject(SHandle, SFont);
        NSWidth := StringDimensions.cx;
        SX := SX + 1;
      Until (NSWidth - SWidth) >= (MaxWidth - NSWidth);
    Finally
      StringModifier.Caption := '';
      StringModifier.Free;
      SHandleEx.Free;
      SHandleEx.Close;
    end;
  end;
end;

上面的代码会在你想要居中的字符串前面添加空格,直到它在你给出的最大字符串宽度中正确居中,并输出带有添加空格的修改过的字符串。

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

用法:

如果要使用此功能将向导窗口标题居中,请使用它:

如果您不使用视觉样式皮肤:

[Code]
Const
  SM_CYSIZEFRAME = 33;
  SM_CXSMICON = 49;

function GetSystemMetrics(nIndex : Integer): Integer;  
  external 'GetSystemMetrics@User32 stdcall';

procedure InitializeWizard;
begin
  { MaxWidth = WizardForm.Width - 2 * (WizardForm.FrameWidth + WizardForm.SmallIconWidth + WizardForm.CaptionLeft + WizardForm.CaptionRight) }
  WizardForm.Caption := AlignStringToCenter(WizardForm.Caption, 'Segoe UI', WizardForm.Width - (2 * (GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXSMICON) + 10 + 10)), 9);
end;

如果您使用视觉样式皮肤:

[Code]
Const
  SM_CYSIZEFRAME = 33;
  SM_CXSMICON = 49;

function GetSystemMetrics(nIndex : Integer): Integer;  
  external 'GetSystemMetrics@User32 stdcall';

procedure InitializeWizard;
begin
  { MaxWidth = WizardForm.Width - 2 * (WizardForm.FrameWidth + WizardForm.SmallIconWidth + WizardForm.CaptionLeft + WizardForm.CaptionRight) }
  WizardForm.Caption := AlignStringToCenter('Setup - {#MyAppName}', 'Window Title Font Name of your Visual Styles Skin', WizardForm.Width - (2 * (GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXSMICON) + 10 + 10)), Window Title Font Size of your Visual Styles Skin);
end;

居中向导窗口标题:

enter image description here

但是,使用上述功能对中心向导窗口标题(通过添加空格进行黑客攻击)会在Windows任务栏工具提示中导致以下不良影响:

enter image description here

注意:如果您使用视觉样式皮肤,WizardForm.CaptionLeft和CaptionRight应根据您的视觉样式皮肤的左标题边距的大小而变化。