类似 NSIS 组件列表描述控制的 Inno Setup 插件

组件描述插件,类似 NSIS 的效果。



引用来自  test.iss,2008-4-6 0:32:22 引用来自 test.iss,2008-4-6 0:32:22
; -- Example1.iss --
; restools
; http://restools.hanzify.org
; 看见很多人需要,就整个出来爽爽吧
; 时间仓促,所以编程可能会有点谬误,如有错误可以提出
; descctrl.dll 为一个 6.5 KB 的组件描述插件

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe

[Components]
Name: "program"; Description: "程序文件"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "帮助文件"; Types: full
Name: "readme"; Description: "自述文件"; Types: full
Name: "readme\en"; Description: "英文"; Flags: exclusive
Name: "readme\de"; Description: "德文"; Flags: exclusive
Name: "readme\cn"; Description: "中文"; Flags: exclusive
Name: "readme\ru"; Description: "俄文"; Flags: exclusive
Name: "test"; Description: "测试"; Types: full
Name: "test\test1"; Description: "测试1"; Flags: checkablealone
Name: "test\test2"; Description: "测试2"; Flags: checkablealone
Name: "test\test3"; Description: "测试3"; Flags: checkablealone
Name: "test\test4"; Description: "测试4"; Flags: checkablealone
Name: "test\test5"; Description: "测试5"; Flags: checkablealone
Name: "test\test6"; Description: "测试6"; Flags: checkablealone

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: program
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "descctrl.dll"; Flags: dontcopy

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
//ComponentsListHandle 组件框句柄
//DescLabelHandle 描述TNewStaticText句柄
//DescStrings 描述文字 英文分号分割“;”,如果描述中必须要有英文分号,请用“#3B”代替。

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
  
Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
  
//释放描述控制
  
disabledesc();
end;

procedure InitializeWizard();
begin
  
// 调整组件列表的大小
  
WizardForm.TYPESCOMBO.Visible:= false;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);
  //创建一个虚拟的GroupBox,因为Inno Setup 没有啊。
  
InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := '描述';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  // 创建描述文字
  
Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := '移动你的鼠标指针到组件之上,便可见到它的描述。';
  Info.WordWrap := true;
  //激活描述控制
  
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
       '程序文件描述;'+
       '帮助文件描述;'+
       '自述文件描述;'+
       '英文描述;'+
       '德文描述;'+
       '中文描述;'+
       '俄文描述测试#3B#3B包含#3B英文分号;'+
       '测试描述;'+
       '测试1描述;'+
       '测试2描述;'+
       '测试3描述;'+
       '测试4描述;'+
       '测试5描述;'+
       '测试6描述;'
       );
end;


点击下面连接下载例子。
http://restools.hanzify.org/inno/descctrl/inno_descctrl.zip


评论: 12 | 引用: 0 | 查看次数: 11744
阿信的粉丝 [2018-03-19 06:41 PM]
感谢阿信!这个代码在ansi版本非常好用,最近因故需要用到Unicode的innosetup,发现此代码虽然能编译成功但是描述界面不显示内容,求问怎么改进呢?
xin [2012-07-07 09:25 PM]
这是插件开发的一些小问题, 这个插件没处理, 其他好几个插件已经处理了, 所以这个你暂时就在不使用的时候就立刻卸载插件, 避免影响安装程序退出的速度. 基本上如果你使用我的增强版, 这个插件是没用的, 因为我的增强版 InnoSetup 中已经提供了相关的例子演示可以做到这样的效果.
冰水热咖啡 [2012-06-30 01:17 PM]
老大,请问用了描述插件后退出时有两秒钟的延迟应该怎么解决呀?如果用了主题插件退出时瞬间就可以看到默认主题,怎么办呀?
xin [2010-05-26 09:13 PM]
http://restools.hanzify.org/default.asp?id=89

发布的包里面有例子,自己看,既然做了增强的版本,我怎么不会考虑到这样的应用呢.根本不用考虑使用插件.

参考 Example_NewCheckListBox.iss
请教 [2010-05-26 08:14 PM]
xin你好,今天尝试用类似这样
[setup]
ComponentsListTVStyle=true

[Components]
Name: Plugin; Description: 音/视频插件; Flags: Collapsed; Types: Full Custom
的代码尝试收拢组件,组件列表是收拢成功了,可描述不对了,因为您这个插件是靠行数来判断组件的描述,我一旦收拢组件,行数变小,导致了描述的错位,
我想尝试用
if WizardForm.ComponentsList.Selected[0] then
  begin
  info.Caption:= '说明。';
  end;
,这样的代码来指定,但是这样只能是鼠标点击后才能出现描述文字,鼠标移过是不会出现的,请问您的插件能否也向if WizardForm.ComponentsList.Selected[0] then这样,判断一下,而不只是靠行数来指定呢?
回复请教 [2010-05-26 01:23 PM]
xin老大你好,问题已解决
请教 [2010-05-25 11:25 PM]
xin你好,今天测试了这个代码,很成功,有个问题,例如我打包的软件需要输入注册码,注册码保存在“app”下,我想做的就是安装时,选择了这个程序,在安装完成后给出选项“运行注册码文件”(实际上就是打开文件)不选择安装程序则不显示这个按钮,我尝试在run段添加内容,后来查看帮助文件好像run段还没这个功能。。。郁闷。。。请教是不是需要在code段添加些东西呢,方便明示吗?麻烦了
xin [2009-05-23 06:34 PM]
太笼统的问题,我没办法回答,我回答问题有个原则,如果你在代码中出现某些问题,表述清楚,那我会作针对代码错误位置作提示,但是如果一个笼统的问题就让我来写出整篇代码给你,估计我是没办法做到的。
Eht [2009-05-23 01:01 PM]
请教:我想将多个安装程序打包成一个setup文件,安装时可以选择其中一个或多个,是用这个实现吗?
我要打包5个类似的安装程序在一起,但我只会用inno打包其中任何一个,不会组合。麻烦你了。
Wood [2009-03-27 03:08 PM]
向你的共享精神致敬,谢谢你的勤奋努力,我用INNO还得向你学习啊,这个我就不会弄,学习了。
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭