본문으로 바로가기

이 글은 shriekout님께서 기고해 주신 강좌이며, 최대한 수정 없이 올립니다. 현재 이 글을 옮기는 시점은 winico 버전 0.6이며, 다를 수 있음에 주의하시기 바랍니다.

소개

홈페이지: http://sourceforge.net/projects/tktable

 

winico는 프로그램 아이콘 및 트레이 아이콘을 만드는 패키지 입니다. 프로그램 아이콘은 설명하지 않고 트레이 아이콘에 관련된 부분만 설명하겠습니다. 프로그램 아이콘 변환은 아래와 같이 winico 패키지를 사용하지 않고 바꿀 수 있습니다.

wm iconbitmap . iconfile.ico

설치

우선 winico를 다운 받습니다. winico는 현재 tcl/tk 8.2 용입니다. 8.4에서 사용하기 위해서는, bin/tk8.2_stubs 디렉터리에 있는 winico03.dll 파일과 bin/tk8.2 디렉터리의 pkgIndex.tcl 파일을 c:\tcl\lib 디렉터리에 winico03 디렉터리를 만들어 안에 넣어주면 됩니다.

트레이 아이콘 생성 및 소멸

이제 트레이 아이콘을 생성합니다.

package require Winico
set ico [winico create c:/source/winico03/smiley.ico]
winico text $ico "This is a taskbar sample text"
winico taskbar add $ico


첫번째, 패키지를 사용을 선언합니다. 둘째, 아이콘을 로드합니다. 셋째, 아이콘에 마우스가 가리킬 때 나올 메시지를 정합니다. 넷째, 트레이 아이콘을 등록시킵니다.

위와 같이 스마일 아이콘이 보이나요? 마우스 커서를 가져가면 This... 문장이 나타납니다. 이제 아이콘을 소멸시켜 보겠습니다. 소멸시키기 전에...

winico info

위 코드는 아이콘이 생성되어 있는 정보를 나타냅니다. 이 정보를 가지고 아이콘을 소멸시키면 됩니다.

foreach i [winico info] { winico delete $i }

이제 스마일 아이콘이 없어졌습니다.

트레이 아이콘 정보 보기

트레이 아이콘과 관련된 정보를 텍스트 위젯에 나타내보겠습니다.

package require Winico

proc taskbar_cmd {message icon wParam lParam x y} {
  .tx insert end "버튼상태: $message     아이콘: $icon\n"
  .tx insert end "wParam: $wParam       lParam: $lParam\n"
  .tx insert end "x좌표: $x      y좌표: $y\n"
  .tx insert end "-----------------------------------\n"
}

set ico [winico create c:/source/winico03/smiley.ico]
winico text $ico "This is a taskbar sample text"
winico taskbar add $ico -callback "taskbar_cmd %m %i %w %l %x %y"
 
text .tx
pack .tx

위의 그림에서 보듯이 텍스트 위젯에는 마우스가 트레이 아이콘 위에서 한 행동 정보를 보여줍니다. 12번 줄을 보면, 트레이 아이콘 생성 시에 -callback 옵션을 사용하여 트레이 아이콘에 관련된 사건들을 함수로 처리할 수 있습니다. 각 인수들은 아래와 같습니다.

 

인수 설명
%m 마우스 버튼 누름 정보(가령 마우스 왼쪽 버튼이 눌려면 WM_LBUTTONDOWN 등... )
%i 생성된 아이콘 위젯명
%w wParam (뭔지 잘 모르겠음)
%l lParam (뭔지 잘 모르겠음)
%x 마우스 x 좌표
%y 마우스 y 좌표

트레이 아이콘 클릭 시 창 활성과 메뉴 나타내기

이제 트레이 아이콘을 마우스 왼쪽 버튼으로 클릭했을 때 창을 활성화 시키는 방법과 마우스 오른쪽 버튼으로 클릭했을 때 메뉴가 나타나는 방법을 설명하겠습니다.

package require Winico
 
proc tray_task {message x y w} {
   if {$message == "WM_LBUTTONDOWN"} {
      raise .
   } elseif {$message == "WM_RBUTTONDOWN"} {
      tk_popup $w $x $y
   }
}
 
label .l -text "트레이 아이콘 테스트"
pack .l
 
menu .tm
.tm add command -label "트레이 아이콘 테스트입니다."
.tm add command -label "메뉴가 잘 보이나요? ^^"
.tm add separator
.tm add command -label "종료" -command exit
 
set ico [winico create c:/source/winico03/smiley.ico]
winico text $ico "This is a taskbar sample text"
winico taskbar add $ico -callback "tray_task %m %x %y .tm"

아래 그림은 위 코드의 실행결과입니다. 스마일 아이콘을 왼쪽 버튼으로 클릭하면 창이 활성화 되고, 왼쪽 버튼을 누르면 아래와 같이 메뉴가 나타납니다.

tray_task의 각 인자는 다음과 같습니다.

 

인자 설명
message 마우스 버튼의 상태
x x좌표
y y좌표
w 팝업 메뉴 위젯

현재 해결되지 않은 문제

이 글을 작성하면서 발생한 두가지 문제는 다음과 같습니다. 트레이 아이콘 위에 마우스 커서가 위치했을 때 나타나는 문구가 한글은 깨져서 나타납니다. 창을 이동하고 다른 윈도우로 감추고 스마일 아이콘을 클릭했을 때, 창이 활성화되지 않습니다.

마치며

먼저 관리자님인 민인학님의 도움에 감사드립니다. 엉성한 글 끝까지 읽어주셔서 감사드리며, 마음만 급해서 세세한 부분에 대해서 신경 쓰지 못 한점 사과 드립니다. 이후 사용하면서 계속 보강토록 하겠습니다.