2017-04-05 19 views
0

NSISのMUI_PAGE_CUSTOMFUNCTION_SHOWを使用して、デフォルトのディレクトリページに基本チェックボックスを追加したいと考えています。ただし、チェックボックスは表示されていないか、機能していないようです。ここに私が試みた様々な機能があります。私はそれを描くために現在のウィンドウをつかむ必要があるかどうか分かりません。アドバイスをいただければ幸いです。NSISのチェックボックス

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow" 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave" 
!insertmacro MUI_PAGE_DIRECTORY 

Var Checkbox 

Function DirectoryShow 
    ${NSD_CreateCheckbox} 0 0 50% 6% "CheckboxTest" 
    Pop $Checkbox 
    ${NSD_Check} $Checkbox 
FunctionEnd 

Function DirectoryLeave 
    ${NSD_GetState} $Checkbox $0 
    ${If} $0 <> 0 
    MessageBox mb_ok "Checkbox checked." 
    ${EndIf} 
FunctionEnd 
+0

あなたのチェックボックスのx、yまたは不正なサイズが間違っていると思います。私の定義を見てください。\t $ {NSD_CreateCheckbox} 50 193 350 8u $(DLG_InternetConnectionShortcut) –

+0

異なる座標を試しても、このような運はありません。おそらく問題が何であるかを見るために冗長な印刷を行う方法はありますか? – MateoConLechuga

答えて

1

NSD_Create*のみnsDialogページ(ようこそ、終了MUI​​ページ)上ではなくDirectoryなどの内部NSISページでサポートされています。

内部ページでコントロールを作成するには、Windows API関数CreateWindowExを手動で呼び出す必要があります。他のNSDヘルパーマクロのいくつかは、まだこれらのコントロールに使用することができます。

!include MUI2.nsh 
!include nsDialogs.nsh 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow" 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave" 
!insertmacro MUI_PAGE_DIRECTORY 
!insertmacro MUI_PAGE_COMPONENTS 
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_LANGUAGE English 

Var Checkbox 
Var CheckState ; Stored globally so we remember the choice if the user presses the back button and goes back to our page 
!define CheckHeight 28 

!ifmacrondef _Z= 
!error "NSIS 2.51 or 3.0rc1 or later required!" 
!endif 
!macro CreateNativeControl hParent cls style exstyle x y w h text ; Note: Only supports pixel coordinates 
System::Call 'USER32::CreateWindowEx(i ${exstyle}, t "${cls}", ts, i ${style}, i ${x}, i ${y}, i ${w}, i ${h}, p ${hParent}, i0, i0, i0)p.s' "${text}" 
!macroend 

Function DirectoryShow 
    ; Create some extra space by reducing the height of the top text: 
    System::Call *(i,i,i,i)p.r0 ; NSIS 2.51+ 
    System::Call 'USER32::GetWindowRect(p$mui.DirectoryPage.Text, pr0)' 
    System::Call 'USER32::MapWindowPoints(i0,p$mui.DirectoryPage,p$0,i2)' 
    System::Call '*$0(i.r2,i.r3,i.r4,i.r5)' 
    System::Free $0 
    IntOp $5 $5 - ${CheckHeight} 
    System::Call 'USER32::SetWindowPos(i$mui.DirectoryPage.Text,i,i,i,i$4,i$5,i0x6)' 

    ; Create and initialize the checkbox 
    IntOp $5 $3 + $5 ; y = TextTop + TextHeight 
    !insertmacro CreateNativeControl $mui.DirectoryPage ${__NSD_CheckBox_CLASS} "${__NSD_CheckBox_STYLE}" "${__NSD_CheckBox_EXSTYLE}" 0 $5 300 ${CheckHeight} "CheckboxTest" 
    Pop $Checkbox 
    SendMessage $mui.DirectoryPage ${WM_GETFONT} 0 0 $0 ; Get the dialog font 
    SendMessage $Checkbox ${WM_SETFONT} $0 1 ; and apply it to the new control 
    System::Call 'USER32::SetWindowPos(i$Checkbox,i0,i,i,i,i,i0x33)' ; Make sure it is on top of the tab order 
    ${IfThen} $CheckState == "" ${|} StrCpy $CheckState 1 ${|} ; Set the default if this is our first time 
    ${NSD_SetState} $Checkbox $CheckState 
FunctionEnd 

Function DirectoryLeave 
    ${NSD_GetState} $Checkbox $CheckState 
    ${If} $CheckState <> 0 
    MessageBox mb_ok "Checkbox checked." 
    ${EndIf} 
FunctionEnd 

また、代わりに、実行時にコントロールを作成するあなただけの実際のページ(... \ NSIS \ Contribの\ UIを変更することができます\ modern.exe)をResource Hackerで置き換えて、MUI_UIChangeUI)の新しいUIファイルを適用してください。

関連する問題