0
나는 Winwin 설치 프로그램의 확인란을 사용하여 ListView를 사용했습니다. 주어진 확인란을 비활성화 할 수 있습니까? (un/check 할 수 없음)?
감사합니다.
NSIS ListView - 확인란을 "사용 안 함"으로 설정할 수 있습니까?
나는 Winwin 설치 프로그램의 확인란을 사용하여 ListView를 사용했습니다. 주어진 확인란을 비활성화 할 수 있습니까? (un/check 할 수 없음)?
감사합니다.
NSIS ListView - 확인란을 "사용 안 함"으로 설정할 수 있습니까?
Windows 자체에는 실제로 listview의 확인란에 2 개 이상의 상태가 없습니다. 더 많은 주를 얻으려면 NSIS의 시스템 플러그인을 사용하여 draw them yourself해야합니다.
WM_NOTIFY
메시지를 처리 할 때 nsDialogs 플러그 인이 반환 값을 지원하지 않으므로 LVN_ITEMCHANGING
을 처리하여 상태 변경을 차단할 수 없습니다. 당신은 그러나 LVN_ITEMCHANGED
을 잡아 원래의 상태를 다시 적용 할 수 있습니다 : 당신이 항목 여부를 읽기 전용 있는지 확인하기 위해 방금 상태 이미지 인덱스 볼 수있는 추가 단계를 이동 한 다음 자신의 체크 박스를 그리면
!include LogicLib.nsh
!include nsDialogs.nsh
!include WinMessages.nsh ; The 3rd-party CommCtrl.nsh file is buggy, include this first to make sure LVM_* is defined correctly
!ifndef LVM_GETITEMTEXT
!define /math LVM_GETITEMTEXTA ${LVM_FIRST} + 45
!define /math LVM_GETITEMTEXTW ${LVM_FIRST} + 115
${_NSIS_DEFAW} LVM_GETITEMTEXT
!endif
!include "CommCtrl.nsh"
!define /ifndef _COMMCTRL_NSH_VERBOSE ${_COMMCTRL_VERBOSE}
Page Custom MyPage
Var AllowCheckboxChanges
Function MyPage
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 100% 100% "Listview"
Pop $0
SendMessage $0 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${LVS_EX_CHECKBOXES}
IntOp $AllowCheckboxChanges $AllowCheckboxChanges + 1 ; Allow changes while we initialize
${NSD_OnNotify} $0 OnListNotify
${NSD_LV_InsertColumn} $0 0 200 "column 0"
${NSD_LV_InsertItem} $0 9 'Foo' ; read-only
${NSD_LV_SetCheckState} $0 0 1
${NSD_LV_InsertItem} $0 9 'Bar'
${NSD_LV_InsertItem} $0 9 'Baz' ; read-only
IntOp $AllowCheckboxChanges $AllowCheckboxChanges - 1 ; Block changes from now on
nsDialogs::Show
FunctionEnd
Function OnListNotify
Pop $1 ; HWND
Pop $2 ; Code
Pop $3 ; NMHDR*
${If} $2 = ${LVN_ITEMCHANGED}
${AndIf} $AllowCheckboxChanges = 0
System::Call "*$3(p,p,i,i.r2,i,i.r5,i.r4,i,&i8,p)" ; NMLISTVIEW
; Block changes to items 0 and 2
${If} $2 = 0
${OrIf} $2 = 2
IntOp $4 $4 & ${LVIS_STATEIMAGEMASK}
IntOp $5 $5 & ${LVIS_STATEIMAGEMASK}
IntOp $4 $4 >> 12
IntOp $5 $5 >> 12
${If} $4 <> $5
IntOp $4 $4 - 1
IntOp $AllowCheckboxChanges $AllowCheckboxChanges - 1 ; Runs out of stack if we don't block recursive NSD_LV_SetCheckState messages
${NSD_LV_SetCheckState} $1 $2 $4
IntOp $AllowCheckboxChanges $AllowCheckboxChanges + 1
${EndIf}
${EndIf}
${EndIf}
FunctionEnd
을 .
답변을 시도하는 사람들이 예제를 복제하기 위해 처음부터 모든 것을 코딩 할 필요가 없도록 코드 일부를 게시하면 정말 도움이됩니다. – Anders