2011-09-29 58 views
2

我正在使用NSIS安裝程序。其中一個要求是允許用戶爲多個不同的條目多次輸入一些信息(實質上,它允許他們爲他們想要的任意數量的服務器輸入服務器信息)。我目前通過後,我的高級選項頁到這個頁面回收頁:在InstallOptions頁面中清除字段的狀態

Function RedirectPage 
    ${If} $addtCheck <> 0 ; Was the checkbox checked? 
     StrCpy $startedXml 1 ; make this "true" 
     SendMessage $HWNDPARENT 0x408 -1 "" ; If so, go back 
    ${Else} 
     Abort 
     ${EndIf} 

FunctionEnd 

addtCheck檢查是否複選框被選中的是回收的頁面。如果是這樣,這個功能會導致上一頁再次顯示。問題是這些字段包含用戶剛輸入的信息。現在,我想要做的是在返回之前清除前一頁中所有字段的狀態。我試過這樣做,

!insertmacro MUI_INSTALLOPTIONS_WRITE "ioAdv.ini" "Field 2" "State" "" 

但它似乎並沒有讓我清除狀態。我知道SendMessageGetDlgItem命令,但我不知道有任何方法可以讓我使用它們來清除InstallOptions INI文件中包含的文本框,複選框和列表框。

任何人都可以指出我正確的方向,謝謝。如果你想看更多劇本,請告訴我。

回答

2

所以,你應該在ini這樣的控件:

[Field 1] 
    Type=Label 
    Left=15 
    Top=7 
    Right=112 
    Bottom=16 
    Text=Text 1 

那麼你就可以得到這樣的領域手柄:

ReadIniStr $0 $PLUGINSDIR\page_ini.ini "Field 1" "HWND" 

,那麼你可以使用SendMessage命令與$0這樣的:

SendMessage $0 ${WM_SETTEXT} 0 "STR:$InitialString" 

這個例子應該對文本對於其他控件,請參閱以下內容: 在「包含」下的NSIS安裝路徑中,有文件Winmessages.nsh以及要使用的消息密鑰。

在我的測試中我發現設置複選框關鍵:

SendMessage $0 ${BM_SETCHECK} 0 "0" 

對於列表框,我發現:(未經測試)

LB_RESETCONTENT 
LB_SELECTSTRING 

希望有所幫助。 PS:如果您有任何問題或批評,請讓我知道。

PPS:

或者,你可以使用nsDialogs宏與HWND處理,即對複選框:

${NSD_Uncheck} $0 

這個宏的詳細信息在這裏: nsDialogs Readme - Macros

+0

我能得到使用這個工作解決方案。謝謝。雖然它可能不是最優雅的解決方案,但單獨更改每個字段可以完全控制頁面,並且工作得非常好。我很感激。 –

2

你可以使用SendMessage重置每個控件,但必須處理不同類型的控件,重置.ini會好得多:

page custom custdircreate_1 
page directory dirpagecreate 

Function custdircreate_1 
SetOverwrite on 
!insertmacro INSTALLOPTIONS_EXTRACT "ioAdv.ini" 
SetOverwrite lastused 
!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini" 
FunctionEnd 

Function dirpagecreate 
SendMessage $HWNDPARENT 0x408 -1 "" 
FunctionEnd 

..或重置狀態,並保持一切:

Function custdircreate_2 
; INSTALLOPTIONS_EXTRACT was called in .onInit 
!insertmacro INSTALLOPTIONS_READ $1 "ioAdv.ini" "Settings" "NumFields" 
StrCpy $0 1 
loop: 
!insertmacro INSTALLOPTIONS_WRITE "ioAdv.ini" "Field $0" "State" "" 
IntOp $0 $0 + 1 
IntCmpU $0 $1 loop loop 

!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini" 
FunctionEnd 

(這將重置鏈接和按鈕控件,以便過濾那些圈外如果需要的話)