1、在资源中的Icon中导入一个自己喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR_MAINFRAME的图标删除掉;
2、在自己的Dialog头文件中定义一个变量 NOTIFYICONDATA m_nid,关于该结构体的具体信息可以查阅MSDN;
3、添加消息响应函数OnInitDialog(),并在该函数中添加以下代码,这样程序一启动,就在托盘中显示出了自己应用程序的图标。
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的错,因为该消息要自己定义。
4、在Dialog头文件中声明消息函数原型
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
5、在Dialog源文件中进行消息映射
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
6、在Dialog源文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。
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 }
7、添加OnSize消息响应函数,处理最小化时的操作。
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 }
8、添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除
1 BOOL CServerDlg::DestroyWindow() 2 { 3 // 在托盘区删除图标 4 Shell_NotifyIcon(NIM_DELETE, &m_nid); 5 return CDialog::DestroyWindow(); 6 }
时间: 2024-11-09 01:55:03