MFC将窗口最小化到托盘

1、在头文件中自定义消息:#define  WM_SHOWTASK  WM_USER+1以及声明消息响应函数:   afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam);

声明一个结构体变量:NOTIFYICONDATA nid;

2、在cpp文件消息映射中添加: ON_MESSAGE(WM_SHOWTASK , onShowTask)

3、最小化到托盘函数:

  1. void CVS2010_SerialPortDlg::OnBnClickedButton2()  
  2. {  
  3.     nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);   
  4.     nid.hWnd=this->m_hWnd;   
  5.     nid.uID=IDR_MAINFRAME; //通过多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd,例如QQ修改登录状态时,图标也会变  
  6.     nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)  
  7.     nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称   
  8. //应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,  
  9. //系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了  
  10. //消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,  
  11. //例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。  
  12.     nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //图标的句柄  
  13.     strcpy(nid.szTip,”VS2010_SerialPortDlg”);    //信息提示条  
  14.     Shell_NotifyIcon(NIM_ADD,&nid);    //在托盘区添加图标   
  15.     ShowWindow(SW_HIDE);    //隐藏主窗口,像QQ一登录就会有托盘和主界面同时存在,这样的话不需要隐藏主界面  
  16. }  
void CVS2010_SerialPortDlg::OnBnClickedButton2()
{
    nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); 
    nid.hWnd=this->m_hWnd; 
    nid.uID=IDR_MAINFRAME; //通过多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd,例如QQ修改登录状态时,图标也会变
    nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)
    nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称 
//应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,
//系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了
//消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,
//例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //图标的句柄
    strcpy(nid.szTip,"VS2010_SerialPortDlg");    //信息提示条
    Shell_NotifyIcon(NIM_ADD,&nid);    //在托盘区添加图标 
    ShowWindow(SW_HIDE);    //隐藏主窗口,像QQ一登录就会有托盘和主界面同时存在,这样的话不需要隐藏主界面
}
4、消息响应函数onShowTask原型:

  1. LRESULT CVS2010_SerialPortDlg::onShowTask(WPARAM wParam,LPARAM lParam)   
  2. //wParam接收的是图标的ID,而lParam接收的是鼠标的行为   
  3. {   
  4.     if(wParam!=IDR_MAINFRAME)   
  5.         return 1;   
  6.     switch(lParam)   
  7.     {      
  8.     case WM_RBUTTONUP://右键起来时弹出快捷菜单   
  9.         {   
  10.             LPPOINT lpoint=new tagPOINT;   
  11.             ::GetCursorPos(lpoint);//得到鼠标位置   
  12.             CMenu menu;   
  13.             menu.CreatePopupMenu();//声明一个弹出式菜单   
  14.             //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已   
  15.             //隐藏),将程序结束。   
  16.             menu.AppendMenu(MF_STRING,WM_DESTROY,”关闭”);   
  17.         menu.AppendMenu(MF_STRING,WM_RESHOW,”打开”);//自己定义的命令,需要手动添加命令响应函数  
  18.             //确定弹出式菜单的位置   
  19.             menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);   
  20.             //资源回收   
  21.             HMENU hmenu=menu.Detach();   
  22.             menu.DestroyMenu();           
  23.             delete lpoint;   
  24.         }   
  25.         break;   
  26.     case WM_LBUTTONUP://左键起来时打开界面  
  27.         {   
  28.            ShowWindow(SW_SHOW);//显示主窗口  
  29.            //DeleteTray();//删除托盘  
  30.         }   
  31.         break;   
  32.     case  WM_LBUTTONDBLCLK://左键双击,添加相应的功能  
  33.         break;  
  34.     }   
  35.     return 0;   
  36. }   
LRESULT CVS2010_SerialPortDlg::onShowTask(WPARAM wParam,LPARAM lParam) 
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 
{ 
    if(wParam!=IDR_MAINFRAME) 
        return 1; 
    switch(lParam) 
    {    
    case WM_RBUTTONUP://右键起来时弹出快捷菜单 
        { 
            LPPOINT lpoint=new tagPOINT; 
            ::GetCursorPos(lpoint);//得到鼠标位置 
            CMenu menu; 
            menu.CreatePopupMenu();//声明一个弹出式菜单 
            //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 
            //隐藏),将程序结束。 
            menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); 
        menu.AppendMenu(MF_STRING,WM_RESHOW,"打开");//自己定义的命令,需要手动添加命令响应函数
            //确定弹出式菜单的位置 
            menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); 
            //资源回收 
            HMENU hmenu=menu.Detach(); 
            menu.DestroyMenu();         
            delete lpoint; 
        } 
        break; 
    case WM_LBUTTONUP://左键起来时打开界面
        { 
           ShowWindow(SW_SHOW);//显示主窗口
           //DeleteTray();//删除托盘
        } 
        break; 
    case  WM_LBUTTONDBLCLK://左键双击,添加相应的功能
        break;
    } 
    return 0; 
} 
5、删除托盘函数:

  1. void CVS2010_SerialPortDlg::DeleteTray()  
  2. {  
  3.     Shell_NotifyIcon(NIM_DELETE, &nid);    //在托盘区删除图标  
  4. }  
void CVS2010_SerialPortDlg::DeleteTray()
{
    Shell_NotifyIcon(NIM_DELETE, &nid);    //在托盘区删除图标
}
6、RESHOW命令响应函数:

  1. void CVS2010_SerialPortDlg::OnReshow(){  
  2.     ShowWindow(SW_SHOW);  
  3.     //DeleteTray();  
  4. }  
void CVS2010_SerialPortDlg::OnReshow(){
    ShowWindow(SW_SHOW);
    //DeleteTray();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值