IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 九阳道人的MFC学习之旅 -> 正文阅读

[C++知识库]九阳道人的MFC学习之旅

九阳道人的MFC学习之旅

好记性不如烂笔头,MFC用过很多遍了,每次用完后就很久不去碰,之后就忘了怎么用MFC,现在特此记录。

环境:VS2017

?

1、修改程序版本信息

修改如图:
在这里插入图片描述

鼠标放在exe程序上时效果图如下:
在这里插入图片描述
?

2、截获和处理键盘鼠标消息

在MFC中,PreTranslateMessage是虚函数,是用来截获消息的,我们可以通过重载它来处理键盘和鼠标消息。

在资源的dialog界面按ctrl+shift+x调出类向导,双击添加PreTranslateMessage虚函数如图:
在这里插入图片描述

?

3、注册全局热键

OnInitDialog()是窗口初始化函数,初始化的东西都放在这个函数里面。

在OnInitDialog()中添加:

//注册快捷键 ctrl+shift+0	
::RegisterHotKey(m_hWnd, 0x1230, MOD_CONTROL | MOD_SHIFT, '0'); 

在类向导生成函数PreTranslateMessage处理相应消息

if (pMsg->message == WM_HOTKEY && (pMsg->wParam == 0x1230))
{
	LockWorkStation();
}

?

4、设置窗口名称

在OnInitDialog()中添加:

//设置窗口名称
AfxGetMainWnd()->SetWindowText(L"九阳道人_HackerTool");

?

5、防双开

可以在类视图中添加函数,实现自己的功能。

	// 检测是否已经打开本程序
	if (IsAlreadyRun())
	{
		::MessageBox(0,L"已启动程序,请勿重复运行!",L"九阳道人",0);
		::exit(0);
	}
	
// 防双开
bool CHappyWorkDlg::IsAlreadyRun()
{
	// TODO: 在此处添加实现代码.
	HANDLE hMutex = NULL;
	hMutex = ::CreateMutex(NULL, FALSE, L"九阳道人");
	if (hMutex)
	{
		if (ERROR_ALREADY_EXISTS == ::GetLastError())
		{
			return true;
		}
	}
	return false;
}

?

6、调试程序方法

在多线程或者多计时器情况下,使用DbgView查看日志,输出日志函数如下:

OutputDebugStringA("当前文件全路径如下:");

?

7、类向导添加自定义消息

在这里插入图片描述

?

8、添加和处理菜单

1、首先在资源中添加菜单,然后取好名字
2、在菜单界面右键添加事件处理
在这里插入图片描述
3、修改填写相应选项
在这里插入图片描述

?

9、添加托盘图标显示效果

1、先在头文件定义一个托盘变量。

NOTIFYICONDATA m_Tray;   // 托盘图标参数

2、通过类向导生成WM_CREATE函数,在这个函数中初始化托盘图标变量。

// WM_CREATE
int CHappyWorkDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialogEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	// 以下初始化托盘图标参数,不能在构造函数初始化,因为构造中m_hWnd=NULL;
	wcscpy_s(m_Tray.szTip, L"快乐工作");                  // 当鼠标放在tray icon上面的时候显示的文字
	m_Tray.cbSize = sizeof(NOTIFYICONDATA);              // 指定结构体大小
	m_Tray.hWnd = m_hWnd;                                // 指定接收通告消息的窗口句柄.系统就是通过hWnd和uID来辨别当Shell_NotifyIcon函数调用的时候操作的是哪个托盘图标
	m_Tray.uID = 0x10086;                                // 应用程序定义的任务栏图标表示符。一个hWnd可以有很多的图标与之关联,这是通过指定不同的uID实现的
	m_Tray.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 要操作(添加、删除、修改)的图标句柄
	m_Tray.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;    // 标记那些成员有效
	m_Tray.uCallbackMessage = WM_TRAY_ICON;              // 当鼠标在图标区域内发生了事件,比如单击、双击时,
														 // 系统会把这个消息发送到hWnd成员对应的窗口,然后该窗口可以处理该事件。
														 // 这里可以不是WM_COMMAND,可以自定义消息,然后响应这个消息
	
	// 显示托盘图标
	Shell_NotifyIcon(NIM_ADD, &m_Tray);

	return 0;
}

3、通过类向导生成WM_DESTROY函数,程序退出时销毁托盘图标。

void CHappyWorkDlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	// TODO: 在此处添加消息处理程序代码

	// 销毁托盘图标
	Shell_NotifyIcon(NIM_DELETE, &m_Tray);
}

4、如上面第7步骤,先添加一个自定义消息,然后在窗口头文件xxxDlg.h文件中定义好该自定义消息。

#define WM_TRAY_ICON (WM_USER + 1) // 自定义托盘消息

最后处理好消息处理函数,wParam是自义定消息的资源ID,lParam是消息类型。

afx_msg LRESULT CHappyWorkDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (wParam == 0x10086)
	{
		switch (lParam)
		{
		case WM_RBUTTONDOWN:  // 鼠标右键
			SetForegroundWindow();
			// 弹出右键菜单
		break;
		case WM_LBUTTONDOWN: // 鼠标左键
			SetForegroundWindow();
			// 退出
		}
	}
	return 0;
}

?

10、修改窗口名和程序名

1、窗口名在OnInitDialog中。

// 设置窗口名称
AfxGetMainWnd()->SetWindowText(L"九阳道人");

2、程序名在属性常规中直接修改
在这里插入图片描述

?

11、添加tab控件及其子窗口

1、首先在主窗口中用工具箱添加好tab控件。
2、在资源中新建子窗口,然后修改如下图3个属性。
3、调整好子窗口大小为tab控件的包容大小。
在这里插入图片描述
?

12、tab控件,父子窗口的整体交互

1、添加静态文本用static_text。
2、布局好两个子窗口后,分别给两个子窗口创建一个类。
3、在父窗口的.h文件引用子类的头文件,然后定义出子窗口的变量,还有tab控件变量。


	CTabCtrl m_nTab;                 // tab 变量
	WindborneSpeed m_WindborneSpeed; // 快如风
	MostUrgent	   m_MostUrgent;     // 急如火

4、父窗口首先要在OnInitDlg初始化两个子窗口信息。

    // 以下初始化tab控件
	m_nTab.InsertItem(0, L"   快如风   ");
	m_nTab.InsertItem(1, L"   急如火   ");

	m_WindborneSpeed.Create(MAKEINTRESOURCEW(IDD_DIALOG1), &m_nTab);
	m_MostUrgent.Create(MAKEINTRESOURCEW(IDD_DIALOG2), &m_nTab);

	// 修正子窗口坐标
	RECT rect;
	m_nTab.GetClientRect(&rect);
	rect.top += 22;
	// rect.top += 26; // 老版win10
	rect.left += 1;
	rect.bottom -= 2;
	rect.right -= 3;
	m_WindborneSpeed.MoveWindow(&rect);
	m_MostUrgent.MoveWindow(&rect);

	// 显示默认的子窗口
	m_WindborneSpeed.ShowWindow(SW_SHOW);

5、给tab控件添加事件处理函数。
在这里插入图片描述

// 处理tab应该显示哪个子窗口
void CHappyWorkDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码

	int num = m_nTab.GetCurSel();
	switch (num)
	{
	case 0:
		m_WindborneSpeed.ShowWindow(SW_SHOW);
		m_MostUrgent.ShowWindow(SW_HIDE);
		break;
	case 1:
		m_WindborneSpeed.ShowWindow(SW_HIDE);
		m_MostUrgent.ShowWindow(SW_SHOW);
		break;
	}

	*pResult = 0;
}

?

13、禁止窗口被拉动变形,扩展为无应用图标模式

在OnCreate函数添加。

	// 修改风格使得他不在任务栏显示
	ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

	//禁止拖动修改大小
	ModifyStyle(WS_THICKFRAME, 0, 0);  

?

14、本文控件和滑条控件

在类视图中相应的类可以添加自定义的函数。

1、在绑定static_text类型的控件变量时,需要先把文本控件ID给更改掉,然后选择值。
在这里插入图片描述

?

15、解决按ESC键或ENTER键窗口程序会退出问题

1、主窗口如下:

	// 禁止按ESC键或回车就退出窗口
	if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN))
	{
		return TRUE;
	}

2、每个子窗口都需要处理以下消息。

// 类向导添加虚函数处理消息,解决按ESC键退出问题
BOOL WindborneSpeed::PreTranslateMessage(MSG* pMsg)
{
	// 禁止按ESC键就退出窗口
	if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE))
	{
		return TRUE;
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

?

16、复选框

绑定CButton类型变量,然后1是选中,0是为选,处理如下。

if (m_Check.GetCheck() == 0)
{
	// 事件
}
m_Check.SetCheck(1);

?

17、获取环境变量

	CString str;
	str.GetEnvironmentVariable(L"PATH");
	AfxMessageBox(str);
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 11:50:13  更:2022-04-04 11:56:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:22:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码