특정 체크박스나 라디오버튼의 하위 콘트롤로 등록된 모든 콘트롤들을 일괄적으로 활성화시키거나 비활성 시키는 좀더 편한 방법을 찾다가 만든 유틸리티 입니다.



1. #include CGuiVLabelLink.ahk  헬퍼 클래스를 인클루드 시킵니다.


2. Gui, Add, Checkbox, vCheckA1 gCheckA1, 체크박스  처럼 v라벨과 g라벨의 이름이 동일해야 합니다.


3. GetGuiChildList(label, conValue) 사용자 함수를 생성합니다. 

- root 는 v라벨의 연결 상태를 반영한 오브젝트이며 노드는 체크박스나 라디오 박스만 사용해야 합니다.

- _CheckA3 이나 _CheckB3 처럼 라벨 이름 앞에 '_' 기호를 붙인 경우 하위 콘트롤의 활성화 동작을 역으로 수행합니다.

- CheckA2:{"":"show_hide"} 나 _CheckA3:{"":"show_hide"} 처럼 특정 노드에 'show_hide' 옵션을 넣을시 하위 콘트롤의 활성화 동작이 show/hide 동작을 수행합니다.


GetGuiChildList(label, conValue)

{

  static cls

  if !cls {

    ;주황색 부분을 현재 GUI상 콘트롤의 v라벨 연결 상태에 맞게 수정해야 합니다.

    root := {Check:{CheckA1:{}, CheckB1:{}}}

    root.Check.CheckA1 := {CheckA2:{"":"show_hide", _CheckA3:{"":"show_hide", CheckA4:{CheckA5:0}}}}

    root.Check.CheckB1 := {CheckB2:{_CheckB3:{CheckB4:{CheckB5:0}, CheckC1:{CheckC2:0}}}}

    cls := new CGuiVLabelLink(root)

  }

  return cls.GetGuiChildList(label, conValue)

}


4. g라벨 수행부에 아래 코드를 넣어주면 해당 콘트롤을 체크하거나 해제할때 하위 콘트롤을 활성/비활성 시킬 수 있습니다.

  GuiControlGet, conValue,, % A_ThisLabel

  for k,v in GetGuiChildList(A_ThisLabel, conValue)

    GuiControl, % v.cmd, % v.name



[테스트 스크립트]


Test_GUI콘트롤_일괄비활성.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

Test_GUI콘트롤_일괄비활성.zip


1. Test_GUI콘트롤_일괄비활성1.ahk


#SingleInstance, force

#include CGuiVLabelLink.ahk


;1. v라벨과 g라벨의 이름은 동일해야 합니다.

Gui, new

Gui, Add, Checkbox, xm     vCheck   gCheck  , 체크

Gui, Add, Checkbox, xm     vCheckA1 gCheckA1, 체크A1

Gui, Add, Checkbox, xp+70  vCheckA2 gCheckA2, 체크A2

Gui, Add, Checkbox, xp+70  vCheckA3 gCheckA3, 체크A3

Gui, Add, Checkbox, xp+70  vCheckA4 gCheckA4, 체크A4

Gui, Add, Checkbox, xp+70  vCheckA5 gCheckA5, 체크A5

Gui, Add, Checkbox, xm     vCheckB1 gCheckB1, 체크B1

Gui, Add, Checkbox, xp+70  vCheckB2 gCheckB2, 체크B2

Gui, Add, Checkbox, xp+70  vCheckB3 gCheckB3, 체크B3

Gui, Add, Checkbox, xp+70  vCheckB4 gCheckB4, 체크B4

Gui, Add, Checkbox, xp+70  vCheckB5 gCheckB5, 체크B5

Gui, Add, Checkbox, xm+140 vCheckC1 gCheckC1, 체크C1

Gui, Add, Checkbox, xm+140 vCheckC2 gCheckC2, 체크C2

Gui, Show


;3. GUI 생성 후 초기화 작업이며, 체크박스나 라디오버튼의 값에 따라 하위 콘트롤을 enable/disable 또는 show/hide 시킵니다.

  for k,v in GetGuiChildList("","")

    GuiControl, % v.cmd, % v.name

return


;2. v라벨 연결 상태를 반영한 오브젝트이며 노드는 체크박스나 라디오 박스만 사용해야 합니다.

;ㄴ _CheckA3 이나 _CheckB3 처럼 라벨 이름 앞에 '_' 기호를 붙인 경우 하위 콘트롤의 활성화 동작을 역으로 수행합니다.

;ㄴ CheckA2:{"":"show_hide"} 이나 _CheckA3:{"":"show_hide"} 처럼 특정 노드에 'show_hide' 옵션을 넣을시 하위 콘트롤의 활성화 동작이 show/hide 동작을 수행합니다.

GetGuiChildList(label, conValue)

{

  static cls

  if !cls {

    root := {Check:{CheckA1:{}, CheckB1:{}}}

    root.Check.CheckA1 := {CheckA2:{"":"show_hide", _CheckA3:{"":"show_hide", CheckA4:{CheckA5:0}}}}

    root.Check.CheckB1 := {CheckB2:{_CheckB3:{CheckB4:{CheckB5:0}, CheckC1:{CheckC2:0}}}}

    cls := new CGuiVLabelLink(root)

  }

  return cls.GetGuiChildList(label, conValue)

}


Check:

CheckA1:

CheckA2:

CheckA3:

CheckA4:

CheckA5:

CheckB1:

CheckB2:

CheckB3:

CheckB4:

CheckB5:

CheckC1:

CheckC2:

 

  GuiControlGet, conValue,, % A_ThisLabel

  for k,v in GetGuiChildList(A_ThisLabel, conValue)

    GuiControl, % v.cmd, % v.name

return



2. Test_GUI콘트롤_일괄비활성2.ahk


#SingleInstance, force
#include CGuiVLabelLink.ahk


;1. v라벨과 g라벨의 이름은 동일해야 합니다.
Gui, new
Gui, Add, Checkbox, xm         vCheck  gCheck   , 체크

Gui, Add, Checkbox, xp+70     vCheck1 gCheck1 , 선택1
Gui, Add, Text        , xp+70    vText1  gText1      , 에디트1
Gui, Add, Edit        , x+3 yp-3 vEdit1  gEdit1
Gui, Add, Text        , xm+140  vText2  gText2      , 에디트2
Gui, Add, Edit        , x+3 yp-3 vEdit2  gEdit2

Gui, Add, Checkbox, xm+70    vCheck2 gCheck2 , 선택2
Gui, Add, Text        , xp+70    vText3  gText3     , 에디트3
Gui, Add, Edit        , x+3 yp-3 vEdit3  gEdit3
Gui, Add, Text        , xm+140  vText4  gText4    , 에디트4
Gui, Add, Edit        , x+3 yp-3 vEdit4  gEdit4
Gui, Show

;3. GUI 생성 후 초기화 작업이며, 체크박스나 라디오버튼의 값에 따라 하위 콘트롤을 enable/disable 또는 show/hide 시킵니다.
  for k,v in GetGuiChildList("","")
    GuiControl, % v.cmd, % v.name
return

;2. v라벨 연결 상태를 반영한 오브젝트이며 노드는 체크박스나 라디오 박스만 사용해야 합니다.
;ㄴ _Check2 처럼 라벨 이름 앞에 '_' 기호를 붙일경우 하위 콘트롤의 활성화 동작을 역으로 수행합니다.
;ㄴ _Check2:{"":"show_hide"} 처럼 특정 노드에 'show_hide' 옵션을 넣을시 하위 콘트롤의 활성화 동작이 show/hide 동작을 수행합니다.
GetGuiChildList(label, conValue)
{
  static cls
  if !cls {
    root := {Check:{Check1:{}, _Check2:{}}}
    root.Check.Check1 := {Text1:0, Edit1:0, Text2:0, Edit2:0}
    root.Check._Check2 := {Text3:0, Edit3:0, Text4:0, Edit4:0, "":"show_hide"}
    cls := new CGuiVLabelLink(root)
  }
  return cls.GetGuiChildList(label, conValue)
}

Check:

Check1:
Text1:
Edit1:
Text2:
Edit2:

Check2:
Text3:
Edit3:
Text4:
Edit4:

  GuiControlGet, conValue,, % A_ThisLabel
  for k,v in GetGuiChildList(A_ThisLabel, conValue)
    GuiControl, % v.cmd, % v.name
return




Posted by 와이로