利用MFC实现一个托盘功能


在这里插入图片描述
右键点击托盘,弹出如下的图标
在这里插入图片描述

1.将主窗口隐藏起来,并移除任务栏图标显示

在CMFCApplication2Dlg::OnInitDialog进行初始化

	int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
	int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
	SetWindowPos(NULL, nFullWidth, nFullHeight, 0, 0, SWP_NOZORDER);  
	//设置0像素,移到最角落  或者:MoveWindow(0,0,0,0);
	ShowWindow(SW_HIDE);
	ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);  //移除任务栏图标显示

2. 制作系统托盘

在CMFCApplication2Dlg类中增加两个成员与一个函数

	NOTIFYICONDATA NotifyIcon;  //系统托盘类
	CMenu menu;
	afx_msg LRESULT OnSystemtray(WPARAM wParam, LPARAM lParam);

在BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx) 与END_MESSAGE_MAP()之间添加自定义消息
#define WM_SYSTEMTRAY WM_USER+100

ON_MESSAGE(WM_SYSTEMTRAY, &CMFCApplication2Dlg::OnSystemtray)

OnSysCommand的实现

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

在CMFCApplication2Dlg::OnInitDialog进行初始化

	//设置系统托盘
	NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
	//NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	NotifyIcon.hIcon = m_hIcon;  //上面那句也可以
	NotifyIcon.hWnd = m_hWnd;
	lstrcpy(NotifyIcon.szTip, _T("更改端口"));
	NotifyIcon.uCallbackMessage = WM_SYSTEMTRAY;
	NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	Shell_NotifyIcon(NIM_ADD, &NotifyIcon);   //添加系统托盘
	//声明一个弹出式菜单
	menu.CreatePopupMenu();
	menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出"));
	menu.AppendMenu(MF_STRING, WM_SETPOWERBOOT, _T("开启开机自启动"));
	menu.AppendMenu(MF_STRING, WM_CANCELPOWERBOOT, _T("关闭开机自启动"));

3. 右键托盘得到信息

在这里插入图片描述

afx_msg LRESULT CMFCApplication2Dlg::OnSystemtray(WPARAM wParam, LPARAM lParam)
{
	switch (lParam)
	{
	case  WM_RBUTTONDOWN://右键起来时弹出快捷菜单
	{
		//menu.LoadMenuW(IDR_MENU1);//加载菜单资源
		LPPOINT lpoint = new tagPOINT;
		::GetCursorPos(lpoint);//得到鼠标位置
		//确定弹出式菜单的位置
		menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
		break;
	}
	case  WM_LBUTTONDOWN://左键单击的处理     
	{
		//....
	}
	}
	return 0;
}

4. 选择信息栏触发事件

在这里插入图片描述

BOOL CMFCApplication2Dlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	switch (LOWORD(wParam))
	{
	case WM_DESTROY:
	{
		OnDestroy();
		break;
	}
	case WM_SETPOWERBOOT:
	{
		OnSetPowerBoot(wParam, lParam);
		break;
	}
	case WM_CANCELPOWERBOOT:
	{
		OnCancelPowerBoot(wParam, lParam);
		break;
	}
	}
	return CDialogEx::OnCommand(wParam, lParam);
}

5. 添加开机自启动与关闭开机自启动OnSetPowerBoot与OnCancelPowerBoot

在BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx) 与END_MESSAGE_MAP()之间添加自定义消息
#define WM_SETPOWERBOOT WM_USER+101
#define WM_CANCELPOWERBOOT WM_USER+102

	ON_MESSAGE(WM_SETPOWERBOOT, &CMFCApplication2Dlg::OnSetPowerBoot)
	ON_MESSAGE(WM_CANCELPOWERBOOT, &CMFCApplication2Dlg::OnCancelPowerBoot)
LRESULT CMFCApplication2Dlg::OnSetPowerBoot(WPARAM wParam, LPARAM lParam)
{
	HKEY hKey;
	//找到系统的启动项
	CString lpRun = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	//打开启动项
	long lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_ALL_ACCESS, &hKey);
	//找到程序自身路径
	TCHAR pFileName[MAX_PATH] = {};
	GetModuleFileName(NULL, pFileName, MAX_PATH);

	//判断是否已经设置开机启动
	TCHAR PowerBoot[MAX_PATH] = {};
	DWORD nLongth = MAX_PATH;
	long result = RegGetValue(hKey, NULL, _T("PowerBoot"), RRF_RT_REG_SZ, 0, PowerBoot, &nLongth);
	if (result == ERROR_SUCCESS)        //自启状态
	{
		if (lRet == ERROR_SUCCESS)
		{
			MessageBox(_T("已是自启状态"), _T("PanTum"));
		}
	}
	else        //未自启状态
	{
		//设置自启
		lRet = RegSetValueEx(hKey, _T("PowerBoot"), 0, REG_SZ, (LPBYTE)pFileName, (lstrlen(pFileName) + 1) * sizeof(TCHAR));
		if (lRet == ERROR_SUCCESS)
		{
			MessageBox(_T("设置自启成功"), _T("PanTum"));
		}
	}
	//关闭注册表
	RegCloseKey(hKey);
	return 0;

}

LRESULT CMFCApplication2Dlg::OnCancelPowerBoot(WPARAM wParam, LPARAM lParam)
{
	HKEY hKey;
	//找到系统的启动项
	CString lpRun = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	//打开启动项
	long lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_ALL_ACCESS, &hKey);
	//找到程序自身路径
	TCHAR pFileName[MAX_PATH] = {};
	GetModuleFileName(NULL, pFileName, MAX_PATH);

	//判断是否已经设置开机启动
	TCHAR PowerBoot[MAX_PATH] = {};
	DWORD nLongth = MAX_PATH;
	long result = RegGetValue(hKey, NULL, _T("PowerBoot"), RRF_RT_REG_SZ, 0, PowerBoot, &nLongth);
	if (result == ERROR_SUCCESS)        //自启状态
	{
		//取消自动启动
		lRet = RegDeleteValue(hKey, _T("PowerBoot"));
		if (lRet == ERROR_SUCCESS)
		{
			MessageBox(_T("关闭自启成功"), _T("PanTum"));
		}
	}
	else        //未自启状态
	{
		//设置自启
		MessageBox(_T("已关闭自启状态"), _T("PanTum"));
	}

	//关闭注册表
	RegCloseKey(hKey);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个MFC实现旋转三角形的示例代码: 1. 创建一个MFC应用程序项目,并在资源视图中添加一个空白对话框。 2. 在对话框类的头文件中添加以下成员变量和函数声明: ``` class CMyDlg : public CDialogEx { public: CMyDlg(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CMyDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() private: CPoint m_center; // 旋转中心点 double m_angle; // 旋转角度 private: void DrawTriangle(CDC& dc, CPoint* points); // 绘制三角形 void RotateTriangle(CDC& dc, CPoint* points, int count); // 旋转三角形 }; ``` 3. 在对话框类的源文件中实现成员函数: ``` void CMyDlg::DrawTriangle(CDC& dc, CPoint* points) { CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CBrush brush(RGB(255, 0, 0)); dc.SelectObject(&pen); dc.SelectObject(&brush); dc.MoveTo(points[0]); dc.LineTo(points[1]); dc.LineTo(points[2]); dc.LineTo(points[0]); } void CMyDlg::RotateTriangle(CDC& dc, CPoint* points, int count) { Gdiplus::Graphics graphics(dc.GetSafeHdc()); graphics.TranslateTransform(m_center.x, m_center.y); graphics.RotateTransform((float)m_angle); graphics.TranslateTransform(-m_center.x, -m_center.y); dc.Polygon(points, count); } void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MY_DIALOG, pParent) { m_center.SetPoint(75, 75); m_angle = 0; } CMyDlg::~CMyDlg() { } void CMyDlg::OnPaint() { CPaintDC dc(this); // 绘制三角形 CPoint points[3] = {{50, 50}, {100, 50}, {75, 25}}; DrawTriangle(dc, points); // 旋转三角形 RotateTriangle(dc, points, 3); } void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) { m_angle += 10; // 每次点击增加10度 Invalidate(); // 重绘窗口 } ``` 4. 运行程序,点击窗口可以看到三角形随着鼠标点击不断旋转。 注意,上述代码需要包含Gdiplus.h头文件,并链接Gdiplus库。另外,如果想要控制旋转中心点和旋转角度,可以在代码中修改成员变量m_center和m_angle的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值