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

关于Inno安装组件的详细描述

柯鸿云
2023-03-14

我正在使用Inno Setup构建安装,我正在使用组件部分允许最终用户选择要安装的可选项目。

其中一些项目需要更长的描述,以便用户有足够的信息来智能地选择它们。

有没有办法在某处添加更深入的描述?

共有2个答案

鲁涵意
2023-03-14

使用这个高级编译器(下载链接在下面的某处)。

它支持比标准编译器更多的类和事件。您可以访问属性“OnItemM先是移动”。使用它,您可以存储标签显示的每个项目的描述。这是一个例子:

var
CompLabel: TLabel;

procedure OnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  case Index of
    0: CompLabel.Caption := 'This is the description of Component 1';
    1: CompLabel.Caption := 'This is the description of Component 2';
    2: CompLabel.Caption := 'This is the description of Component 3';
    3: CompLabel.Caption := 'This is the description of Component 4'
  else
    CompLabel.Caption := 'Move your mouse over a component to see its description.';
  end;
end;

procedure OnMouseLeave(Sender: TObject);
begin
  CompLabel.Caption := 'Move your mouse over a component to see its description.';
end;

procedure InitializeWizard();
begin
  CompLabel := TLabel.Create(WizardForm);
  CompLabel.Parent := WizardForm.SelectComponentsPage;
  CompLabel.SetBounds(WizardForm.ComponentsList.Left,180,WizardForm.ComponentsList.Width,200);
  CompLabel.Caption := 'Move your mouse over a component to see its description.';
  WizardForm.ComponentsList.OnItemMouseMove := @OnItemMouseMove;
  WizardForm.ComponentsList.OnMouseLeave := @OnMouseLeave;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height - 40;
end;
蒋高超
2023-03-14

此解决方案仅使用Inno设置本身(而不是来源可疑的Inno设置的过时第三方版本)。

该解决方案部分基于我对Inno Setup:OnHover事件的回答。

根据您的需要调整HoverComponentChanged过程

[Code]

var
  LastMouse: TPoint;
  CompLabel: TLabel;

function GetCursorPos(var lpPoint: TPoint): BOOL;
  external 'GetCursorPos@user32.dll stdcall';
function SetTimer(
  hWnd: longword; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';
function ScreenToClient(hWnd: HWND; var lpPoint: TPoint): BOOL;
  external 'ScreenToClient@user32.dll stdcall';
function ClientToScreen(hWnd: HWND; var lpPoint: TPoint): BOOL;
  external 'ClientToScreen@user32.dll stdcall';
function ListBox_GetItemRect(
  const hWnd: HWND; const Msg: Integer; Index: LongInt; var Rect: TRect): LongInt;
  external 'SendMessageW@user32.dll stdcall';  

const
  LB_GETITEMRECT = $0198;
  LB_GETTOPINDEX = $018E;

function FindControl(Parent: TWinControl; P: TPoint): TControl;
var
  Control: TControl;
  WinControl: TWinControl;
  I: Integer;
  P2: TPoint;
begin
  for I := 0 to Parent.ControlCount - 1 do
  begin
    Control := Parent.Controls[I];
    if Control.Visible and
       (Control.Left <= P.X) and (P.X < Control.Left + Control.Width) and
       (Control.Top <= P.Y) and (P.Y < Control.Top + Control.Height) then
    begin
      if Control is TWinControl then
      begin
        P2 := P;
        ClientToScreen(Parent.Handle, P2);
        WinControl := TWinControl(Control);
        ScreenToClient(WinControl.Handle, P2);
        Result := FindControl(WinControl, P2);
        if Result <> nil then Exit;
      end;

      Result := Control;
      Exit;
    end;
  end;

  Result := nil;
end;

function PointInRect(const Rect: TRect; const Point: TPoint): Boolean;
begin
  Result :=
    (Point.X >= Rect.Left) and (Point.X <= Rect.Right) and
    (Point.Y >= Rect.Top) and (Point.Y <= Rect.Bottom);
end;

function ListBoxItemAtPos(ListBox: TCustomListBox; Pos: TPoint): Integer;
var
  Count: Integer;
  ItemRect: TRect;
begin
  Result := SendMessage(ListBox.Handle, LB_GETTOPINDEX, 0, 0);
  Count := ListBox.Items.Count;
  while Result < Count do
  begin
    ListBox_GetItemRect(ListBox.Handle, LB_GETITEMRECT, Result, ItemRect);
    if PointInRect(ItemRect, Pos) then Exit;
    Inc(Result);
  end;
  Result := -1;
end;

procedure HoverComponentChanged(Index: Integer);
var 
  Description: string;
begin
  case Index of
    0: Description := 'This is the description of Main Files';
    1: Description := 'This is the description of Additional Files';
    2: Description := 'This is the description of Help Files';
  else
    Description := 'Move your mouse over a component to see its description.';
  end;
  CompLabel.Caption := Description;
end;

procedure HoverTimerProc(
  H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
var
  P: TPoint;
  Control: TControl; 
  Index: Integer;
begin
  GetCursorPos(P);
  if P <> LastMouse then { just optimization }
  begin
    LastMouse := P;
    ScreenToClient(WizardForm.Handle, P);

    if (P.X < 0) or (P.Y < 0) or
       (P.X > WizardForm.ClientWidth) or (P.Y > WizardForm.ClientHeight) then
    begin
      Control := nil;
    end
      else
    begin
      Control := FindControl(WizardForm, P);
    end;

    Index := -1;
    if (Control = WizardForm.ComponentsList) and
       (not WizardForm.TypesCombo.DroppedDown) then
    begin
      P := LastMouse;
      ScreenToClient(WizardForm.ComponentsList.Handle, P);
      Index := ListBoxItemAtPos(WizardForm.ComponentsList, P);
    end;

    HoverComponentChanged(Index);
  end;
end;

procedure InitializeWizard();
begin
  SetTimer(0, 0, 50, CreateCallback(@HoverTimerProc));

  CompLabel := TLabel.Create(WizardForm);
  CompLabel.Parent := WizardForm.SelectComponentsPage;
  CompLabel.Left := WizardForm.ComponentsList.Left;
  CompLabel.Width := WizardForm.ComponentsList.Width;
  CompLabel.Height := ScaleY(32);
  CompLabel.Top :=
    WizardForm.ComponentsList.Top + WizardForm.ComponentsList.Height -
    CompLabel.Height;
  CompLabel.AutoSize := False;
  CompLabel.WordWrap := True;

  WizardForm.ComponentsList.Height :=
    WizardForm.ComponentsList.Height - CompLabel.Height - ScaleY(8);
end;

对于 CreateCallback 函数,您需要 Inno Setup 6。如果您坚持使用 Inno Setup 5,您可以使用 InnoTools InnoCallback 库中的 WrapCallback 函数。使用 Unicode 版本的 Inno Setup 5。

要使其在调整大小/可调整大小/新式向导中正确工作,您需要进行一些调整。请参阅Inno 设置 - 如何在调整大小的向导中将动画 gif 居中,以及放大的 Inno 设置向导中的长组件说明。

 类似资料:
  • 为了更好地支持 Win10 程序的开发,微软发布了 VS2015。VS2015 支持开发人员编写跨平台的应用程序,从 Windows 到 Mac、Linux、甚至是编写 iOS 和 Android 代码! VS2015 共有三个版本,分别是:社区版(Community):免费提供给单个开发人员、 开放源代码项目、科研、教育以及小型专业团队!大部分程序员(包括初学者)可以无任何经济负担、合法地使用

  • 我正在Inno安装程序中开发一个安装文件。当用户选择“自定义”时,它有3个不同的可选组件要安装。 它工作正常,但当传递参数时,不会安装任何组件。我想是因为没有检查组件。 …这是相关的代码片段: 我需要在传递 / 或 参数时默认安装三个组件之一(组件“Usuario”)。 我想我必须使用,但我不知道在哪里。事实上,我尝试在部分添加,但没有任何反应: 在”部分中都没有: 以下是我需要的: < Li >

  • 本文向大家介绍centos7 安装Jenkins详细介绍,包括了centos7 安装Jenkins详细介绍的使用技巧和注意事项,需要的朋友参考一下 CentOS7 Jenkins安装 Download 从Jenkins下载apache-tomcat-8.0.18.tar.gz Install 安装 上传RPM文件到/tmp目录下 cd /tmp rpm -ivh jenkins-1.599-1.1

  • 本文向大家介绍linux安装RabbitMQ详细教程,包括了linux安装RabbitMQ详细教程的使用技巧和注意事项,需要的朋友参考一下 一、RabbitMQ概念 RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好

  • 本文向大家介绍mongodb 3.2.5安装详细过程,包括了mongodb 3.2.5安装详细过程的使用技巧和注意事项,需要的朋友参考一下 1. 准备安装介质 安装介质下载: mongodb的安装方式,我通常使用二进制包的方式,内网不能配置连接外网的yum源; 官方建议的mongodb下载地址为: Downloads.mongodb.org 但实际上,这个地址,很难找到下载表,正常下载,通常可以用

  • 本文向大家介绍Bash中文件描述符的详细介绍,包括了Bash中文件描述符的详细介绍的使用技巧和注意事项,需要的朋友参考一下 前言 Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是可以改变的,比如将其改成其他文件,