当前位置: 首页 > 知识库问答 >
问题:

找出Inno Setup Wizardform字幕字体大小、字体名称和字体颜色,并将Wizardform字幕居中

司空皓
2023-03-14

我需要找到< code >字体是什么。颜色,< code >字体。大小和< code >字体。Inno Setup 向导表单的名称。Caption使用< code > gettextextendpoint 32 获取其(它是一个字符串)范围点。

请告诉我如何找到WizardForm的上述属性。(不是系统字体属性)。我想根据。我正在使用的皮肤。

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

感谢提前。

共有2个答案

穆高澹
2023-03-14

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

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

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

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

您在这里提供的.INI文件几乎包含了有关如何从存储在Skin文件中的资源(如Bitmpas)加载Skin的所有信息。

但是,您可以使用两种不同的选项使向导窗体标题居中。

使用资源黑客:

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

1.打开您的视觉样式皮肤(。cjstyles或者。msstyles)文件,并查找名为< code>TEXTFILE的资源组。

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

例如,如果蒙皮文件名为“优雅”。cjstyles,具有Normal配色方案的.INI文件应类似于NORMALELEGANCE_INI或包含单词Normal的内容。

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

4.并确保其Content的对齐设置为Center。如果默认不是,请将其更改为Center

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

注意:这种居中不准确,因为居中是在字幕左侧和最小化按钮之间进行的,所以即使这样居中,字幕仍然可能靠近左侧。

使用Pascal脚本[Code]部分:

您可以通过在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;

居中向导窗口标题:

但是,使用上述函数居中向导窗口标题(通过添加空格来破解它)会导致 Windows 任务栏工具提示中的以下不良影响:

注意:WizardForm。如果使用视觉样式外观,则CaptionLeft和CaptionRight应随视觉样式外观的左侧标题边距的大小而变化。

束高雅
2023-03-14

我认为这是不可能的。

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

ISSkin不导出任何函数来检索这些信息。

 类似资料:
  • 颜色 主导颜色 灰阶 字体 字体字号 图标 气泡菜单 组件内容 基础形态 容器 操作选项 选择浮层 顶部浮层 底部浮层 侧边浮层 示例 布局 标签选项 <!-- # 顶部导航栏 原生顶部导航栏 示例 个性定制 示例 --> Toast 单行展示 双行展示 状态提示 Dialog 弹窗属性 页面示例 Snackbar <!-- # 结果页面 布局 页面示例 组成结构 --> 布局 页面示例 类型 页

  • 这是我的代码。 当它读到。docx文件它有时会返回-1的字体大小和null的字体系列。 我知道这是因为它们是默认值,但我不想要-1和null,我只想要那个默认值的名称。 我怎么读呢?

  • 在CSS中,通过 font-size属性来设置元素中所包含文本的字体大小。如果一个元素没有显式定义font-size属性,则会自动继承父元素的 font-size属性的计算结果。 定义 font-size 时,可以使用预定义关键字、绝对尺寸、相对尺寸: 1)预定义关键字 预定义关键字有 xx-small、x-small、small、medium、large、x-large、xx-large,尺寸按

  • 增加字体大小的最佳方法是什么,使其占据整个屏幕的宽度,或者更确切地说是视图的宽度?gumroad使用的一个很好的例子是:https://gumroad.com/然而,他们似乎将其用作图像而非普通文本,是否可以仅使用普通文本?

  • 本文向大家介绍如何更改placeholder的字体颜色和大小?相关面试题,主要包含被问及如何更改placeholder的字体颜色和大小?时的应答技巧和注意事项,需要的朋友参考一下

  • 我需要将给定HTML的字体家族和字体大小更改为特定的字体家族和大小。(例如:Times New Romen,尺寸:12)你知道如何使用Htmlagilitypack来完成吗? 字体大小可以在给定的HTML中以多种方式定义。例如:使用,也使用样式标记。因此,我需要改变所有特定的字体大小。