通过编写串口助手工具学习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。
说明:
此成员函数用来获取一个标签控件中当前选择的标签。

最新文章

  1. ajax初探01
  2. noip2007解题报告
  3. Win8.1 远程桌面 凭据无法工作
  4. Objective-C中字典的使用方法总结
  5. Linux Shell 数字计算与比较
  6. windows编程socket问题
  7. 命令精解之DOS批处理
  8. Linux解压缩总结
  9. Leet code —Jump Game
  10. golang环境搭建
  11. SQL Server之深入理解STUFF
  12. linux 添加ssh和开启ssh服务apt管理的ubuntu
  13. Huginn定时时间不准确或延后问题
  14. MySql 使用规范推荐(转)
  15. python property的用法
  16. 如何通过创建切片器窗格节省PowerBI报告空间
  17. 熟悉SQL Server 数据类型
  18. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
  19. 常见的mysql 进程state<转自网络>
  20. 用google-code-prettify高亮代码

热门文章

  1. linux 配置内网yum源
  2. net core 返回404方法
  3. Linux入门培训教程 linux网络编程socket介绍
  4. PHP基础教程 10款人气暴涨的PHP开源工具
  5. 查看 XML 文件
  6. luogu P1181 数列分段Section I x
  7. 【bzoj1189】[HNOI2007]紧急疏散evacuate
  8. sh_05_偶数求和
  9. SQL create file遇到操作系统错误5拒绝访问
  10. Sql 中的as是什么意思 + 无列名注入解析