在OnInitDialog()里面,return TRUE之前,添加:
AddIcon();
这样 托盘图标就出现了 2.对托盘图标的操作(1)在CMyDlg类的头文件中定义: //用户定义的消息 #define MYWM_NOTIFYICON WM_USER+1
(2)
我们重载WindowProc()函数, 此外,我们还希望在主框架窗口最小化时图标不在任务栏的空白区出现,在此函数中同时作相应处理。(重载WindowProc函数: 右键CMyDlg类->Add Virtual Function->选择WindowProc->Add and Edit)
代码如下 LRESULT CMy333Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case MYWM_NOTIFYICON: //如果是用户定义的消息 if(lParam==WM_LBUTTONDBLCLK) { //鼠标双击时主窗口出现 AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); } else if(lParam==WM_RBUTTONDOWN){ SetForegroundWindow(); //这句代码是当单击窗体其他地方时候,下拉菜单消失 //鼠标右键单击弹出选单 CMenu menu; menu.LoadMenu(IDR_RIGHT_MENU); //载入事先定义的选单 这个菜单是你提前建好的下拉菜单名字就是IDR_RIGHT_MENU CMenu*pMenu=menu.GetSubMenu(0); CPoint pos; GetCursorPos(&pos); pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd()); } break; case WM_SYSCOMMAND: //如果是系统消息 if(wParam==SC_MINIMIZE) { //接收到最小化消息时主窗口隐藏 AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); return 0; } break; } return CDialog::WindowProc(message, wParam, lParam); }3.// 将图标从系统托盘中删除
做了这个代码后 如果关掉程序 托盘会立即消失 不会延时
为使应用程序退出时图标消失,映射WM_DESTROY消息! (映射WM_DESTROY->右键CMyDlg类->Add Windows Message Handler->左边选择WM_DESTROY->Add and Edit)
void CMyDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here // 将图标从系统托盘中删除 //NOTIFYICONDATA nd; nd.cbSize = sizeof (NOTIFYICONDATA); nd.hWnd = m_hWnd; nd.uID = IDR_MAINFRAME; nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; nd.uCallbackMessage = MYWM_NOTIFYICON; nd.hIcon = m_hIcon; Shell_NotifyIcon(NIM_DELETE, &nd);}
4.添加菜单消息处理函数 在右键菜单中选择一项后,就会发送命令消息WM_COMMAND,在ClassWizard里添加WM_COMMAND的消息处理函数: