系统托盘的制作步骤

    技术2022-05-20  50

    首先建立 一个MFC对话框程序,我准备为这个对话框程序制作一个托盘。  1.实现将图标放入系统托盘的功能。 (1)首先声明一个全局变量 NOTIFYICONDATA nd nd名字可以随便起 就是在C工程名Dlg中右键增加成员变量,类型为NOTIFYICONDATA 名字为nd  属性public (2)然后同样右键增加成员函数 ,新建一个AddIcon()函数,类型void 属性public 增加后会让你添加函数的代码 void CMy5Dlg::AddIcon() { // 将图标放入系统托盘  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;  strcpy(nd.szTip, "系统托盘->详解");     //这个是托盘的注释  Shell_NotifyIcon(NIM_ADD, &nd);     //增加托盘 } (3)在C工程名Dlg类里 

    在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的消息处理函数:

    最新回复(0)