MFC - 复杂控件_2

前言

  • 各位师傅大家好,我是qmx_07,今天讲解剩下的复杂控件知识点
    请添加图片描述

IP地址栏

  • 绘图准备:
    在这里插入图片描述
  • 调整windows窗口大小、设置 ip address control
  • 设置 Button按钮,修改名称
    在这里插入图片描述
  • 添加IP栏 变量:m_IP

获取IP栏内容

void CMFCApplication3Dlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码BYTE cIPA, cIPB, cIPC, cIPD;if (m_IP.IsBlank()){AfxMessageBox(L"IP地址栏不能为空");return;}m_IP.GetAddress(cIPA, cIPB, cIPC, cIPD);CString csIP;csIP.Format(L"%d.%d.%d.%d", cIPA, cIPB, cIPC, cIPD);MessageBox(csIP);
}
  • BYTE 0-255 符合ip的习惯
  • IsBlank()判断是否为空
  • GetAddress()获取IP栏的内容
  • 检查IP栏是否为空,将IP栏内容输出到cIPA, cIPB, cIPC, cIPD进行弹窗

清空IP栏内容


void CMFCApplication3Dlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码m_IP.ClearAddress();
}
  • ClearAddress()清空IP栏内容

设置IP栏内容

void CMFCApplication3Dlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码char ip[] = "192.168.0.1";DWORD dwIP = htonl(inet_addr(ip));m_IP.SetAddress(dwIP);
}
  • inet_addr将 IP 地址字符串转换为一个以网络字节序表示的 32 位整数
  • htonl 函数将这个整数转换为主机字节序到网络字节序
  • SetAddress()设置ip地址
  • 将ip地址 进行转换,设置到ip栏里
知识点讲解
  • 网络字节序是指在网络传输中规定的统一的字节顺序,互联网中,通常采用大端字节序,也就是高位字节存储在低地址,低位字节存储在高地址
  • 主机字节序则是因不同的计算机体系结构而有所不同,主要分为大端字节序和小端字节序,Intel x86 系列的 CPU 采用小端字节序,而一些其他的处理器架构可能采用大端字节序
  • 在网络编程中,为了确保不同主机之间能够正确地传输和解析数据,需要进行字节序的转换。

画面演示

在这里插入图片描述

树控件

  • 绘图准备:
    在这里插入图片描述

  • 调整windows窗口大小,设置Tree control控件,设置属性Has Lines、Has Buttons 为True

  • 设置Button按钮
    在这里插入图片描述

  • 设置变量:m_Tree
    在这里插入图片描述

  • 通过类向导,进入OninitDialog

	HTREEITEM hRoot = m_Tree.InsertItem(L"Root", TVI_ROOT, TVI_LAST);HTREEITEM hSubNode = m_Tree.InsertItem(L"SubNode",hRoot, TVI_LAST);HTREEITEM hSubNode_Sub1 = m_Tree.InsertItem(L"SubNode1", hSubNode, TVI_LAST);HTREEITEM hSubNode_Sub2 = m_Tree.InsertItem(L"SubNode2", hSubNode, TVI_LAST);HTREEITEM hSubNode_Sub3 = m_Tree.InsertItem(L"SubNode3", hSubNode, TVI_LAST);HTREEITEM hSubNode_Sub4 = m_Tree.InsertItem(L"SubNode4", hSubNode, TVI_LAST);
  • TVI_ROOT 为root节点
  • InsertItem插入节点
  • TVI_LAST 向后插入
    画面演示:
    在这里插入图片描述

当前选中

void CMFCApplication3Dlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码HTREEITEM hCurNode = m_Tree.GetSelectedItem();CString Text = m_Tree.GetItemText(hCurNode);AfxMessageBox(Text);
}
  • GetSelectedItem()获取当前的对象
  • GetItemText()获取文本信息

删除选中

void CMFCApplication3Dlg::OnBnClickedButton5()
{// TODO: 在此添加控件通知处理程序代码HTREEITEM hCurNode = m_Tree.GetSelectedItem();m_Tree.DeleteItem(hCurNode);
}
  • DeleteItem()删除当前的对象

删除全部

void CMFCApplication3Dlg::OnBnClickedButton6()
{// TODO: 在此添加控件通知处理程序代码m_Tree.DeleteAllItems();
}
  • DeleteAllItems()删除全部对象

画面演示

在这里插入图片描述

列表

  • 绘图准备:
    在这里插入图片描述
  • 调整windows窗口大小,设置 List control 列表,设置属性:View 为report报表
    在这里插入图片描述
  • 通过类向导,进入OnInitDialog
	m_File_List.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);m_File_List.InsertColumn(0, L"Name", 0, 100);m_File_List.InsertColumn(1, L"Path", 0, 100);m_File_List.InsertColumn(2, L"Title", 0, 100);
  • LVS_EX_GRIDLINES 使用网线格
  • LVS_EX_FULLROWSELECT整行选中
  • InsertColumn() :
  • 第一个参数 为 索引列
  • 第二个参数为 名称
  • 第三个参数为 对齐方式
  • 第四个参数为 宽度
    画面演示:
    在这里插入图片描述

模拟windows文件夹

	m_File_List.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);m_File_List.InsertColumn(0, L"Name", 0, 100);m_File_List.InsertColumn(1, L"Path", 0, 200);m_File_List.InsertColumn(2, L"Title", 0, 100);DWORD Index = 0;CFileFind finder;BOOL Ret = finder.FindFile(L"G:\\MFC_Demo\\*.*");while (Ret){Ret = finder.FindNextFileW();m_File_List.InsertItem(Index, finder.GetFileName(), 0);m_File_List.SetItemText(Index, 1, finder.GetFilePath());m_File_List.SetItemText(Index, 2, finder.GetFileTitle());Index++;}
  • 利用之前学习的文件类 CFileFind 进行文件遍历插入
  • InsertItem(): 第一个参数是列,第二个参数是内容,第三个不使用特定图标
  • SetItemText():第一个是列,第二个是行,第三个是内容
    文件素材:
    在这里插入图片描述

画面演示:
在这里插入图片描述

为windows文件夹 设置右键菜单功能

在这里插入图片描述

  • 添加菜单
    在这里插入图片描述
  • 类向导创建右键命令 NM_BCLICK
void CMFCApplication3Dlg::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_MENU1));//加载IDR_MENU1菜单HMENU hSubMenu = GetSubMenu(hMenu, NULL);//加载子菜单TrackPopupMenu(hSubMenu, TPM_CENTERALIGN, pt.x, pt.y, 0, m_hWnd, NULL);//弹出菜单*pResult = 0;
}
  • 设置显示右键菜单,具体上一节有相关说明
    在这里插入图片描述

  • 为三个选项添加 事件处理程序

获取文本
void CMFCApplication3Dlg::On32771()
{// TODO: 在此添加命令处理程序代码//获取文本int nPos = (int)m_File_List.GetFirstSelectedItemPosition();nPos -= 1;CString Buffer = m_File_List.GetItemText(nPos , 0);AfxMessageBox(Buffer);
}
  • GetFirstSelectedItemPosition() 这个函数 获取到的索引值 偏差值为1,所以需要-=1
  • GetItemText()第一个参数为获取的列,第二个参数为获取的行
删除一行
void CMFCApplication3Dlg::On32772()
{// TODO: 在此添加命令处理程序代码//删除一行int nPos = (int)m_File_List.GetFirstSelectedItemPosition();nPos -= 1;m_File_List.DeleteItem(nPos);
}
  • DeleteItem() 删除对象,由于LVS_EX_FULLROWSELECT ,可以直接删除一行数据
删除全部
void CMFCApplication3Dlg::On32773()
{// TODO: 在此添加命令处理程序代码//删除全部m_File_List.DeleteAllItems();
}
  • DeleteAllItems() 删除全部对象
画面演示

在这里插入图片描述

表格

  • 绘图准备:
    在这里插入图片描述
  • 调整windows窗口大小,设置Tab control
    在这里插入图片描述
  • 为表格添加变量: m_Tab
  • 进入OnInitDiaglog
	m_Tab.InsertItem(0, L"Page0");m_Tab.InsertItem(1, L"Page1");m_Tab.InsertItem(2, L"Page2");

画面演示:
在这里插入图片描述

  • 有了画面效果,还需要创建对话框
    在这里插入图片描述
  • 点击创建Dialog对话框
    在这里插入图片描述
  • 将Border 设置为NULL,Style设置为Child,创建三个对话框
    在这里插入图片描述
  • 为每个对话框 创建类
  • 在这里插入图片描述
  • 在主程序头文件,引用
    在这里插入图片描述
  • 创建类变量
  • 在OnInitDialog里写下面程序:
	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;page1.MoveWindow(rs);page2.MoveWindow(rs);page3.MoveWindow(rs);
  • 创建三个对话框,但是会产生覆盖效果,看不到其他的标签页
  • 所以要进行移动
    在这里插入图片描述
  • 为表格设置 事件处理程序
void CMFCApplication3Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{// TODO: 在此添加控件通知处理程序代码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;
}
  • 获取所点击的标签页,让其他页面隐藏
    画面效果:
    在这里插入图片描述

总结

  • 我们学习了IP地址栏,树控件,列表,表格等复杂控件的基本使用,以及对话框的创建与绑定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544139.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++中的string模拟实现

上一章讲了库中的string函数&#xff0c;这次我们来讲一讲模拟实现 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<assert.h> using namespace std; //域名 namespace zzj {class String {public:typedef char* iterator;typedef const char* cons…

【Java 问题】基础——Java 概述

Java 概述 1. 什么是 Java ?2. Java 语言有哪些特点3. JVM、JDK 和 JRE 有什么区别&#xff1f;4. 说说什么是跨平台性&#xff1f;原理是什么&#xff1f;5. 什么是字节码&#xff1f;采用字节码的好处是什么&#xff1f;6. 为什么说 Java 语言 "编译与解释并存"?…

将 Go 作为脚本语言用及一些好用的包

前言 Go 作为一种可用于创建高性能网络和并发系统的编程语言&#xff0c;它的生态应用变得越来越广泛&#xff0c;同时&#xff0c;这也激发了开发人员使用 Go 作为脚本语言的兴趣。虽然目前 Go 还未准备好作为脚本语言 “开箱即用” 的特性&#xff0c;用来替代 Python 和 Ba…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Perf为性能分析工具&#xff0c;依赖PMU&#xff08;Per…

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

2万字长文超全详解!深度学习时代阴影检测、去除与生成在图像与视频中的全面综述

论文链接&#xff1a;https://arxiv.org/pdf/2409.02108 Github链接&#xff1a;https://github.com/xw-hu/Unveiling-Deep-Shadows 亮点直击 深度学习时代阴影分析的全面综述。本文对阴影分析进行了深入的综述&#xff0c;涵盖了任务、监督级别和学习范式等各个方面。本文的分…

SpringBoot整合ELK实现日志监控(保姆级教程)

新建SpringBoot项目 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

虚幻引擎的三种输入模式和将控件显示到屏幕上

首先要知道一个概念 , HUD 和 Input 都是由 PlayerController 来控制的 而虚幻的Input控制模式有三种 Set Input Mode Game Only (设置输入模式仅限游戏): 视角会跟着鼠标旋转 , 就是正常游戏的模式 , 这也是游戏默认输入模式 Set Input Mode UI Only (设置输入模式仅限UI): …

231. 2 的幂 简单递归 python除法的类型

已解答 简单 相关标签 相关企业 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&…

傅里叶变换(对称美)

傅里叶变换&#xff08;对称美&#xff09; 冲浪时发现的有趣文章&#xff0c;学习自https://zhuanlan.zhihu.com/p/718139299 摘下来的内容&#xff1a; 傅里叶变换之所以“怪美的嘞”&#xff0c;根本在于它有一种内在的对称性&#xff0c;这一点在上面的图并没有表现出来…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么&#xff1f; 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能&#xff1a;如高温、电弧、电火花以及非故障性释放的能量&#xff1b;如电热器具的炽热表面&#xff0c;在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

移动端列表筛选封装

适合场景&#xff1a;Vue2vant 移动端项目&#xff0c;数据填充添加全部选项及相关逻辑处理&#xff0c;支持多选、单选以及筛选状态返回 效果图 选中交互 使用说明 <filter-box ref"filterBox" :isMultiple"true" //是否多选:params"waitData&q…

为什么无线物联网通信技术是智能家居的首选

无线物联网通信技术成为智能家居的首选&#xff0c;主要基于以下几个方面的原因&#xff1a; 一、便捷性与灵活性 无需布线&#xff1a;无线物联网通信技术最大的优势在于其无需复杂的布线工作。在智能家居系统中&#xff0c;这意味着用户无需在墙壁中开凿线路&#xff0c;也无…

夜间红外图宠物检测系统源码分享

夜间红外图宠物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

如何使用VM中win10搭建Hfish蜜罐(危险感知平台)。从下载到部署详细教程

得而不惜就该死。 -----古月方源 引言&#xff1a;最近跟一个老师做东西&#xff0c;叫我搞清楚蜜罐的搭建和一些底层逻辑&#xff0c;所以记录一下。 一、实验准备 &#xff08;一&#xff09;win10虚拟机 &#xff08;若有需要可以后台私信&#xff09; &#xff08;二&…

库仑定律-库仑力-两个电荷之间静电力的计算公式

图中&#xff1a; q1&#xff0c;q2 为两个电荷r 为电荷间的距离 r ^ 1 , 2 \widehat{r}_{1,2} r 1,2​ 为从 q1 指向 q2 的单位向量 F ⃗ 1 , 2 \vec{F}_{1,2} F 1,2​ 为 q1 施加到 q2 上的静电力 公式&#xff1a; F ⃗ 1 , 2 q 1 q 2 K r 2 r ^ 1 , 2 \vec{F}_{1,2} \f…

WordPress精选文章如何添加侧边栏和页面?

WordPress精选帖子是一项功能&#xff0c;可让用户在其网站主页或其他值得注意的部分突出显示特定帖子。这些精选帖子通常以视觉上独特的方式显示&#xff0c;例如以滑块、网格或轮播格式显示&#xff0c;以提高其可见性和对访问者的吸引力。 网站所有者可以手动选择他们想要推…

合规性强化:等保测评中的政策与标准遵循

在信息化高速发展的今天&#xff0c;信息安全已成为国家安全的重要组成部分&#xff0c;而等级保护测评&#xff08;简称“等保测评”&#xff09;作为确保信息系统安全的重要手段&#xff0c;其合规性强化显得尤为重要。等保测评不仅是对信息系统安全性能的全面评估&#xff0…

并发编程工具集——Fork/Join-上(三十六)

简述 前面提到的线程池、Future、CompletableFuture 和 CompletionService&#xff0c;这些工具类都是在帮助我们站在任务的视角来解决并发问题&#xff0c;而不是让我们纠缠在线程之间如何协作的细节上&#xff08;比如线程之间如何实现等待、通知等&#xff09;。精髓&#x…

Angular由一个bug说起之十:npm Unsupported engine

我们在用npm下载包的时候&#xff0c;有时候会碰到这样的提示 这是npm的警告&#xff0c;说我们使用的nodejs版本与下载的包所要求的nodejs版本不一致。 这是因为有些包它对nodejs的版本有要求&#xff0c;然后就会在package.json文件里的engines字段里声明它所要求的nodejs版本…