VC最小化到托盘程式

参考文章:http://www.cnblogs.com/zhangpengshou/archive/2009/07/11/1520819.html

基本上是按照这篇文章所写的方法来做的,只有稍许改动。

在VC6.0下实现的步骤如下:

一、创建基于对话框的MFC程式

二、导入一图标ICON,ID设为IDI_TRAY

三、为新建的对话框类添加成员变量 NOTIFYICONDATA    m_nid;

四、自定义消息,后面会用到。#define   WM_SHOWTASK   WM_USER+100

五、在OnInitDialog()对话框初始化函数中添加如下代码

// TODO: Add extra initialization here
	m_nid.cbSize = sizeof(m_nid);
	m_nid.hWnd   = this->GetSafeHwnd();              //自定义消息发送的窗口
	m_nid.hIcon  = AfxGetApp()->LoadIcon(IDI_TRAY);  //导入的ICON,在托盘中显示
	m_nid.uCallbackMessage = WM_SHOWTASK;            //自定义的消息
	m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	m_nid.uID = 100;   /*WM_SHOWTASK*/               //ID,好像随便定个值就OK了
	_tcscpy(m_nid.szTip, TEXT("TrayDlg"));           //信息提示条
	Shell_NotifyIcon(NIM_ADD, &m_nid);               //在托盘区添加图标
六、在新建的对话框类中添加消息响应函数

virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

七、在源文件中进行消息映射

BEGIN_MESSAGE_MAP(CTrayDlgDlg, CDialog)
//{{AFX_MSG_MAP(CTrayDlgDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_SHOWTASK, OnShowTask)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
八、实现消息响应函数
LRESULT CTrayDlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{
	switch(lParam)
	{
	case WM_RBUTTONUP:        //右键弹时弹出菜单
		{	
			CPoint pnt;
			::GetCursorPos(&pnt);                    //得到鼠标位置
			CMenu menu;
			menu.CreatePopupMenu();                  //声明一个弹出式菜单
			menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭");
			menu.TrackPopupMenu(TPM_LEFTALIGN, pnt.x, pnt.y, this);
			HMENU hmenu = menu.Detach();
			menu.DestroyMenu();
		}
		break;
	case WM_LBUTTONDBLCLK:    //双击左键的处理
		{
			this->ShowWindow(SW_SHOWNORMAL);   //显示主窗口
			//this->ShowWindow(SW_SHOW);       //注意SW_SHOW与SW_SHOWNORMAL的区别
		}
		break;
	}
	return 0;
}
九、 添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除
BOOL CTrayDlgDlg::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
    Shell_NotifyIcon(NIM_DELETE, &m_nid);   // 在托盘区删除图标
	return CDialog::DestroyWindow();
}

OK了。。。。。。。。

你可能感兴趣的:(VC最小化到托盘程式)