2017-12-14 17 views
0


나는 Winwin 설치 프로그램의 확인란을 사용하여 ListView를 사용했습니다. 주어진 확인란을 비활성화 할 수 있습니까? (un/check 할 수 없음)?

감사합니다.

enter image description hereNSIS ListView - 확인란을 "사용 안 함"으로 설정할 수 있습니까?

+0

답변을 시도하는 사람들이 예제를 복제하기 위해 처음부터 모든 것을 코딩 할 필요가 없도록 코드 일부를 게시하면 정말 도움이됩니다. – Anders

답변

0

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 

을 .