精华内容
下载资源
问答
  • mfc 最小化到托盘

    2011-10-23 20:25:50
    mfc 开发的关于最小化到托盘的方法 捕获消息的设置
  • MFC最小化到托盘

    2008-05-30 23:22:36
    MFC中实现最小化到托盘
  • VS MFC 最小化到托盘

    2018-11-28 17:07:17
    最近做MFC程序,有个最小化托盘的需求,看代码: 添加宏定义: #define WM_SHOWTASK (WM_USER +1) #define IDR_SHOW 11 #define IDR_OTHER 12 #define IDR_EXIT 13 ...//最小化到托盘 void Remove2Tray(...

    最近做MFC程序,有个最小化托盘的需求,看代码:

    添加宏定义:

    #define WM_SHOWTASK (WM_USER +1)
    #define IDR_SHOW 11
    #define IDR_OTHER 12
    #define IDR_EXIT 13

    .h 中添加几个函数及参数(参数用来保存状态):

    void Hide2Tray();//最小化到托盘
    void Remove2Tray();//删除托盘图标
    BOOL isDestory;//用来区分是窗口的X还是托盘的退出
    afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;//对图标做操作

    在.cpp中添加

    void CTestDemoDlg::Hide2Tray()//最小化到托盘
    {
        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,"OA");//信息提示条为“OA”  
        Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标  
        ShowWindow(SW_HIDE);//隐藏主窗口 
    }
    
    LRESULT CTestDemoDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
    {//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 
        if(wParam != IDR_MAINFRAME) return 1;
        switch (lParam)
        {
        case WM_LBUTTONUP://左键单击显示主界面
            {
                this->ShowWindow(SW_SHOW);
                //SetForegroundWindow();
                //DeleteTray();
            }break;
        case WM_RBUTTONUP://右击弹出菜单
            {
                LPPOINT lpoint = new tagPOINT;
                ::GetCursorPos(lpoint);//得到鼠标位置
                CMenu menu;
                menu.CreatePopupMenu();
                menu.AppendMenu(MFT_STRING, IDR_SHOW, "主界面");
                menu.AppendMenu(MFT_STRING, IDR_OTHER, "其他");
                menu.AppendMenu(MFT_STRING, IDR_EXIT, "退出");
                SetForegroundWindow();
                EnableMenuItem(menu,IDR_OTHER,MF_GRAYED);//"其他"菜单变灰
                //menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x,lpoint->y,this);//显示菜单
                int xx=TrackPopupMenu(menu,TPM_RETURNCMD,lpoint->x,lpoint->y,NULL,this->m_hWnd,NULL);//显示菜单并获取选项ID
                if(xx==IDR_SHOW) 
                {
                    this->ShowWindow(SW_SHOW);
                   // SetForegroundWindow();
                    //DeleteTray();
                }
                else if(xx==IDR_OTHER) {MessageBox("你点击了“其他”菜单","提示",MB_OK);}
    			else if(xx==IDR_EXIT) 
    			{
    				DeleteTray();
    				isDestory = true;
    				OnCancel();
    			}
                HMENU hmenu = menu.Detach();
                menu.DestroyMenu();
                delete lpoint;
            }break;
        case WM_LBUTTONDBLCLK:
            {
                //双击不处理
            }break;
        }
        return 0;
    }
    
      void CTestDemoDlg::Remove2Tray()//销毁托盘图标
    {
      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,"OA");
        Shell_NotifyIcon(NIM_DELETE, &nid);
      }
      void CTestDemoDlg::OnCancel()
      {
    	
    	if(isDestory){
    		CDialog::OnCancel();
    	}
    	else
    	{
    		ShowWindow(SW_HIDE);
    	}
      }
    

    在OnInitDialog()中调用方法:

    Hide2Tray();

    添加消息映射

    BEGIN_MESSAGE_MAP(CTestDemoDlg, CDialog)
    
                    .
                    .
    	ON_MESSAGE(WM_SHOWTASK,OnShowTask)//消息映射
        
                    .
                    .
    END_MESSAGE_MAP()

    结束。

    可能会有小的问题,后续更新。如有问题请留言。

    展开全文
  • 最小化到托盘程序,源代码,视频请看我的其他资源,视频大
  • MFC 最小化到托盘及右击托盘菜单

    千次阅读 2016-01-21 22:30:34
    //托盘图标全局变量//在stdafx.h #define WM_SHOWTASK (WM_USER + 123) // 关联消息映射函数 // 位于BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间 ON_MESSAGE(WM_SHOWTASK,OnShowTask) // 当然要声明和定义OnShowTask()...
    //全局变量
    NOTIFYICONDATA nid;//托盘图标全局变量
    //在stdafx.h
    #define WM_SHOWTASK (WM_USER + 123)
    // 关联消息映射函数
    // 位于BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间
    	ON_MESSAGE(WM_SHOWTASK,OnShowTask)
    // 当然要声明和定义OnShowTask()
    // 在CtestDlg类中声明
    	LRESULT OnShowTask(WPARAM wParam, LPARAM lParam) ;
    void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if (nID == SC_MINIMIZE) // 最小化窗口
    	{
    		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));
    		lstrcpy(nid.szTip, _T("Getpost Domain")); // 信息提示条
    		Shell_NotifyIcon(NIM_ADD, &nid); // 在托盘区添加图标 
    		ShowWindow(SW_HIDE); // 隐藏主窗口 
    		return;
    	}
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    LRESULT CtestDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
    //wParam接收的是图标的ID,lParam接收的是鼠标的动作----最小化到托盘
    {
    	if (wParam != IDR_MAINFRAME)
    		return 1;
    	if (WM_LBUTTONDBLCLK == lParam)
    	{
    		this->ShowWindow(SW_SHOWNORMAL);
    		this->SetForegroundWindow();
    		Shell_NotifyIcon(NIM_DELETE, &nid); // 托盘图标不显示
    	}
    	if (lParam == WM_RBUTTONDOWN)
    	{
    		//右击弹出托盘菜单
    		CMenu menu;
    		menu.LoadMenu(IDR_MENU2);//首先建立菜单项IDR_MENU2
    		CMenu *pPopUp = menu.GetSubMenu(0);
    		CPoint pt;
    		GetCursorPos(&pt);
    		SetForegroundWindow();
    		pPopUp->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
    		PostMessage(WM_NULL, 0, 0);
    	}
    	return 0;
    }
    以上代码在VS2015中测试通过!
    展开全文
  • MFC程序最小化到托盘

    2013-04-27 12:23:20
    MFC程序最小化到托盘的一个最简单的例子 详细的说明见下面地址: http://blog.csdn.net/c_s_d_n_user/article/details/8858085
  • MFC最小化到系统托盘

    2020-09-29 10:17:45
    最小化到系统托盘图标流程:点击窗口最小化->自动隐藏任务栏图标,并在托盘图标那边自动添加->双击托盘图标可自动显示窗口->也可右键托盘图标,选择相应菜单操作。 窗口最小化处理:通过WindowProc处理SC_...

    最小化到系统托盘图标流程:点击窗口最小化->自动隐藏任务栏图标,并在托盘图标那边自动添加->双击托盘图标可自动显示窗口->也可右键托盘图标,选择相应菜单操作。

    窗口最小化处理:通过WindowProc处理SC_MINIMIZE消息,进行添加系统托盘图标。

    LRESULT CshelliconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_SYSCOMMAND:
    		if (SC_MINIMIZE == wParam)
    		{
    			AddShellIcon(); // 添加系统托盘图标
    			ModifyStyleEx(0, WS_EX_TOPMOST); // 去除任务栏图标
    			ShowWindow(SW_HIDE); // 窗体隐藏
    			return 0;
    		}
    		break;
    	default:
    		break;
    	}
    
    	return CDialog::WindowProc(message, wParam, lParam);
    }
    
    void CshelliconDlg::AddShellIcon()
    {
    	// TODO:  在此添加控件通知处理程序代码
    	if (m_bAddShellIcon) return; // 标志位,用于标识是否已经添加托盘图标,防止重复操作。
    	
    	NOTIFYICONDATA  data;
    
    	data.cbSize = sizeof(NOTIFYICONDATA);//结构体的大小
    	data.hWnd = m_hWnd;//接收托盘消息的窗口句柄
    	data.uID = IDR_MAINFRAME;//定义的托盘图标ID
    	data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//设置属性,下面的三个属性是否有效
    	data.uCallbackMessage = WM_ONTRAY;//自定义的消息,使用#define WM_ONTRAY WM_USER + 1
    	data.hIcon = m_hIcon;//显示在系统托盘上的图标
    
    	TCHAR lpszTip[] = _T("shellicon");
    	lstrcpyn(data.szTip, lpszTip, sizeof(lpszTip));//图标上的提示字符串
    
    	Shell_NotifyIcon(NIM_ADD, &data);// 向任务栏的状态栏发送添加托盘图标的消息
    
    	m_bAddShellIcon = TRUE;
    }
    

    托盘图标点击事件响应,通过 此消息类型进行处理

    data.uCallbackMessage = WM_ONTRAY;
    LRESULT DealMsg(WPARAM wParam, LPARAM lParam);
    ON_MESSAGE(WM_ONTRAY, DealMsg)

    	UINT uMouseMsg = (UINT)lParam;
    	if (WM_LBUTTONDBLCLK == uMouseMsg)
    	{
    		ShowWindow(SW_SHOWNOACTIVATE);
    	}
    	else if (WM_RBUTTONDOWN == uMouseMsg)
    	{
    		CMenu menu;
    		VERIFY(menu.LoadMenu(IDR_MENU1));
    		CMenu* pPopup = menu.GetSubMenu(0);
    		ASSERT(pPopup != NULL);
    		CPoint point;
    		GetCursorPos(&point);
    		// 加挂右键菜单
    		int iCmd = pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, this);
    		switch (iCmd)
    		{
    		case ID_SHOW:
    			ShowWindow(SW_SHOWNOACTIVATE);
    			break;
    		case ID_HIDE:
    			CloseWindow();
    			ShowWindow(SW_HIDE);
    			break;
    		case ID_CLOSE:
    			SendMessage(WM_CLOSE);
    			break;
    		default:
    			break;
    		}
    	}
    
    	return 0;
    

    窗口关闭退出,自动删除系统托盘图标。(注:如果不进行删除,则图标会被缓存,直到鼠标移动到此图标才会自动消失)

    void CshelliconDlg::OnClose()
    {
    	// TODO:  在此添加消息处理程序代码和/或调用默认值
    	NOTIFYICONDATA data;
    	data.cbSize = sizeof(NOTIFYICONDATA);
    	data.hWnd = m_hWnd;
    	data.uID = IDR_MAINFRAME;
    
    	Shell_NotifyIcon(NIM_DELETE, &data);
    
    	CDialogEx::OnClose();
    }
    

    至此,最小化到系统托盘图标功能全部完善。 @_@

    展开全文
  • MFC窗口最小化到托盘,文档中有详细的函数介绍,以及实际例子的代码,及详细步骤
  • vs2010 MFC程序最小化到托盘,右键弹出菜单进行设置和退出,双击桌面最前显示
  • 为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实现系统托盘效果。  那么什么是托盘呢?所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。...

        为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实现系统托盘效果。

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

              怎么实现呢?这里需要运用到的Windows API函数:

    BOOL Shell_NotifyIcon(
        DWORD dwMessage, 
        PNOTIFYICONDATA lpdata
    );
    
              函数了里面的参数对于实现不同的效果尤其重要,包括托盘图标、托盘菜单等等。那么我们来了解一下两个参数吧:

    dwMessage可以取以下值:

    NIM_ADD 向托盘中加入一个图标
    NIM_MODIFY 修改托盘中的图标
    NIM_DELETE 从托盘中删除一个图标

    参数pnid是NOTIFYICONDATA结构的一个引用。该结构的原型如下:

    [cpp] view plain copy
    1. typedef struct _NOTIFYICONDATA {   
    2.     DWORD cbSize; // 结构的大小,必须在程序中给出  
    3.     HWND hWnd;    // 程序中将要接收托盘消息的窗口句柄  
    4.     UINT uID;     // 应用程序中定义的托盘图标ID,此参数用作标识  
    5.     UINT uFlags;  //设置属性 标记下边3个参数是否有效  
    6.     UINT uCallbackMessage;// 自定义的消息ID值  
    7.     HICON hIcon;//显示在系统托盘上的Icon的句柄  
    8.     #if (_WIN32_IE < 0x0500)  
    9.         TCHAR szTip[64;// 用于图标显示的提示字符串  
    10.     #else  
    11.         TCHAR szTip[128];  
    12.     #endif  
    13.     #if (_WIN32_IE >= 0x0500)  
    14.         DWORD dwState;   
    15.         DWORD dwStateMask;   
    16.         TCHAR szInfo[256];   
    17.         union {  
    18.             UINT  uTimeout;   
    19.             UINT  uVersion;   
    20.         } DUMMYUNIONNAME;  
    21.         TCHAR szInfoTitle[64];   
    22.         DWORD dwInfoFlags;   
    23.     #endif  
    24.     #if (_WIN32_IE >= 0x600)  
    25.         GUID guidItem;  
    26.     #endif  
    27. } NOTIFYICONDATA, *PNOTIFYICONDATA;   
               具体步骤如下:

    1.在程序中增加一个私有的NOTIFYICONDAT对象

    [cpp] view plain copy
    1. private:  
    2.         NOTIFYICONDATA m_tnid;  
    2.在初始化窗口时对NOTIFYICONDAT对象初始化 用Shell_NotifyIcon函数进行注册
    [cpp] view plain copy
    1. m_notify.cbSize=sizeof NOTIFYICONDATA;  
    2. m_notify.hWnd=this->m_hWnd;    
    3. m_notify.uID=IDR_MAINFRAME;  
    4. m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
    5. strcpy(m_notify.szTip,"Michael_Chen is a good man");  
    6. m_notify.uCallbackMessage=WM_USER_NOTIFYICON;  
    7. m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //OK,下面就是托盘产生了.   
    8. Shell_NotifyIcon(NIM_ADD,&m_notify);  
    3.增加自定义的消息处理函数或者重载WindowProc函数,在消息处理函数或WindowProc函数中对自定义的消息进行处理

    1)运用自定义消息

    i,WM_USER_NOTIFYICON是自定义的消息 在头文件中进行声明;

    [cpp] view plain copy
    1. #define WM_USER_NOTIFYICON WM_USER+1  
    ii,在.h文件中声明消息函数原型
    [cpp] view plain copy
    1. afx_msg LRESULT OnNotifyMsg(WPARAM wparam,LPARAM lparam);  
    iii,在.cpp文件中进行消息映射
    [cpp] view plain copy
    1. BEGIN_MESSAGE_MAP(CNotifyiconDlg, CDialog)  
    2.     //{{AFX_MSG_MAP(CNotifyiconDlg)  
    3.                  ...  
    4.     ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)  
    5.     //}}AFX_MSG_MAP  
    6. END_MESSAGE_MAP()  
    iiii,在.cpp文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。
    [cpp] view plain copy
    1. LRESULT  CNotifyiconDlg::OnNotifyMsg(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.             //确定弹出式菜单的位置     
    18.             menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);     
    19.             //资源回收     
    20.             HMENU    hmenu=menu.Detach();     
    21.             menu.DestroyMenu();     
    22.             delete    lpoint;     
    23.         }     
    24.         break;     
    25.     case    WM_LBUTTONDBLCLK://双击左键的处理     
    26.         {     
    27.             this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿     
    28.         }     
    29.         break;     
    30.     }      
    31.     return 0;  
    32. }  

    2)重载WindowProc函数

    i,重载WindowProc函数(方法略)

    ii,在WindowProc中增加的消息相应代码

    [cpp] view plain copy
    1. //WindowProc中增加的代码  
    2. LRESULT CNotifyiconDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   
    3. {  
    4.     // TODO: Add your specialized code here and/or call the base class  
    5.     switch(message) //判断消息类型  
    6.     {   
    7.     case WM_USER_NOTIFYICON:   
    8.         //如果是用户定义的消息   
    9.         if(lParam==WM_LBUTTONDBLCLK)  
    10.               
    11.         {   
    12.             //鼠标双击时主窗口出现   
    13.             if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态  
    14.             {  
    15.                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口  
    16.             }  
    17.             else  
    18.             {  
    19.                 AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口  
    20.             }  
    21.               
    22.         }   
    23.         else if(lParam==WM_RBUTTONDOWN)  
    24.         { //鼠标右键单击弹出选单   
    25.             CMenu menu;   
    26.             menu.LoadMenu(IDR_MENU1); //载入事先定义的选单   
    27.             CMenu *pMenu=menu.GetSubMenu(0);   
    28.             CPoint pos;   
    29.             GetCursorPos(&pos);   
    30.             pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());   
    31.         }   
    32.         break;   
    33.     case WM_SYSCOMMAND:   
    34.         //如果是系统消息   
    35.         if(wParam==SC_MINIMIZE)  
    36.         {   
    37.             //接收到最小化消息时主窗口隐藏   
    38.             AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);   
    39.             return 0;   
    40.         }   
    41.         if(wParam==SC_CLOSE)  
    42.         {  
    43.             ::Shell_NotifyIcon(NIM_DELETE,&m_notify); //关闭时删除系统托盘图标  
    44.         }  
    45.         break;  
    46.     }  
    47.     return CDialog::WindowProc(message, wParam, lParam);  
    48. }  


            经过以上的步骤,就编写出了一个简单的可以最小化到托盘的程序。该程序在一启动时,在托盘创立应用程序的图标,最小化程序时隐藏主窗口,双击托盘区的图标时,显示主窗口,右键点击托盘区窗口时,弹出菜单。

    展开全文
  • MFC窗口最小化到托盘

    2019-10-02 02:31:59
    把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。绘制图标以及确定图标所传送消息的函数只有一个,那就是 WINSHELLAPI BOOL WINAPI Shell_...
  • 在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现:  第一步,声明一个NOTIFYICONDATA类,也就是NOTIFYICONDATA NotifyIcon;该句可以放在Dlg类的声明中...
  • 本demo实现 1、将程序最小化到托盘 并隐藏 主窗口 双击恢复窗口 2、程序在托盘中的时候 可响应热键组合 消息

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 229
精华内容 91
关键字:

mfc最小化到托盘