MFC - 复杂控件_1

前言

  • 各位师傅大家好,我是qmx_07,今天给大家讲解复杂控件的相关知识点

复杂控件

进度条

  • 绘图准备 :
  • 调整windows窗口大小、设置 Progress Control 进度条
  • 设置Button 按钮
  • 添加进度条变量 m_Progress,通过按钮触发
cpp 复制代码
void CMFCApplication2Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	const int Min = 0;
	const int Max = 100000;
	m_Progress.SetRange32(Min, Max);
	for (size_t i = Min; i < Max; i++)
	{
		m_Progress.SetPos(i);
	}
}
  • SetRange32() 用于控制 进度条的最小值和最大值区间
  • SetPos()控制进度条的进度
  • 通过for循环 依次增加i,形成视觉效果
    画面演示:

滑块

  • 绘图准备

  • 调整windows窗口大小,设置Silder Control 滑块控件

  • 为滑块 设置变量:m_Slider

  • 通过类向导 进入OnInitDialog

cpp 复制代码
	m_Slider.SetRange(0, 100);
	m_Slider.SetPos(0);
	m_Slider.SetTicFreq(1);
  • 设置区间为0-100,当前位置为0
  • SetTicFreq()滑块的刻度频率为1,也就是增长1个单位长度
    画面演示:
通过滑块 滑动 进度条进度
  • 添加WM_HSCROLL 消息
cpp 复制代码
void CMFCApplication2Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	int ID = pScrollBar->GetDlgCtrlID();
	if (IDC_SLIDER1 == ID)
	{
		int Pos = m_Slider.GetPos();
		m_Progress.SetPos(Pos);
	}
	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
  • 获取滑动块的ID进行匹配,获取滑块的POS位置,让进度条和滑动块保持一致
  • GetDlgCtrlID() 获得控件ID
  • GetPos()获取位置
  • SetPos()设置位置
    画面演示:

顶层菜单

  • 添加Menu 菜单

  • 设置顶层菜单内容

  • 点击对话框属性,设置Menu菜单 绑定

    画面演示:

  • 显示窗口,但是还没有设置功能

  • 菜单栏右键,添加事件处理程序,选择类列表对应的Dialog程序

cpp 复制代码
void CMFCApplication2Dlg::On32771()
{
	// TODO: 在此添加命令处理程序代码
	MessageBox(L"Msg", L"消息提示", MB_OK);
}

画面演示:

右键菜单

  • 绘图准备
  • 调整windows窗口大小、设置list control 控件,设置属性view为list
  • 添加变量 m_list
  • 选择对应的list control 对象 ,选择NM_RLICK消息(右键),添加消息处理程序
cpp 复制代码
void CMFCApplication2Dlg::OnRclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	POINT pt = { 0 };
	GetCursorPos(&pt);//获取鼠标的位置
	HMENU hMenu = LoadMenu((HINSTANCE)GetWindowLongPtr(m_hWnd, GWLP_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1));//加载IDR_MENU1菜单
	HMENU hSubMenu = GetSubMenu(hMenu, NULL);//加载子菜单
	TrackPopupMenu(hSubMenu, TPM_CENTERALIGN, pt.x, pt.y, 0, m_hWnd, NULL);//弹出菜单
	*pResult = 0;
}
  • TrackPopupMenu()显示子菜单
  • TPM_CENTERALIGN菜单在水平向上居中显示
  • 代码: 获取鼠标位置,加载菜单 子菜单资源,打印在鼠标居中的位置
    画面演示:

热键消息

  • 进入类向导 -> 虚函数 -> 编辑 OnInitDialg
cpp 复制代码
#define HOTKEY_USER_MSG 1
  • 定义消息码
  • 辅助键集合
cpp 复制代码
//1.窗口句柄 2. 热键消息码 3.辅助键 4. 消息
	RegisterHotKey(m_hWnd, HOTKEY_USER_MSG, MOD_SHIFT, VK_F1);
  • 注册 热键
  • 添加热键消息 WM_HOTKEY
cpp 复制代码
void CMFCApplication2Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nHotKeyId)
	{
	case HOTKEY_USER_MSG:
	{
		MessageBox(L"Msg");
		break;
	}
	default:
		break;
	}	
	CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
  • 根据nHotKeyId ,判断传进来的热键消息进行匹配
    画面演示:

总结

  • 介绍了 进度条,滑块,顶层菜单,右键菜单,热键消息的相关知识
相关推荐
侯孟禹29 分钟前
C++ 面试模拟02
c++
咖啡里的茶i41 分钟前
C++之Person类
开发语言·c++·算法
每天敲200行代码43 分钟前
C++ 红黑树
开发语言·c++·算法
Farewell_me1 小时前
typename、非类型模板参数、模板参数的特化、模板类成员函数声明和定义分离、继承等的介绍
c++·继承·模板类·特化
头顶一只喵喵1 小时前
C++入门编程题(力扣):字符串中最多数目的子序列
开发语言·c++·leetcode
迷迭所归处1 小时前
C++ —— 关于list
开发语言·c++·算法
summ1ts1 小时前
P9235 [蓝桥杯 2023 省 A] 网络稳定性
c++·算法·职场和发展·蓝桥杯·最小生成树·kruskal
叫我龙翔1 小时前
【计网】从零开始掌握序列化 --- 实现网络计算器项目
服务器·网络·c++·网络协议
Chrikk1 小时前
美团中间件C++一面-面经总结
网络·c++·中间件
小周的C语言学习笔记2 小时前
鹏哥C语言43---函数的嵌套调用和链式访问
开发语言·c++·算法