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); //在托盘区删除图标
  • 相关阅读:
    java 实现前面带零的数字进行加减运算(保留前面的0)
    java 判断字符串是否是整数(纯数字:正整数、负整数、0)、至少包含一位小数、数字(可以是整数或小数)
    java 抽象类使用@Autowrited注入对象,子类直接使用父类的该属性
    java、springboot使用proguard混淆代码
    idea 使用阿里云仓库下载的jar包出现证书校验问题(PKIX:unable to find valid certification path to requested target)
    windows10安装zookeeper-3.6.2并生成zookeeper服务
    zookeeper-3.4.8 集群搭建
    zookeeper安装和使用 windows环境
    Dubbo入门---搭建一个最简单的Demo框架
    服务端高并发分布式架构演进之路
  • 原文地址:https://www.cnblogs.com/wumac/p/4583321.html
Copyright © 2011-2022 走看看