티스토리 뷰

일반적으로 Windows95/98/NT 에서는 하단 오른쪽에 Tray icon 영역이 있다.

이곳에는 주로 서버역할을 담당하는 프로그램을 표시하는 icon들이 들어간다.

깔끔한 인터페이스가 점차 중요해지는 요즈음. 사소한 것 같은 인터페이스 방법

이지만... 프로그래머라면 누구나 한번쯤 구현에 관심을 가져 보았을 것이다.

여기에서는 이를 쉽고 구현하는 방법과 사용되는 trick을 delphi로 작성하겠다.



tray icon영역에 icon을 다루는 기본적인 함수는



Shell_Notify(command,parameter) 이다. command에 icon add, delete등의 명령을 내리게되고, parameter에 해당 data를 넣어주게된다. (in 'ShellAPI' unit)



Shell_NotifyIcon(NIM_ADD,@IconData); // tray영역에 icon add

Shell_NotifyIcon(NIM_MODIFY,@IconData); // tray영역에 icon modify

Shell_NotifyIcon(NIM_DELETE,@IconData); // tray영역에 icon del



위에서 IconData는 TNOTIFYICONDATA type이며, 다음 코드에서처럼

cbSize,wnd,uID,uFlags, hIcon,szTip,uCallbackMessage등을 field로 가진다.



------------------------

with IconData do begin

cbSize := sizeof(TNOTIFYICONDATA);

wnd := FWindowHandle;

uID := 0; // is not passed in with message so make it 0

uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;

hIcon := fIcon.Handle;

StrPCopy(szTip,fToolTip);

uCallbackMessage := WM_TOOLTRAYICON;

end;

--------------------------



기본적인 내용은 위와 같고, 실제로 이 기능을 이용하기 위해서

사용자가 궂이 새로이 함수들을 만들어 사용할 필요는 없다.

훌륭한 사람들이 위 기능을 수행하는 component를 미리 작성해 놓았기 때문에

"나도 만들수 있지만 뭐.. 만든 사람의 성의를 생각해서 재사용하자"

라는 말 한마디와 가벼이 감사하는 마음을 가지고 이용하면 되겠다.



이 component는 TTrayIcon이라는 이름을 가지고 있고,

자주이용되는 property는 다음과 같다.



Active : boolean; // tray에 icon을 show, hide

Icon : TIcon; // tray에 보여줄 icon을 지정

ToolTip : string; // mouse가 갔을때 보여줄 string지정

PopupMenu : TPopupMenu; // mouse로 right-click했을때 보여줄 menu 지정



이용방법은 ...



1. Icon에 보여줄 아이콘을 지정한다.

trayicon1.icon := Application.icon;



2. tray에 아이콘을 보여주기위하여 property Active에 true값을 지정

trayicon1.active := True;



3. tray에 아이콘을 감추기 위해서는 false값을 Active에 지정

trayicon1.active := False;



응용프로그램이 닫힐때 자동으로 TrayIcon component가 destroy되기때문에

특별히 destructor를 호출할 필요는 없다.



위에서 간단히 TrayIcon을 사용하는 방법에 대하여 알아보았는데...

실제로 응용프로그램에 TrayIcon이 사용되는 메커니즘은 조금 더 복잡하다.

일반적으로 윈도우의 minimize button을 통하여 application이 TrayIcon으로

바뀌고, TrayIcon에서 double-click이나, popup-menu를 이용하여 화면에

윈도우를 정상 복구하게 된다. 이 과정을 위한 구현은 TTrayIcon component에

없으며, 이는 프로그래머가 직접 작성하여야 한다.

delphi에서 이 과정을 구현하려면... delphi component의 내부 문제로 인하여

trick이 필요하다. 이 과정과 trick에 대하여 좀 알아보자



1. 응용프로그램의 minimize button handler를 가로채자

; 이는 다음 한줄로 간단히 된다. 이때 Form이 아니고 application의

event임에 주의하자.

Application.OnMinimize := MinimizeHander;



2. TrayIcon 지정과 활성화

TrayIcon1.Icon := Application.Icon;

TrayIcon1.Active := True;



3. minimize handler에서는 Windows API를 이용하여 응용프로그램을

숨긴다. 이때 주의할점은 숨기는 대상이 MainForm이 아니고,

응용프로그램이라는 점과 프로그래머가 작성한 minimize handler호출뿐만

아니라 윈도우내부의 기본 minimize handler도 작동한다는 점이다.

ShowWindow(Application.Handle,SW_HIDE);



4. trayIcon에서 윈도우를 정상복구시키기 위한 코드는 다음과 같다.



if ( not IsWindowVisible(MainForm.Handle) ) then

begin

ShowWindow(Application.Handle,SW_SHOWMINIMIZED);

ShowWindow(Application.Handle,SW_SHOWNORMAL);

end;

SetForegroundWindow(MainForm.Handle);



앞에서 언급한 Trick부분은 바로 정상복구시키는데 쓰여지는 부분이다.

위코드에서 Application handle에 일반적으로 SW_SHOW를 사용하지 않고,

SW_SHOWMINIMIZED, SW_SHOWNORMAL 을 따로 수행하였으며, 그 다음에

SetForegroundWindow를 또 호출하였다는 점이다.

이는 Try&Error를 걸쳐서 알아낸 방법으로 위와 같이 하지 않으면

TrayIcon interface가 제대로 동작하지 않는다...

저자의 얕은 생각으로는 minimize hander에서 수행한 SW_HIDE 코드이후에

자동으로 default minimize-handler가 수행되었기 때문에..

윈도우 복구시에도 SHOW와 RESTORE를 따로 수행해 주어야 되는것 같다.

이때 SHOW는 단순히 minimized&hide된것을 minimized&show로만 돌려주

어야... 다음 RESTORE에서 minimized 된 윈도우가 정상복구될수 있다고

생각되어진다. 즉, MINIMIZED,HIDE 된 윈도우를 정상복구시키기 위해서는

SHOW_MINIMIZED, RESTORE 두 연산이 따로 수행되어져야 되는것 같다.



같이 올려진 TrayIcon에서 TTrayIcon component와 위에서 언급한것을 간단히

테스트한 minimized 예제가 들어있다. 돌려보고 다시 코드를 살펴보면

앞에서 두서없이 언급한 내용이 좀더 쉽게 알수 있을 것이다.





- Written by 신 우 창, 98/8/24

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함