NSIS关于预览图片切换功能的实现。

引用来自  test.nsi 引用来自 test.nsi
Name                "test"
OutFile              "test.exe"

!include            MUI.nsh

!ifndef LR_LOADTRANSPARENT
  !define LR_LOADTRANSPARENT  0x0020
!endif

!ifndef
LR_LOADFROMFILE
  !define LR_LOADFROMFILE     0x0010
!endif

!ifndef
LR_CreateDIBSECTION
  !define LR_CreateDIBSECTION 0x2000
!endif

!ifndef
STM_SETIMAGE
  !define STM_SETIMAGE        370
!endif

!ifndef
IMAGE_BITMAP
  !define IMAGE_BITMAP        0
!endif

!ifndef
sysLoadImage
  !define sysLoadImage        "user32::LoadImageA(i, t, i, i, i, i) i"
!endif

!ifndef
sysDeleteObject
  !define sysDeleteObject     "gdi32::DeleteObject(i) i"
!endif

Var hwnd
Var ImageHandle

!macro DisplayImage PARENTWIN IMGHANDLE IMG_NAME
  StrCmp $ImageHandle '' +4
    
StrCpy $6 $ImageHandle
    
System::Call "${sysDeleteObject} (r6)"
    
StrCpy $6 ''
  
GetDlgItem $0 ${PARENTWIN} ${IMGHANDLE}
  
System::Call '${sysLoadImage} (0, s, ${IMAGE_BITMAP}, 0, 0, ${LR_CreateDIBSECTION}|${LR_LOADFROMFILE}) .r6' "${IMG_NAME}"
  
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $6
  
StrCpy $ImageHandle $6
!macroend

ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
ReserveFile io.ini
ReserveFile img1.bmp
ReserveFile img2.bmp

Page custom SetCustom LeaveCustom
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE SimpChinese

Section -nothing
SectionEnd

Function
.onInit
  InitPluginsDir
  File
/oname=$PLUGINSDIR\io.ini io.ini
  File /oname=$PLUGINSDIR\img1.bmp img1.bmp
  File /oname=$PLUGINSDIR\img2.bmp img2.bmp
  WriteINIStr "$PLUGINSDIR\io.ini" "Field 1" "Text" "$PLUGINSDIR\img1.bmp"
FunctionEnd

Function
SetCustom
  InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\io.ini"
  
Pop $hwnd
  
!insertmacro DisplayImage $hwnd 1200 "$PLUGINSDIR\img1.bmp"
  
InstallOptions::show
FunctionEnd

Function
LeaveCustom
  ReadINIStr $0 "$PLUGINSDIR\io.ini" "Settings" "State"
  
StrCmp $0 3 ImgBtn1
  StrCmp $0 4 ImgBtn2
  Goto InstallBtn
  ImgBtn1:
    !insertmacro DisplayImage $hwnd 1200 "$PLUGINSDIR\img1.bmp"
    
Abort
  
ImgBtn2:
    !insertmacro DisplayImage $hwnd 1200 "$PLUGINSDIR\img2.bmp"
    
Abort
  
InstallBtn:
FunctionEnd

引用来自  io.ini 引用来自 io.ini
; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=4

[Field 1]
Type=Bitmap
Left=6
Right=201
Top=3
Bottom=134

[Field 2]
Type=Groupbox
Text=select
Left=212
Right=271
Top=6
Bottom=60

[Field 3]
Type=RadioButton
Text=img 1
Flags=GROUP|NOTIFY
State=1
Left=222
Right=260
Top=22
Bottom=32

[Field 4]
Type=RadioButton
Text=img 2
Flags=NOTIFY
Left=222
Right=260
Top=40
Bottom=51


附图:




评论: 6 | 引用: 0 | 查看次数: 12817
  • 1
无尽天空 [2006-11-25 07:56 AM]
经过一个通宵终于弄好了,谢谢阿信。
无尽天空 [2006-11-24 06:18 PM]
用 Bitmap.LoadFromFile 是可以 Load,但是不可以像上面所说的用 RadioButton 或者 ComboBox 下拉来切换。
xin [2006-10-31 06:59 PM]
Inno Setup 要这么复杂吗?NSIS 如果是这么简单就实现,我也就没有写出来的必要了。
Inno Setup 里面有 TBitmapImage 控件,这个控件有个属性 Bitmap: TBitmap, 有方法 Bitmap.LoadFromFile ,你想怎么 Load 就怎么 Load 吧。如果你还不懂,就找帮助看看吧。
无尽天空 [2006-10-31 10:38 AM]
阿信,不知道 Inno 有没有办法实现这功能呢?
xin [2006-09-07 09:15 PM]
如下例:
System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i .r2"
DetailPrint "User name - $0"
DetailPrint "String length - $1"
DetailPrint "Return value - $2"


关于 true 和 false ,在标准的 Windows 的 API 解释里面是 true 是 非0, false 是 0。
例如上例返回一个 boolean 值 到 $2 ,那么你只需要用 0 和 $2 比较就行了(最好不要用 1 和 他比较判断真值,因为文档说的是非零,某些情况下 true 可能用 -1 或其他值代表),如果是0,那么就是 false ,否则就是 true。
kicyf [2006-09-06 04:23 PM]
调用的第三方dll的输出值为 true 和 false 怎样才能做到判断 我的信箱kicyf@sohu(dot)com 谢谢
  • 1
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭