You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Inno Setup:如何修改TInputFileWizardPage标签的字体颜色与样式

修改Inno Setup TInputFileWizardPage中提示文本的字体样式/颜色

首先明确:默认情况下,Inno Setup的TInputFileWizardPage通过Add方法添加的提示文本,是用封装好的标准静态控件显示的,没有直接提供属性让你修改字体颜色或样式。不过我们有两种可行的方案来实现你的需求,下面分别说明:

方案一:通过消息拦截自定义绘制控件

这种方法通过拦截向导窗体的WM_CTLCOLORSTATIC消息,对指定的提示文本控件进行自定义绘制,从而修改字体颜色和样式。

代码示例:

var
  PageFileSelect: TInputFileWizardPage;
  // 存储目标提示文本控件的句柄
  FilePromptLabel: THandle;

function CreateFileSelectPage(): String;
begin
  PageFileSelect := CreateInputFilePage(wpWelcome, 'Select File', 'Select File Location', 'Additional comments...');
  // 添加输入项
  PageFileSelect.Add('Font color or style change required...', 'test.exe', '*.exe');
  PageFileSelect.Values[0] := FileLocation;
  // 根据Inno Setup的控件命名规则,找到第0个输入项的提示标签句柄
  FilePromptLabel := PageFileSelect.Surface.FindChildTwinControl('Prompt', 0);
end;

// 重写向导窗体的窗口过程,处理控件绘制消息
function WizardFormWndProc(Window: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  DC: HDC;
  CustomFont: HFONT;
begin
  Result := DefWindowProc(Window, Msg, wParam, lParam);
  
  if Msg = WM_CTLCOLORSTATIC then
  begin
    // 判断当前控件是否是我们要修改的提示标签
    if lParam = FilePromptLabel then
    begin
      DC := wParam;
      // 设置文本颜色为红色
      SetTextColor(DC, RGB(255, 0, 0));
      // 设置背景透明,和向导页背景融合
      SetBkMode(DC, TRANSPARENT);
      
      // 创建一个加粗的字体替换原字体
      CustomFont := CreateFont(0, 0, 0, 0, FW_BOLD, False, False, False, DEFAULT_CHARSET,
        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
        DEFAULT_PITCH or FF_DONTCARE, 'Segoe UI');
      if CustomFont <> 0 then
      begin
        SelectObject(DC, CustomFont);
        DeleteObject(CustomFont); // 使用后销毁临时字体
      end;
      
      // 返回和向导页背景匹配的画刷(这里用白色,根据你的向导主题调整)
      Result := GetStockObject(WHITE_BRUSH);
    end;
  end;
end;

procedure InitializeWizard();
begin
  CreateFileSelectPage();
  // 替换向导窗体的窗口过程,让我们的消息处理生效
  WizardForm.OnWndProc := @WizardFormWndProc;
end;

说明

  • 我们通过PageFileSelect.Surface.FindChildTwinControl定位到目标提示标签,Inno Setup的输入页控件命名规则是Prompt加上输入项的索引,所以可以用这个方法精准找到。
  • 拦截WM_CTLCOLORSTATIC消息后,我们可以自由设置文本颜色、背景模式,甚至替换字体实现加粗/斜体效果。

方案二:替换默认控件为自定义静态文本

这种方法更直观:找到原来的提示标签,在相同位置创建一个自定义的TNewStaticText控件,设置好字体样式后隐藏原控件。

代码示例:

var
  PageFileSelect: TInputFileWizardPage;
  CustomPromptLabel: TNewStaticText;

function CreateFileSelectPage(): String;
var
  OriginalLabel: THandle;
  OriginalPos: TRect;
begin
  PageFileSelect := CreateInputFilePage(wpWelcome, 'Select File', 'Select File Location', 'Additional comments...');
  PageFileSelect.Add('Font color or style change required...', 'test.exe', '*.exe');
  PageFileSelect.Values[0] := FileLocation;
  
  // 获取原提示标签的句柄和位置
  OriginalLabel := PageFileSelect.Surface.FindChildTwinControl('Prompt', 0);
  GetWindowRect(OriginalLabel, OriginalPos);
  // 将屏幕坐标转换为向导页的客户区坐标
  ScreenToClient(PageFileSelect.Surface.Handle, OriginalPos.TopLeft);
  ScreenToClient(PageFileSelect.Surface.Handle, OriginalPos.BottomRight);
  
  // 创建自定义静态文本控件
  CustomPromptLabel := TNewStaticText.Create(WizardForm);
  CustomPromptLabel.Parent := PageFileSelect.Surface;
  // 复制原控件的位置和尺寸
  CustomPromptLabel.Left := OriginalPos.Left;
  CustomPromptLabel.Top := OriginalPos.Top;
  CustomPromptLabel.Width := OriginalPos.Right - OriginalPos.Left;
  CustomPromptLabel.Height := OriginalPos.Bottom - OriginalPos.Top;
  // 设置文本内容
  CustomPromptLabel.Caption := 'Font color or style change required...';
  
  // 自定义字体样式:加粗、红色,匹配Inno默认字体
  CustomPromptLabel.Font.Style := [fsBold];
  CustomPromptLabel.Font.Color := clRed;
  CustomPromptLabel.Font.Name := 'Segoe UI';
  CustomPromptLabel.Font.Size := 9;
  
  // 隐藏原来的提示标签
  ShowWindow(OriginalLabel, SW_HIDE);
end;

procedure InitializeWizard();
begin
  CreateFileSelectPage();
end;

说明

  • 这种方法不需要处理复杂的消息,直接替换控件即可,适合只需要修改字体颜色、加粗/斜体这类简单需求的场景。
  • 新控件的位置和尺寸完全复制原控件,不会破坏向导页的布局。

总结

如果只是简单修改字体样式和颜色,方案二更易实现和维护;如果需要更复杂的自定义绘制逻辑(比如渐变颜色、动态样式变化),方案一的灵活性更高。

内容的提问来源于stack exchange,提问作者DeeJay007

火山引擎 最新活动