总结:一个简单的MFC实现最小化托盘效果
2014-11-27 11:04
302 查看
先上说明,最后我会附上代码,我也是临时新学的,请诸位指正
对于头文件中的CxxxDlg类定义而言,需要添加以下几个地方,见下图
对于上图中的最下面的public部分,略作解释
NOTIFYICONDATA m_nid; //添加成员变量
afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam); //添加tray消息响应函数的声明
同时,在当前头文件的上部,记得添加#define UM_TRAYNOTIFY WM_USER
+ 11 //定义tray消息
在CxxxDlg.cpp中,添加如下图中部分内容
如上图红框部分所示,分别在构造函数和析构函数中添加这些初始化和回收的代码。
然后在BEGIN_MESSAGE_MAP(CMFCTest03Dlg,
CDialogEx)和END_MESSAGE_MAP()中间,
添加ON_MESSAGE(UM_TRAYNOTIFY,
&CMFCTest03Dlg::OnTrayNotify),作为消息映射:如下图
其实上图缺少了一个东西,就是ON_WM_SIZE(),应该加在上图的红框附近,这个方法的作用是
“当点击最小化按钮后,不在任务栏中显示当前窗口的图标”
在CxxxDlg类中添加OnInitDialog函数,实现方法如下图所示
在CxxxDlg类中添加OnTrayNotify函数的实现,如下图所示
还是在CxxxDlg类中添加WM_SIZE消息处理,如下图所示
上代码
对于头文件中的CxxxDlg类定义而言,需要添加以下几个地方,见下图
对于上图中的最下面的public部分,略作解释
NOTIFYICONDATA m_nid; //添加成员变量
afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam); //添加tray消息响应函数的声明
同时,在当前头文件的上部,记得添加#define UM_TRAYNOTIFY WM_USER
+ 11 //定义tray消息
在CxxxDlg.cpp中,添加如下图中部分内容
如上图红框部分所示,分别在构造函数和析构函数中添加这些初始化和回收的代码。
然后在BEGIN_MESSAGE_MAP(CMFCTest03Dlg,
CDialogEx)和END_MESSAGE_MAP()中间,
添加ON_MESSAGE(UM_TRAYNOTIFY,
&CMFCTest03Dlg::OnTrayNotify),作为消息映射:如下图
其实上图缺少了一个东西,就是ON_WM_SIZE(),应该加在上图的红框附近,这个方法的作用是
“当点击最小化按钮后,不在任务栏中显示当前窗口的图标”
在CxxxDlg类中添加OnInitDialog函数,实现方法如下图所示
在CxxxDlg类中添加OnTrayNotify函数的实现,如下图所示
还是在CxxxDlg类中添加WM_SIZE消息处理,如下图所示
上代码
<span style="font-family:KaiTi_GB2312;font-size:14px;">// MFCTest03Dlg.h : 头文件 // #pragma once #define UM_TRAYNOTIFY WM_USER + 11 // CMFCTest03Dlg 对话框 class CMFCTest03Dlg : public CDialogEx { // 构造 public: CMFCTest03Dlg(CWnd* pParent = NULL); // 标准构造函数 ~CMFCTest03Dlg(void); // 对话框数据 enum { IDD = IDD_MFCTEST03_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: //添加成员变量 NOTIFYICONDATA m_nid; //添加tray消息响应函数的声明 afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam); void CMFCTest03Dlg::OnSize(UINT nType, int cx, int cy); }; </span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">// MFCTest03Dlg.cpp : 实现文件 // #include "stdafx.h" #include "MFCTest03.h" #include "MFCTest03Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { EnableActiveAccessibility(); } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCTest03Dlg 对话框 CMFCTest03Dlg::CMFCTest03Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCTest03Dlg::IDD, pParent) { EnableActiveAccessibility(); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); memset(&m_nid, 0, sizeof(m_nid)); // Initialize NOTIFYICONDATA struct m_nid.cbSize = sizeof(m_nid); m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; } CMFCTest03Dlg::~CMFCTest03Dlg(void){ m_nid.hIcon = NULL; Shell_NotifyIcon(NIM_DELETE, &m_nid); } void CMFCTest03Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCTest03Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(UM_TRAYNOTIFY, &CMFCTest03Dlg::OnTrayNotify) ON_WM_SIZE() END_MESSAGE_MAP() // CMFCTest03Dlg 消息处理程序 BOOL CMFCTest03Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 ShowWindow(SW_MAXIMIZE); //括号中如果改为SW_SHOWNORMAL,则点击托盘后,窗口还原,否则窗口在任务栏最小化 // TODO: 在此添加额外的初始化代码 m_nid.hWnd = GetSafeHwnd(); m_nid.uCallbackMessage = UM_TRAYNOTIFY; // Set tray icon and tooltip m_nid.hIcon = m_hIcon; // Set tray notification tip information CString strToolTip = _T("托盘程序"); _tcsncpy_s(m_nid.szTip, strToolTip, strToolTip.GetLength()); Shell_NotifyIcon(NIM_ADD, &m_nid); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCTest03Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCTest03Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMFCTest03Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } LRESULT CMFCTest03Dlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) { // if(wParam != IDI_ICON1) return 1; switch(lParam) { case WM_RBUTTONUP: // 右键起来时弹出菜单 { LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint); // 得到鼠标位置 CMenu menu; menu.CreatePopupMenu(); // 声明一个弹出式菜单 menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end of this menu //Displays a floating pop-up menu at the specified location and tracks the selection of items on the pop-up menu menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this); HMENU hmenu = menu.Detach(); menu.DestroyMenu(); delete lpoint; break; } case WM_LBUTTONDBLCLK: // 双击左键的处理 this->ShowWindow(SW_SHOWNORMAL); // 显示主窗口 break; } return 0; } void CMFCTest03Dlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if(nType == SIZE_MINIMIZED){ ShowWindow(SW_HIDE); } }</span>
相关文章推荐
- MFC总结(15) --- 实现图片移动 小火箭简单效果
- DEV中的TreeList控件应用的一个小效果实现——个人总结
- MFC 程序最小化到系统托盘区的一个简单实例 .
- 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站
- 代码录播:jQueryMobile 实现一个简单的弹出框效果
- 用MFC实现的一个简单的photoshop软件的制作代码
- [置顶] MFC 程序最小化到系统托盘区的一个简单实例
- MFC对话框最小化到托盘编程实现步骤
- MFC定时关机程序的实现3-最小化到托盘栏
- jquery实现的一个简单进度条效果实例
- JQuery实现一个简单的鼠标跟随提示效果
- C#实现一个图形的动态效果(简单矩形不断向下运动的实现简单步骤)
- css3和jQuery实现一个简单的标签页效果
- 自己实现的一个简单的相册效果
- MFC实现最小化到托盘
- Unity3d 一个简单的玻璃效果实现!
- 一个mfc实现的简单计算功能
- html5实现的一个简单的下雨效果
- MFC窗口实现最小化到托盘 右键菜单和还原
- 一个js实现简单的字幕滚动效果