MFC 托盘 vs2017 tray

MFC 托盘 vs2017 tray

参考

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

自定义消息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重载OnClose

在这里插入图片描述

在这里插入图片描述

添加托盘菜单

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

演示效果

在这里插入图片描述
在这里插入图片描述

SimpleTrayTestDlg.h:

// SimpleTrayTestDlg.h: 头文件
//

#pragma once

#define WM_ICON_NOTIFY  WM_USER+100

// CSimpleTrayTestDlg 对话框
class CSimpleTrayTestDlg : public CDialogEx
{
// 构造
public:
	CSimpleTrayTestDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_SIMPLETRAYTEST_DIALOG };
#endif

	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()
	afx_msg LRESULT OnIconNotify(WPARAM wParam, LPARAM lParam);
public:
	afx_msg void OnClose();
	afx_msg void OnTrayRestore();
	afx_msg void OnTrayExit();
};

SimpleTrayTestDlg.cpp


// SimpleTrayTestDlg.cpp: 实现文件
//

#include "stdafx.h"
#include "SimpleTrayTest.h"
#include "SimpleTrayTestDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CSimpleTrayTestDlg 对话框



CSimpleTrayTestDlg::CSimpleTrayTestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SIMPLETRAYTEST_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSimpleTrayTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSimpleTrayTestDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_ICON_NOTIFY, &CSimpleTrayTestDlg::OnIconNotify)
	ON_WM_CLOSE()
	ON_COMMAND(ID_TRAY_RESTORE, &CSimpleTrayTestDlg::OnTrayRestore)
	ON_COMMAND(ID_TRAY_EXIT, &CSimpleTrayTestDlg::OnTrayExit)
END_MESSAGE_MAP()


// CSimpleTrayTestDlg 消息处理程序

BOOL CSimpleTrayTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		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);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	//设置系统托盘
	NOTIFYICONDATA NotifyIcon;
	NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
	NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	NotifyIcon.hWnd = m_hWnd;
	lstrcpy(NotifyIcon.szTip, _T("我的托盘程序"));
	NotifyIcon.uCallbackMessage = WM_ICON_NOTIFY;//自定义消息
	NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	Shell_NotifyIcon(NIM_ADD, &NotifyIcon);   //添加系统托盘

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CSimpleTrayTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}

	if (nID == SC_MINIMIZE)
	{
		ShowWindow(FALSE);//隐藏窗口
	}

}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSimpleTrayTestDlg::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 CSimpleTrayTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



afx_msg LRESULT CSimpleTrayTestDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
	switch (lParam)
	{
		case WM_LBUTTONDOWN://点击左键,调出程序
		{
			AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
			SetForegroundWindow();
			break;
		}
		case WM_RBUTTONUP://点击右键,出现选择菜单
		{
			POINT point;
			HMENU hMenu, hSubMenu;
			GetCursorPos(&point); //鼠标位置
			hMenu = LoadMenu(NULL,
				MAKEINTRESOURCE(IDR_MENU_TRAY)); //菜单的ID
			hSubMenu = GetSubMenu(hMenu, 0);
			SetForegroundWindow();

			TrackPopupMenu(hSubMenu, 0,
				point.x, point.y, 0, m_hWnd, NULL);
			break;
		}
	}

	return 0;
}


void CSimpleTrayTestDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	MessageBox(_T("Hello Exit"));
	NOTIFYICONDATA nd ;

	nd.cbSize = sizeof(NOTIFYICONDATA);
	nd.hWnd = m_hWnd;
	nd.uID = IDR_MAINFRAME;
	//nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	//nd.uCallbackMessage = WM_ICON_NOTIFY;
	//nd.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//Shell_NotifyIcon(NIM_DELETE, &nd);


	CDialogEx::OnClose();
}


void CSimpleTrayTestDlg::OnTrayRestore()
{
	// TODO: 在此添加命令处理程序代码
	AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
	SetForegroundWindow();

}


void CSimpleTrayTestDlg::OnTrayExit()
{
	// TODO: 在此添加命令处理程序代码
	//MessageBox(_T("Hello"));
	OnClose();
	CDialogEx::OnCancel();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值