MFC/C++学习系列之简单记录5

ops/2024/12/26 16:09:00/

MFC/C++学习系列之简单记录5

  • 前言
  • 控件位置设置
    • 实际说明
      • C# Tab位置设定的相关使用
      • C++ MFC中Tab位置设定的相关使用
  • 总结


前言

需求提及不够清楚,没有详细的文档输入,甚至协议都是看代码,然后查文件才确认协议更改。这样对新来的开发人员很不友好。
工作这段时间真正体会到文档的重要性,哪怕是简单文件说明都好过几天看代码摸索!


控件位置设置

基于VC 6.0的MFC架构开发,但是最近需求不明确,以为界面要修改,研究了一下界面设计。
意图:在界面中设置Tab界面,Tab中插入很多MSFlexGrid表格。
问题来了,插入Tab很简单,拖动Tab就可以放置在界面上,而MSFlexGrid却始终无法在Tab中显示,要不就是整个覆盖掉Tab,要不就是不合适,也无法切换。
最后研究了别的源码设计才发现问题,原来VC 6.0中的Tab中要插入控件需要手动设置控件位置,假装控件在界面中出现。
这和VS C#的界面很不一样,在C#中的Tab增加控件,只需要使用“ Tab"按键,就可以把需要添加的控件拖动至Tab中,并且因为每个子Tab页面不同并不需要在显示一个Tab的控件时来隐藏另一个Tab界面的控件。

实际说明

C# Tab位置设定的相关使用

在这里插入图片描述
在VS 2019中直接在工具箱中找到TabControl控件,然后可以直接拖动DataGrid进入TabControl,不需要额外的设置。如果需要表格和TabControl的大小一致,也只需要鼠标拖动或者通过Margin来进行定义。而且前端界面的代码可以直接复制使用,省去了很多编辑的时间。

<TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="250" Margin="175,100,0,0" VerticalAlignment="Top" Width="485"><TabItem Header="TabItem"><Grid Background="#FFE5E5E5"/></TabItem><TabItem Header="TabItem"><Grid Background="#FFE5E5E5"><DataGrid x:Name="Datalist_Grid" ItemsSource="{Binding DataList}" ScrollViewer.VerticalScrollBarVisibility="Hidden" AutoGenerateColumns="False"CanUserAddRows="False"CanUserResizeColumns="False"Margin="0,0,28,0"><DataGrid.Columns><DataGridTextColumn Header="名称" Width="*" Binding="{Binding Name}"/><DataGridTextColumn Header="衣服类型" Width="*" Binding="{Binding ClothTpye}"/><DataGridTextColumn Header="颜色" Width="*" Binding="{Binding ClothColor}"/><DataGridTextColumn Header="尺码" Width="*" Binding="{Binding ClothSize}"/><DataGridTextColumn Header="价格" Width="*" Binding="{Binding ClothPrice}"/><DataGridTemplateColumn Header="操作" Width="50"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock><Hyperlink Command="{Binding DeleterData}" CommandParameter="{Binding}"><Run Text="操作"/></Hyperlink></TextBlock></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid></TabItem></TabControl>

C++ MFC中Tab位置设定的相关使用

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

CWnd* pTabWnd = pTabWnd=GetDlgItem(IDC_TAB1);if (pTabWnd != NULL){// 获取Tab页的矩形区域CRect rect;pTabWnd->GetClientRect(&rect);pTabWnd->MoveWindow(rect);CRect btnrect(rect.left+50, rect.top+80, rect.left+100, rect.top + 100);// 设置按钮的位置和大小m_Btn1.MoveWindow(&btnrect, TRUE); // 将按钮移动到Tab页的矩形区域内}

这里是获取控件的位置,然后将获取的控件位置通过RECT的形式进行记录,记录好了之后需要在通过使用MoveWindow函数,你可以设置控件的位置和大小。CRect对象可以直接传递给MoveWindow函数。
而这里还仅是将按钮的位置写入了Tab中,每个Tab项中都存在按钮控件,而C#放入哪个Tab子控件就只存在该控件中,不会在其他界面显示,如果在其他界面中需要显示,只要复制一下就过去了。

神奇的来了,在MFC中如果想要达到C#界面中的效果,需要写代码实现。没错!你需要告诉电脑,这个控件在第一界面显示后,第二个界面就不能显示了哦!增加了开发人员的代码量!

void CMFCtest1Dlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{// TODO: 在此添加控件通知处理程序代码*pResult = 0;LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);// 根据选中的Tab页面,显示或隐藏按钮if (pNMListView->iItem == 0) // 如果选中的是第一个Tab页面{m_Btn1.ShowWindow(SW_SHOW); // 显示按钮}else{m_Btn1.ShowWindow(SW_HIDE); // 隐藏按钮}
}

总结

今天主要写了一下Tab控件中设置其他控件的方式,之前只是听说MFC很老,最近使用发现开发不够C#便捷,不知道是不是自己没有掌握到方法,继续基类吧!


http://www.ppmy.cn/ops/145156.html

相关文章

基于vue-popperjs的二次封装弹窗

前言&#xff1a; 基于vue-popperjs的二次封装代码 <template><!-- 1. :appendToBody"true"是否把位置加到body外层标签上饿了么UI和antD是true&#xff0c;iview和vuetifyjs是false2. trigger属性触发方式&#xff0c;常用hover悬浮触发、clickToOpen鼠标…

《机器学习》数据预处理简介

目录 1. 数据清洗&#xff08;Data Cleaning&#xff09; &#xff08;1&#xff09;处理缺失值 &#xff08;2&#xff09;处理异常值 &#xff08;3&#xff09;处理重复数据 2. 数据转换&#xff08;Data Transformation&#xff09; &#xff08;1&#xff09;特征缩…

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?

《战神&#xff1a;诸神黄昏》游戏运行时提示找不到emp.dll怎么办&#xff1f;emp.dll丢失的修复方法 在畅游《战神&#xff1a;诸神黄昏》这款史诗级游戏的过程中&#xff0c;如果突然遭遇“找不到emp.dll”的错误提示&#xff0c;无疑会打断你的冒险之旅。作为一名深耕软件开…

Java面试题,数据结构,图的最短路径算法应用于社交网络分析

图的最短路径算法应用于社交网络分析 在一个大型社交网络中&#xff0c;用户想要找到连接两个特定用户的最短路径。假设你已经有了这个社交网络的数据模型&#xff0c;其中节点代表用户&#xff0c;边代表用户之间的关系。请设计一个解决方案&#xff0c;以找出两个用户之间的…

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中&#xff0c;models 提供了一种高层次的抽象来与数据库进行交互&#xff0c;使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查&#xff08;CRUD&#xff09;操作。下面将详细介绍 Django 的 ORM&#xff08;对象关系映射&#xff09;操作如何对应到…

【ChatGPT】OpenAI 如何使用流模式进行回答

当你向 OpenAI 请求完成时&#xff0c;默认情况下&#xff0c;整个回复会在一次性响应中全部生成并返回给你。如果你正在生成的回复内容较长&#xff0c;等待完整回复的时间可能会让人觉得有点漫长——好几秒钟呢&#xff01;为了能更快地获取到部分回复&#xff0c;你可以选择…

7种server的服务器处理结构模型

两种高效的事件处理模式 服务器程序通常需要处理三类事件&#xff1a;I/O 事件、信号及定时事件。有两种高效的事件处理模式&#xff1a;Reactor和 Proactor&#xff0c;同步 I/O 模型通常用于实现Reactor 模式&#xff0c;异步 I/O 模型通常用于实现 Proactor 模式。 无论是 …