<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[观夏Note]]></title> 
<link>//gm.angeldm.com/index.php</link> 
<description><![CDATA[新技术番]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[观夏Note]]></copyright>
<item>
<link>//gm.angeldm.com/post//</link>
<title><![CDATA[MFC：怎么将程序窗口最小化到系统托盘]]></title> 
<author>果面 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[程序开发]]></category>
<pubDate>Tue, 21 Feb 2012 13:56:59 +0000</pubDate> 
<guid>//gm.angeldm.com/post//</guid> 
<description>
<![CDATA[ 
	（一）原理<br/><br/>1、最小化的原理：首先要将窗口隐藏，然后在右下角绘制图标。<br/><br/>2、恢复的原理：将窗口显示，再将托盘中的图片删除。<br/><br/>（二）程序实现<br/><br/>1、自定义消息WM_SHOWTASK：<br/><div class="code"><br/>#define WM_SHOWTASK (WM_USER +1)<br/></div><br/>2、在MFC的::OnSysCommand(UINT nID, LPARAM lParam)&nbsp;&nbsp; 函数体中增加一个命令响应<br/><div class="code"><br/>if(nID==SC_MINIMIZE)<br/>ToTray();&nbsp;&nbsp;//最小化到托盘的函数<br/></div><br/><br/>3、在消息映射中添加<br/><div class="code"><br/>ON_MESSAGE(WM_SHOWTASK,OnShowTask);&nbsp;&nbsp;//其中WM_SHOWTASK是消息名，<br/></div><br/>OnShowTask是自己定义的消息响应函数，后面有说明。<br/><br/>（三）具体函数内容<br/><br/>1、最小化到托盘函数<br/><div class="code"><br/>void CMyDlg::ToTray()<br/><br/>&#123;<br/><br/>NOTIFYICONDATA nid;<br/><br/>nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);<br/><br/>nid.hWnd=this-&gt;m_hWnd;<br/><br/>nid.uID=IDR_MAINFRAME;<br/><br/>nid.uFlags=NIF_ICON&#124;NIF_MESSAGE&#124;NIF_TIP ;<br/><br/>nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称<br/><br/>nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));<br/><br/>strcpy(nid.szTip,”程序名称”);&nbsp;&nbsp;&nbsp;&nbsp;//信息提示条<br/><br/>Shell_NotifyIcon(NIM_ADD,&amp;nid);&nbsp;&nbsp;&nbsp;&nbsp;//在托盘区添加图标<br/><br/>ShowWindow(SW_HIDE);&nbsp;&nbsp;&nbsp;&nbsp;//隐藏主窗口<br/><br/>&#125;<br/></div><br/>2、恢复界面函数<br/><br/>在头文件中定义消息响应函数<br/><div class="code"><br/>afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;<br/><br/>//wParam接收的是图标的ID，而lParam接收的是鼠标的行为<br/><br/>LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)<br/><br/>&#123;<br/><br/>if(wParam!=IDR_MAINFRAME)<br/><br/>return 1;<br/><br/>switch(lParam)<br/><br/>&#123;<br/><br/>case WM_RBUTTONUP://右键起来时弹出快捷菜单，这里只有一个“关闭”<br/><br/>&#123;<br/><br/>LPPOINT lpoint=new tagPOINT;<br/><br/>::GetCursorPos(lpoint);//得到鼠标位置<br/><br/>CMenu menu;<br/><br/>menu.CreatePopupMenu();//声明一个弹出式菜单<br/><br/>menu.AppendMenu(MF_STRING,WM_DESTROY,”关闭”); //增加菜单项“关闭”，点击则发送消息WM_DESTROY给主窗口（已隐藏），将程序结束。<br/><br/>menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint-&gt;x,lpoint-&gt;y,this); //确定弹出式菜单的位置<br/><br/>HMENU hmenu=menu.Detach();<br/><br/>menu.DestroyMenu(); //资源回收<br/><br/>delete lpoint;<br/><br/>&#125;&nbsp;&nbsp;break;<br/><br/>case WM_LBUTTONDBLCLK:&nbsp;&nbsp; //双击左键的处理<br/><br/>&#123;<br/><br/>this-&gt;ShowWindow(SW_SHOW);//简单的显示主窗口完事儿<br/><br/>DeleteTray();<br/><br/>&#125;&nbsp;&nbsp;break;<br/><br/>default:&nbsp;&nbsp; break;<br/><br/>&#125;<br/><br/>return 0;<br/><br/>&#125;<br/></div><br/>3、删除托盘图标函数<br/><div class="code"><br/>void CMyDlg::DeleteTray()<br/><br/>&#123;<br/><br/>NOTIFYICONDATA nid;<br/><br/>nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);<br/><br/>nid.hWnd=this-&gt;m_hWnd;<br/><br/>nid.uID=IDR_MAINFRAME;<br/><br/>nid.uFlags=NIF_ICON&#124;NIF_MESSAGE&#124;NIF_TIP ;<br/><br/>nid.uCallbackMessage=WM_SHOWTASK;&nbsp;&nbsp; //自定义的消息名称<br/><br/>nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));<br/><br/>strcpy(nid.szTip,”程序名称”);&nbsp;&nbsp;&nbsp;&nbsp;//信息提示条为“计划任务提醒”<br/><br/>Shell_NotifyIcon(NIM_DELETE,&amp;nid);&nbsp;&nbsp;&nbsp;&nbsp;//在托盘区删除图标<br/><br/>&#125;<br/></div>
]]>
</description>
</item><item>
<link>//gm.angeldm.com/read.php?&amp;guid=0#topreply</link>
<title><![CDATA[[评论] MFC：怎么将程序窗口最小化到系统托盘]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>//gm.angeldm.com/read.php?&amp;guid=0#topreply</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>