一、在资源中的Icon中导入一个本身喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR_MAINFRAME的图标删除掉;服务器
二、在本身的Dialog头文件中定义一个变量 NOTIFYICONDATA m_nid,关于该结构体的具体信息能够查阅MSDN;函数
三、添加消息响应函数OnInitDialog(),并在该函数中添加如下代码,这样程序一启动,就在托盘中显示出了本身应用程序的图标。this
1 //---------------------------托盘显示---------------------------------// 2 3 m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); 4 5 m_nid.hWnd = this->m_hWnd; 6 7 m_nid.uID = IDR_MAINFRAME; 8 9 m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; 10 11 m_nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称 12 13 m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); 14 15 strcpy(m_nid.szTip, "服务器程序"); // 信息提示条为"服务器程序",VS2008 UNICODE编码用wcscpy_s()函数 16 17 Shell_NotifyIcon(NIM_ADD, &m_nid);// 在托盘区添加图标
这时候编译,会报WM_SHOWTASK的错,由于该消息要本身定义。编码
四、在Dialog头文件中声明消息函数原型 spa
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
五、在Dialog源文件中进行消息映射code
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
六、在Dialog源文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。blog
1 LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam) 2 { 3 if(wParam != IDR_MAINFRAME) 4 return 1; 5 switch(lParam) 6 { 7 case WM_RBUTTONUP: // 右键起来时弹出菜单 8 { 9 LPPOINT lpoint = new tagPOINT; 10 ::GetCursorPos(lpoint);// 获得鼠标位置 11 CMenu menu; 12 menu.CreatePopupMenu();// 声明一个弹出式菜单 13 menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭"); 14 menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this); 15 HMENU hmenu = menu.Detach(); 16 menu.DestroyMenu(); 17 delete lpoint; 18 } 19 break; 20 case WM_LBUTTONDBLCLK: // 双击左键的处理 21 { 22 this->ShowWindow(SW_SHOWNORMAL);// 显示主窗口 23 } 24 25 break; 26 } 27 return 0; 28 }
七、添加OnSize消息响应函数,处理最小化时的操做。ip
1 void CServerDlg::OnSize(UINT nType, int cx, int cy) 2 { 3 CDialog::OnSize(nType, cx, cy); 4 if(nType == SIZE_MINIMIZED) 5 { 6 ShowWindow(SW_HIDE); // 当最小化市,隐藏主窗口 7 } 8 }
八、添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除资源
1 BOOL CServerDlg::DestroyWindow() 2 { 3 // 在托盘区删除图标 4 Shell_NotifyIcon(NIM_DELETE, &m_nid); 5 return CDialog::DestroyWindow(); 6 }