当前位置: 首页 > news >正文

MFC程序设计(三)常用复杂控件的使用

预备工作

继上一节课实现的控件以后,现在我们实现上图中新的控件

设置宏#define HOTKEY_USER_MSG 12138

IP添加控件变量m_IP

树控件添加控件类型变量m_Tree

右上角列表绑定控件变量m_FileList ,注意一行为一项,行列交叉的项属于子项

添加右键菜单

Tab页绑定控件变量m_Tab

热键

首先我们新建一个热键:进入对话框类向导,进入OnInitDialog添加初始化代码,注册热键

RegisterHotKey(m_hWnd, HOTKEY_USER_MSG, MOD_SHIFT, VK_F1); //1.窗口句柄,2.热键消息码 3.辅助键(组合键)

进入类向导,添加OnHotKey消息

void CDemo02Dlg::OnBnClickedButton8()//输入IP地址,点击设置按钮弹窗
{//一个IP地址:192.168.31.118,每个部分都是byte类型变量BYTE cIPA, cIPB, cIPC, cIPD;if (m_IP.IsBlank())//判断IP字段是否为空{AfxMessageBox(L"IP地址不能为空");return;}m_IP.GetAddress(cIPA, cIPB, cIPC, cIPD);//控件获取IP地址CString csIP;csIP.Format(L"%d.%d.%d.%d", cIPA, cIPB, cIPC, cIPD);//存储IP地址AfxMessageBox(csIP);//弹窗IP地址
}

IP控件

设置IP

void CDemo02Dlg::OnBnClickedButton8()//输入IP地址,点击设置按钮弹窗
{//一个IP地址:192.168.31.118,每个部分都是byte类型变量BYTE cIPA, cIPB, cIPC, cIPD;if (m_IP.IsBlank())//判断IP字段是否为空{AfxMessageBox(L"IP地址不能为空");return;}m_IP.GetAddress(cIPA, cIPB, cIPC, cIPD);//控件获取IP地址CString csIP;csIP.Format(L"%d.%d.%d.%d", cIPA, cIPB, cIPC, cIPD);//存储IP地址AfxMessageBox(csIP);//弹窗IP地址
}

清空IP

void CDemo02Dlg::OnBnClickedButton9()//点击清除按钮,IP地址清空
{m_IP.ClearAddress();//清空IP地址
}

获取IP

void CDemo02Dlg::OnBnClickedButton10()//点击获取按钮,将获取到的IP填入IP控件
{char ip[] = "192.168.0.1";//我们获取到的IPDWORD dwIP = htonl(inet_addr(ip));//将IPV4字符串转换为inet_addr结构再转换为网络字节序的长整型m_IP.SetAddress(dwIP);//设置IP控件上的地址
}//注意此处需要通过程序提示添加预处理器

在OnInitDialog中进行初始化

HTREEITEM hRoot = m_Tree.InsertItem(L"Root", TVI_ROOT, TVI_LAST);//设置根节点。HTREEITEM hSubNode1 = m_Tree.InsertItem(L"hSubNode1", hRoot, TVI_LAST);HTREEITEM hSubNode1Sub1 = m_Tree.InsertItem(L"hSubNode1Sub1", hSubNode1, TVI_LAST);HTREEITEM hSubNode1Sub2 = m_Tree.InsertItem(L"hSubNode1Sub2", hSubNode1, TVI_LAST);HTREEITEM hSubNode1Sub3 = m_Tree.InsertItem(L"hSubNode1Sub3", hSubNode1, TVI_LAST);HTREEITEM hSubNode1Sub4 = m_Tree.InsertItem(L"hSubNode1Sub4", hSubNode1, TVI_LAST);HTREEITEM hSubNode2 = m_Tree.InsertItem(L"hSubNode2", hRoot, TVI_LAST);

获取并修改树节点

void CDemo02Dlg::OnBnClickedButton11()//点击当前选中按钮,获取并修改选中树结点的文本
{HTREEITEM hCurNode = m_Tree.GetSelectedItem();//获取当前选中项CString csText = m_Tree.GetItemText(hCurNode);//获取选中项文本AfxMessageBox(csText);//弹窗选中项文本CString csSetBuffer = L"rkvir";m_Tree.SetItemText(hCurNode,csSetBuffer);//设置选中项新文本
}

删除树节点

void CDemo02Dlg::OnBnClickedButton12()//点击删除选中,删除选中的树节点
{HTREEITEM hCurNode = m_Tree.GetSelectedItem();//获取当前选中项m_Tree.DeleteItem(hCurNode);//删除选中项
}

删除所有树节点

void CDemo02Dlg::OnBnClickedButton13()//点击全部删除,删除所有树节点
{m_Tree.DeleteAllItems();
}

列表

在OnInitDialog中进行初始化列表风格

m_FileList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);//设置风格m_FileList.InsertColumn(0, L"Name", 0, 100);//插入列头m_FileList.InsertColumn(1, L"Path", 0, 260);m_FileList.InsertColumn(2, L"Title", 0, 100);DWORD dwIndex = 0;//列表行索引CFileFind finder;//创建一个文件类BOOL bRet = finder.FindFile(L"D:\\symbols(Win7x64)\\*.*");//读取目标目录下文件while (bRet)//遍历目标目录下文件{bRet = finder.FindNextFileW();//读取目标目录下下一个文件m_FileList.InsertItem(dwIndex, finder.GetFileName(), 0);//在目标行第0列插入文件名。注意第0列需要使用该函数m_FileList.SetItemText(dwIndex, 1, finder.GetFilePath());//第目标行1列插入文件路径m_FileList.SetItemText(dwIndex, 2, finder.GetFileTitle());//第目标行2列插入文件类型dwIndex++;//指向下一行}

右键菜单应用

在列表中添加右键消息

void CDemo02Dlg::OnRclickList2(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_MENU3));//加载IDR_MENU3菜单HMENU hSubMenu = GetSubMenu(hMenu, NULL);//获取菜单句柄TrackPopupMenu(hSubMenu, TPM_CENTERALIGN, pt.x, pt.y, 0, m_hWnd, NULL);//鼠标点击位置弹出菜单*pResult = 0;
}

删除列表一行数据

void CDemo02Dlg::On32780()//点击删除一行消息
{int nPos = (int)m_FileList.GetFirstSelectedItemPosition();//获取选中行位置,MFC该函数从1开始计算nPos -= 1;/位置减1,获取实际下标索引m_FileList.DeleteItem(nPos);//删除选中行
}

删除全部数据


void CDemo02Dlg::On32781()//删除全部消息
{m_FileList.DeleteAllItems();
}

获取选中文本并修改

void CDemo02Dlg::On32779()//获取选中行文本,并进行修改
{int nPos = (int)m_FileList.GetFirstSelectedItemPosition();nPos -= 1;CString csResBuffer = m_FileList.GetItemText(nPos, 0);//接收选中行0列文本//AfxMessageBox(csResBuffer);//弹窗文本m_FileList.SetItemText(nPos, 0, L"rkvir");//修改选中行0列文本
}

Tab

此处我们需要额外创建三个对话框并分别添加类命名为CPAGE123,在主对话框中添加这三个对话框头文件。在主对话框头文件中代码增加三个对话框类对象。注意对话框外观Border修改none,style修改为child

在OnInitDialog中进行初始化

m_Tab.InsertItem(0, L"page0");
m_Tab.InsertItem(1, L"page1");
m_Tab.InsertItem(2, L"page2");//插入页名
page1.Create(IDD_DIALOG1, &m_Tab);
page2.Create(IDD_DIALOG2, &m_Tab); 
page3.Create(IDD_DIALOG3, &m_Tab);//创建三个页
CRect rs;
m_Tab.GetClientRect(rs);//获取页客户区,即显示内容的区域
rs.top += 20;//用户区顶部下移20单位距离
page1.MoveWindow(rs);
page2.MoveWindow(rs);
page3.MoveWindow(rs);//移动三个对话框移动到目标客户去使之不遮挡页名
page1.ShowWindow(SW_SHOW);//显示第一个页

Tab页切换

void CDemo02Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{int nCurSel = m_Tab.GetCurSel();//获取点击页的页码switch (nCurSel){case 0:page1.ShowWindow(SW_SHOW);//显示选中页page2.ShowWindow(SW_HIDE);page3.ShowWindow(SW_HIDE);//隐藏另外两个页break;case 1:page1.ShowWindow(SW_HIDE);page2.ShowWindow(SW_SHOW);page3.ShowWindow(SW_HIDE);break;case 2:page1.ShowWindow(SW_HIDE);page2.ShowWindow(SW_HIDE);page3.ShowWindow(SW_SHOW);break;default:break;}*pResult = 0;

拓展库使用

接下来我们试一试网上一些前辈写的资源库,此处我们使用EditListCtrl库进行一个演示

1.将资源库放入目标项目文件夹

2.在该项目源文件头文件中添加该库即可。

3.主对话框添加头文件include<EditListCtrl.h>

4.在主对话框头文件中修改m_FileList类型为CEditListCtrl

5.在EditListCtrl.h中添加头文件pch.h

6.修改EditListCtrl.cpp中stdafx.h为pch.h

完成以上操作后,我们运行程序,双击列表便可以正常编写文本了

作业

01.使用MFC搜索D盘获取指定文件并且读取到程序内,显示在列表上

02.自己随便写点什么,练习树控件的使用

03.模仿任务管理器,实现一个多Tab的程序

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从零到上线,乔拓云助力快速构建在线教育平台
  • 【面试题系列Vue05】跟其他人不太一样的 Vue生命周期总结
  • 文案生成器,快速生成改写文案的捷径
  • 《黑神话:悟空》研发公司的薪资水平
  • SpringBoot集成kafka-自定义拦截器(可以在拦截器中做记录日志、安全检查等操作)
  • 汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用
  • 挂个人-CSDN Java优秀内容博主rundreamsFly抄袭
  • C语言从头学51—多文件项目
  • 培训第三十八天(上传镜像,私有仓库下载镜像,跨主机容器间的通信,harbor软件包下载)
  • RK3568平台(平台总线篇)SPI驱动框架分析
  • C语言家教记录(八)
  • 豆包插件分享
  • C++系列-类模板案例
  • 最大噪音值甚至受法规限制,如何基于LBM算法有效控制风扇气动噪音
  • 数据结构之链表
  • $translatePartialLoader加载失败及解决方式
  • [数据结构]链表的实现在PHP中
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CSS魔法堂:Absolute Positioning就这个样
  • docker python 配置
  • If…else
  • Markdown 语法简单说明
  • ng6--错误信息小结(持续更新)
  • PHP的Ev教程三(Periodic watcher)
  • Python_OOP
  • react 代码优化(一) ——事件处理
  • SpingCloudBus整合RabbitMQ
  • supervisor 永不挂掉的进程 安装以及使用
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 工作手记之html2canvas使用概述
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 网页视频流m3u8/ts视频下载
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 国内开源镜像站点
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #pragma 指令
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot教学评价 毕业设计 641310
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)负载均衡,回话保持,cookie
  • ****三次握手和四次挥手
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET IoC 容器(三)Autofac
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net开发时的诡异问题,button的onclick事件无效
  • @media screen 针对不同移动设备
  • [@Controller]4 详解@ModelAttribute
  • [ACP云计算]易混淆知识点(考题总结)
  • [C/C++]数据结构 堆的详解
  • [DevEpxress]GridControl 显示Gif动画
  • [Django 0-1] Core.Email 模块
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战