Inno Setup 插件:水纹特效(V2)


尝试实现,的确遇到了比普通插件更难处理的问题。所以才认真的做了一下。
引用来自  test.iss,2008-5-31 引用来自 test.iss,2008-5-31
; -- test.iss --
; restools
; http://restools.hanzify.org
; 时间仓促,所以可能会有点谬误,如有错误可以提出
; waterctrl.dll 为一个用于 Inno Setup 的 16.5 KB 的水纹特效插件。
; 需要注意,插件使用 MFC, 系统需要有 mfc42.dll,不过一般系统自带。

; v2 版本  新增设置水纹插件的父句柄

[Setup]
AppName=我的程序
AppVerName=我的程序 版本 1.5
DefaultDirName={pf}\我的程序
DefaultGroupName=我的程序
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
Source: "waterctrl.dll"; Flags: dontcopy
Source: "WizModernImage-Is.bmp"; Flags: dontcopy

[Icons]
Name: "{group}\我的程序"; Filename: "{app}\MyProg.exe"

[code]

function enablewater(ParentWnd: HWND; Left, Top: integer; Bmp: HBITMAP;
     WaterRadius, WaterHeight: integer): BOOL; external 'enablewater@files:waterctrl.dll stdcall';
//ParentWnd     放置特效窗口的父窗口句柄。
//Left          左位置
//Top           上位置
//Bmp           位图句柄。
//WaterRadius   水纹半径,会令到水纹看起来范围更广。
//WaterHeight   水纹高度,会令到水纹看起来更深。
//注意,水纹插件自动根据图片来设定高度和宽度,
//另外水纹底图必须是翻转的图片,显示的时候会翻转图片来显示。

function waterblob(x, y: integer; radius, height: integer): BOOL; external 'waterblob@files:waterctrl.dll stdcall';
// 在 x,y 点产生半径为radius, 高度为height 的水纹。

function flattenwater(): BOOL; external 'flattenwater@files:waterctrl.dll stdcall';
// 平伏所有水纹。

function disablewater(): BOOL; external 'disablewater@files:waterctrl.dll stdcall';
//释放水纹插件

function setwaterparent(ParentWnd: HWND): BOOL; external 'setwaterparent@files:waterctrl.dll stdcall';
//v2 新增,设置水纹插件的父句柄

var
  
bmp: TBitmap;

procedure InitializeWizard();
begin
  
ExtractTemporaryFile('WizModernImage-Is.bmp');
  bmp := TBitmap.create;
  bmp.LoadFromFile(ExpandConstant('{tmp}\WizModernImage-Is.bmp'));

  enablewater(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 3, 50);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if
CurPageID = wpWelcome then
  begin
    
setwaterparent(WizardForm.WelcomePage.Handle);
    waterblob(70, 198, 10, 1000);
  end else
  if
CurPageID = wpFinished then
  begin
    
setwaterparent(WizardForm.FinishedPage.Handle);
    waterblob(70, 198, 10, 1000);
  end else
    
flattenwater();
end;

procedure DeinitializeSetup();
begin
  
disablewater();
  bmp.Free;
end;


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



[本日志由 xin 于 2008-05-31 01:42 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Inno Setup waterctrl Plugin
评论: 31 | 引用: 0 | 查看次数: 19350
dejoy [2008-06-04 07:31 PM]
谢xin的这次长篇回帖,从编程理论的观点论述了多字节到多语言~~ 从底层分析了可能产生的原因,真是博大精深,不过这些都不重要了,因为我已经如前述用最简单的办法解决了问题,至于什么单字节双字节多语言的还是留给高手去研究吧~ 对于像我这样的使用者来说,只要能产生正常的结果就好了,方法不一定最重要,虽然解决的办法可能笨了点.

又被屏蔽了,没法,只有一点一试一发了.
xin [2008-06-04 06:27 PM]
最后一次解答你的这个问题了,你对什么叫程序的多语言支持还是不太了解,如果你长期接触汉化就不会这样理解我说的话了。正确来说,原版的这种情况才算“正常情况”。我也没办法三言两语来为你解释了。以后你接触多了会理解的。
你本来要做的事情不是要适应汉化版本的编译器,因为它们根本是针对中国区域做的,虽然功能上并无大碍,因为那是双字节区域,适应外国区域是没问题的,但是那不是纯正的多语言处理方法,遇到某些特殊情况就会出现问题,例如特殊字符显示的情况,这些我也没办法三言两语中解释给你听,因为你现在的概念还站在中文里面,所以我跟你暂时是无法进行“多语言”这个概念上的沟通。
我说的处理方法就是如此,使用 ActiveLanguage 和 GetUILanguage 这样的函数。
还有你对 BUG 这词的理解问题,可能你认为不能满足你要求的就算软件的 BUG,这种想法有点问题。
dejoy [2008-06-04 01:18 PM]
补充一点,经试验,在win98/win2003/vista下我编译的EXE都能看到BUG效果.
dejoy [2008-06-04 01:05 PM]
我不知道你为什么会看不出来我编译的EXE的问题,我分别用xp sp2和win2000都能看到问题.那我就再说详细点重现BUG的步骤吧:setup_英文原版Inno编译_不正常.exe->选择 english 就会显示错误,选中文则正常

setup_中文inno编译_正常.exe 无论选英文或中文都正常.

看来你没有看到我EXE的问题,也没搞清楚问题所在,所以总是提醒我 "根据用户选择安装程序语言来做不同的事情",这问题产生的是 1.用英文inno编译->2.选择英文语言,你的建议是解决了第2步问题问题,但根源是在第1步. 如果能在同一个iss中"根据编译ISS安装程序的INNO语言版本来做不同的事情"才是解决方法.(你所说的变通方法可能也就是制造出两个ISS,比如英文版inno就编译A,中文版inno就编译B,对吧),我的重点是编译器的语言版本,不是用户选择安装程序的语言版本.

我现在的处理方法很简单,既然中文inno版编译的没问题,我就用中文inno来编译,避免使用英文inno来编译(无需复制出不同的语言源文件),在目前的现状下,似乎是最好的解决办法了.
xin [2008-06-04 12:34 AM]
做人要晓变通,你用什么编译器就用什么方法,灵活点,你如果用原版编译器做程序用我的方法绝对可以做出无论在中文还是英文界面下都释放出适合窗口的图片来用,但是你用汉化版,就无需用这种方法来自找烦恼。
原版编译器虽然会因为选择语言而改变了窗口大小,但是那种改变也是固定的,每次改变出来的窗口大小是固定的,也就是说你可以因应该窗口大小而做出适应的图片。
不知道你能不能听懂我的意思,这个问题就说到这里了,我重复解释太多了。
xin [2008-06-04 12:13 AM]
这已经是我的最终解决方案,因为就算你编译的EXE在我电脑上也看不出什么问题来,只是因为窗口变高了而显得图片短了,实际上并不是图片短了,我提供的方法绝对能解决,看来你并没有尝试过如何根据用户选择安装程序语言来做不同的事情,所以我无法提供更进一步的改进意见了。
dejoy [2008-06-04 08:01 AM]
根据现在的测试结果,不是 "根据安装程序选择语言"来改变能解决的,问题不出在运行时,而是编译时,是inno编译器造成的,使用你所说的方法是无法解决的.
xin [2008-06-04 00:30 AM]
这不是插件BUG,因为图片并没有改变大小,插件也是根据图片大小来设定长宽,原版是因为代码页(语系)随语言选择影响到窗口的大小了。而汉化版把语系都设定为中文了(即使界面语言为英文),遇到这种情况,你只能根据安装程序选择语言(有内部函数可检测用户选择的安装程序语言)来释放不同大小的图片(而且这样你也可以做1个中文图片和英文图片来适应不同选择语言)。这样就可以适应不同语言影响到窗口大小带来的图片不适应。
dejoy [2008-06-03 08:59 PM]
经过我的多次试验发现,如果是用原版英文版的Inno(我是从官网下载的)编译就会出现前面说的问题,但用汉化版inno(skygz的Inno Setup 5.2.3 重编译增强版)编译就显示正常.原来不是操作系统的问题,是inno编译器的问题.
报告xin看看是不是和英文原版inno编译器的兼容性问题.
请xin移步 pickup.mofile.com/3359158453881411 下载我编译的bug重现.
xin [2008-06-03 06:54 PM]
没办法重现你的情况,这是我编译的程序:
http://restools.hanzify.org/temp/setup.exe

你编译一个成品我下载看看吧。
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭