通过编写串口助手工具学习MFC过程

因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉。这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅。做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然。另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008)

(七)添加Tab Control控件

要在对话框里添加标签页,点击标签页上的选项,显示不同的内容,要实现这样的功能就要用到Tab Control控件和子对话框

1、填加Tab Control控件,修改属性ID和增加变量。和其他控件一样。

在”资源”找到Tab Control控件, 将他拖进来~

虽然面板显示了这个控件, 但它完全不会起作用, 因为在代码层次来讲它完全未实现, 只是在资源文件中有所体现

2、然后我们再创建两个对话框, 将它们放在Tab Page里边一一对应, 将新添加的两个子对话框的属性设置为style-child和border-none。然后就可以在上面加其他控件了。

3、代码实现部分

(1)为这两个对话框分别添加类,查找资料时,只说创建两个类比如CPage1和CPage2。但因为我的这两个标签页都像主对话框一样含有一些要操作的控件,所以我用向导创建了这两个类。方法是,右键点击子对话框->添加类,出现MFC类向导,如下图

修改类名,文件名和头文件名自动生成,这里的基类选择CDialog。

按此方法创建两个类,CComSendSingle和CDialogComRetan

(2)在主对话框头文件里添加这两个类的对象变量,方便操作。

(3)在主对话框应用程序文件里的OnInitDialog函数里,插入这两个子对话框选项卡。

m_tabContorl_send.InsertItem(0, _T("单条发送"));

m_tabContorl_send.InsertItem(1,_T("转发")); //到这里只是添加了两个tab页

//创建两个对话框

m_CDialogSendSingle.Create(IDD_DIALOG_SENDSINGLE, &m_tabContorl_send);

m_CDiaglogRetran.Create(IDD_DIALOG_RETRAN, &m_tabContorl_send);

//设定在Tab内显示的范围

CRect rc;

m_tabContorl_send.GetClientRect(rc);

rc.top += 20;

rc.bottom -= 0;

rc.left += 0;

rc.right -= 0;

m_CDialogSendSingle.MoveWindow(&rc);

m_CDiaglogRetran.MoveWindow(&rc);

//分别设置隐藏和显示

m_CDialogSendSingle.ShowWindow(true);

m_CDiaglogRetran.ShowWindow(false);

//设置默认的选项卡

m_tabContorl_send.SetCurSel(0);

(4)实现点击标签选项卡,实现切换功能

在Tab Control控件创建 TCN_SELCHANGE类型消息,事件响应函数

//标签控件切换标签事件 0是单条发送1转发

void CserialtestDlg::OnTcnSelchangeTabSned(NMHDR *pNMHDR, LRESULT *pResult)

{

// TODO: 在此添加控件通知处理程序代码

int index = m_tabContorl_send.GetCurSel(); //获取标签选项卡当前序号(第几页)

switch(index)

{

case 0:

m_CDialogSendSingle.ShowWindow(true);  //序号0设置显示

m_CDiaglogRetran.ShowWindow(false); //序号1设置隐藏

if(pCComSer != NULL)

{

DispStatus(pCComSer); //显示主串口数据

}

break;

case 1:

m_CDialogSendSingle.ShowWindow(false);  //序号0设置隐藏

m_CDiaglogRetran.ShowWindow(true); //序号1设置显示

if(pCComSerReTran != NULL)

{

DispStatus(pCComSerReTran); //显示转发串口数据

}

else

{

m_CDiaglogRetran.dispParamSet(); //初始串口参数各组合框默认显示

}

break;

default:

break;

}

*pResult = 0;

}

;

实现方法主要参考:

http://blog.163.com/gz_ricky/blog/static/1820491182011061180897/

http://blog.csdn.net/hustspy1990/article/details/5425365

http://www.jb51.net/article/68552.htm

介绍一下本节用到几个函数。

(1)m_tabContorl_send.InsertItem(0, _T("单条发送"));

m_tabContorl_send.InsertItem(1,_T("转发")); //到这里只是添加了两个tab页

CTabCtrl::InsertItem
BOOL InsertItem( int nItem, TC_ITEM* pTabCtrlItem );
BOOL InsertItem( int nItem, LPCTSTR lpszItem );
BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage);
BOOL InsertItem( UINT nMask int nItem, LPCTSTR lpszItem, int nImage, LPARAM lParam );
返回值:
如果成功则返回从零开始的索引;否则返回-1。
参数:

nItem

新标签的从零开始的索引。

pTabCtrlItem

指向一个TCITEM结构的指针,该结构指定了该标签的属性。

lpszItem

指向要插入的项的指针。

nImage

一个将要被插入的图像的在一个图像列表中的从零开始的索引。

nMask

指定要设置的是哪些TCITEM结构属性。可以是零或下列值的一个组合:

·

TCIF_TEXT

pszText成员是有效的。

·

TCIF_IMAGE

iImage成员是有效的。

·

TCIF_PARAM

lParam成员是有效的。

·

TCIF_RTLREADING

用从右到左的读取顺序在Hebrew或Arabic系统中显示pszText的文本。

·

TCIF_STATE

dwState成员是有效的。

lParam

与此标签相关联的应用程序定义的数据。

说明:
此成员函数用来将一个新的标签插入到一个已有的标签控件中。

(2)m_CDialogSendSingle.Create(IDD_DIALOG_SENDSINGLE, &m_tabContorl_send);

CDialog::Create
BOOL Create(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd = NULL);
返回值:
如果对话框创建和初始化成功,则返回非零值,否则为0。
参数:

lpszTemplateName

包含一个对话框模板资源的空终止字符串。

pParentWnd

指向含有对话框的父窗口对象的指针。如果为NULL,对话框对象的父窗口设置为应用的主窗口。

nIDTemplate

包含对话框模板资源的ID数。

说明:
调用Create,使用资源中对话框模板来创建非模态对话框。可将调用置于构造程序内部或者在构造程序启动之后调用。
Create成员函数为访问对话框模板资源提供了两种方法,既可以通过模板名称,也可以模板ID号(如IDD_DIALOG1)。
每种访问方法都会给父窗口传递一个指针。如果pParentWnd为NULL,则应用的主窗口作为其父窗口或所有者窗口来进行创建。
当创建对话框后,Create成员函数应立即返回。

注意这个变量是一个对话框类的变量,当时创建类时也是基类是CDialog,创建两个对话框,其父类窗口是标签控件。标签控件的父类窗口就是主对话框窗口。

CserialtestDlg* CComSendSingle :: MYGetParent()

{

return (CserialtestDlg*)(GetParent()->GetParent());

}

在CComSendSingle 这个子对话框里点击按钮时,按下面响应函数里的方法,调用主对话框类的函数,可以成功。

void CComSendSingle::OnBnClickedButtonSend()

{

...

MYGetParent()->DispStatus(pCComSer);

MYGetParent()->m_CheckShowSend.GetCheck();

...

}

但在另一个子对话框里,不是在响应事件的函数方法里按上面的方法,运行时就会报错。

//int index = MYGetParent()->m_tabContorl_send.GetCurSel();

只能绕路换种方法来实现此功能。

int index = ((CMy3GHostSimDlg *)pCComSer->pDlg)->m_tabContorl_send.GetCurSel();

因为不太理解,对话框和对话框类结合的机制,所以运用还不好。通过类间传指针来间接操作。

(3)m_tabContorl_send.GetClientRect(rc); //获取标签控件 窗口位置和指针

该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)。这里应该注意一下:坐标包含两种:屏幕坐标与客户区坐标。严格区分这两种坐标对于理解Windows编程是很重要的。

在Win32 SDK, 该API函数原型为

BOOL GetClientRect(

HWND hWnd, // 窗口句柄

LPRECT lpRect // 客户区坐标

);

在MFC中,该函数的原型为void GetClientRect(LPRECT lpRect) const;

(4)m_CDialogSendSingle.MoveWindow(&rc);

m_CDiaglogRetran.MoveWindow(&rc);

功能是改变指定窗口的位置和大小

(5)ShowWindow()

显示和隐藏控件在《(四)添加ComboBox组合框》里也有使用,当时使用的是

ShowWindow(SW_SHOW)和ShowWindow(SW_HIDE),与本例的

ShowWindow(true)和ShowWindow(false)功能是一样的。

m_tabContorl_send.SetCurSel(0);//设置默认的选项卡

CTabCtrl::SetCurSel
int SetCurSel( int nItem );
返回值:
如果成功则返回先前选择的标签的从零开始的索引;否则返回-1。
参数:

nItem

要选择项的从零开始的索引。

说明:
此成员函数用来从一个标签控件中选择一个标签。当一个标签是通过使用这个函数被选择的时候,标签控件就不会发送TCN_SELCHANGING或TCN_SELCHANGE通知消息。当用户提供点击或使用键盘来改变标签时,将使用WM_NOTIFY来发送这些通知消息。

(6)int index = m_tabContorl_send.GetCurSel(); //获取标签选项卡当前序号(第几页)

CTabCtrl::GetCurSel
int GetCurSel( ) const;
返回值:
如果成功则返回所选标签的从零开始的索引,如果没有标签被选择则返回-1。
说明:
此成员函数用来获取一个标签控件中当前选择的标签。

通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件的更多相关文章

  1. 通过编写串口助手工具学习MFC过程--(十一)弹出模态型对话框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  2. 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  3. 通过编写串口助手工具学习MFC过程——(九)自动识别串口的方法

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  4. 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  5. 通过编写串口助手工具学习MFC过程——(六)添加Edit编辑框控件

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  6. 通过编写串口助手工具学习MFC过程——(五)添加CheckBox复选框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  7. 通过编写串口助手工具学习MFC过程——(四)添加ComboBox组合框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  8. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  9. 通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

随机推荐

  1. Linux培训教程 linux中nl命令使用介绍

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  2. FastDfs单机版搭建

    详细的最新版fastdfs单机版搭建 前言 目前项目是tomcat单机部署的,图片.视频也是上传到tomcat目录下,关键是此项目的主要内容还就是针对图片.视频的,这让我非常担忧:文件服务器的应用是必 ...

  3. ArrayList,Vector ,LinkedList的存储性能和特性

    ArrayList,Vector,LinkedList : 两者都采用数组元素方式存储数据,此数组元素数大于实际存储的数据(以便于增加和插入元素),允许直接按照序号索引元素,但是插入元素涉及数组元素移 ...

  4. Luogu P5468 [NOI2019]回家路线 (斜率优化、DP)

    题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...

  5. Codechef SEAARC Sereja and Arcs (分块、组合计数)

    我现在真的什么都不会了呢...... 题目链接: https://www.codechef.com/problems/SEAARC 好吧,这题其实考察的是枚举的功力-- 题目要求的是\(ABAB\)的 ...

  6. 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载

    这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...

  7. 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)

    目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...

  8. leetcode-mid-math-172. Factorial Trailing Zeroes-NO-????

    mycode 问题:为甚在小于200的时候,答案ok,大于等于200的时候,就少一个1??? class Solution(object): def trailingZeroes(self, n): ...

  9. Spring 缓存注解解析过程

    Spring 缓存注解解析过程 通过 SpringCacheAnnotationParser 的 parseCacheAnnotations 方法解析指定方法或类上的缓存注解, @Cacheable ...

  10. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第1节 基本概念_02maven依赖管理的概念

    传统的web项目jar放在项目中,占用磁盘空间 maven项目里面只保存jar包的坐标.jar包文件都在仓库中.扎包重用都在jar包仓库中.