zoukankan      html  css  js  c++  java
  • 托盤

    在MFC中怎样将窗口最小化到托盘并恢复


    所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
    一 、原理

    1、最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标。
    2、恢复的原理:将窗口显示,再将托盘中的图片删除。

    二、代码实现

    1、自定义消息WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1)

    2、在MFC的::OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一个命令响应
    if(nID==SC_MINIMIZE) ToTray(); //最小化到托盘的函数

    3、在BEGIN_MESSAGE_MAP(CMy2009Dlg, CDialog)和END_MESSAGE_MAP()中间中添加如下代码
    ON_MESSAGE(WM_SHOWTASK,OnShowTask)
    其中WM_SHOWTASK是消息名,OnShowTask是自己定义的消息响应函数,后面有说明。

    4、最小化到托盘函数
    void CMyDlg::ToTray()
    {
    NOTIFYICONDATA nid;
    nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
    nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME;
    nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
    nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    strcpy(nid.szTip,"程序名称"); //信息提示条
    Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
    ShowWindow(SW_HIDE); //隐藏主窗口
    }

    5、恢复界面函数
    在头文件中定义消息响应函数afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
    //wParam接收的是图标的ID,而lParam接收的是鼠标的行为
    LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM 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.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //资源回收
    HMENU hmenu=menu.Detach();
    menu.DestroyMenu();
    delete lpoint;
    } break;
    case WM_LBUTTONDBLCLK://双击左键的处理
    { this->ShowWindow(SW_SHOW);//显示主窗口
    DeleteTray();
    } break;
    default: break;
    }
    return 0;
    }

    6、删除托盘图标函数
    void CMyDlg::DeleteTray()
    {
    NOTIFYICONDATA nid;
    nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
    nid.hWnd=this->m_hWnd;
    nid.uID=IDR_MAINFRAME;
    nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
    nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
    nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    strcpy(nid.szTip,"程序名称"); //信息提示条为“计划任务提醒”
    Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标
  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/wumac/p/4583321.html
Copyright © 2011-2022 走看看