2014년 10월 26일 일요일

움직이는 트레이 아이콘 직접 코드 추가하는 방식으로....

이전 글에서 클래스를 추가해서 하는 방식을 올렸는데, 클래스를 추가하면 실행파일의 덩치도 커지기 때문에, 간단하게 움직이는 트레이 아이콘을 직접 추가해보겠습니다. 머 어렵지는 않지만-_-;

먼저 WM_TIMER를 사용해야 하므로, 재정의를 합니다.

그 다음 타이머에서 인식할 ID를 하나 만들어야겠죠.

#define TIMER_TRAY_ICON 5

이렇게 했다고 합니다.

우선 프로그램이 초기화 하는 곳에서 트레이 아이콘을 생성했다고 치겠습니다. 트레이 아이콘 생성방법은 제 블로그에 보면 있습니다. 사용자 지정 메시지 핸들러도 있습니다. 트레이 아이콘에서 오른쪽 마우스나 기타 다른 메시지를 받을 분들은 참고 하시면 됩니다.

음...그리고 icon이미지가 프레임별로 있어야겠죠. 필요한 만큼 리소스에 첨부하고, 하나의 변수를 선언합니다.

int count;

초기화는 0으로 합니다.

OnTimer에서

if(nIDEvent==TIMER_TRAY_ICON)
{
}

이렇게 해주셔야 겠죠. 이 안에 count변수를 증가시키고, 프레임수가 넘어가면 다시 0으로 초기화 하는 코드를 넣습니다.
예를 들면...

count++;
if(count>7)
count=0;

이렇게 말이죠.

그 다음 count를 증가시키고, icon을 그려줄 함수를 불러줍니다. 이부분은 알아서 생성하세요. 전 AnimatedTrayIcon()으로 하겠습니다.

그럼 이 함수안에다가 이런식으로 구성을 해주시면 됩니다.

 NOTIFYICONDATA nid;
 ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
 nid.cbSize=sizeof(nid);
 nid.hWnd=m_hWnd;
 nid.uFlags=NIF_TIP|NIF_ICON|NIF_MESSAGE;
 nid.uID=IDR_MAINFRAME;
 nid.uCallbackMessage=WM_TRAYNOTIFY;
 lstrcpy(nid.szTip,"Login DVR");
 switch(count)
 {
 case 0 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON1);
  break;
 case 1 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON2);
  break;
 case 2 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON3);
  break;
 case 3 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON4);
  break;
 case 4 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON5);
  break;
 case 5 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON6);
  break;
 case 6 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON7);
  break;
 case 7 :
  nid.hIcon=AfxGetApp()->LoadIcon(IDI_LOGINICON8);
  break;
 }
 ::Shell_NotifyIcon(NIM_MODIFY, &nid);

트레이 아이콘을 생성할 줄 안다면 이건 아시겠죠? 그냥 아이콘을 수정할 뿐입니다.

아 그리고 가장 중요한거...SetTimer를 해주셔야 되죠. 이건 사용하실 분들이 적절한 위치에서 불러주시면 되겠습니다. SetTimer(TIMER_TRAY_ICON, 150, 0); 해보니까 150정도가 좋은거 같아요. 100~150

그리고 KillTimer 해주셔야 되는거 잊지 마시고요.

댓글 없음: