MFC 控件使用教程
combo box控件用法:
下拉选择控件,首先将控件拖动到你需要使用控件的地方,用ClassWizard为它关联一个变量,我们注意到变量类型是CString型的。右击属性,General中可以设置一般属性类容Data中可以设置该控件下拉选择的内容,Styles中设置combo box控件风格,Extended Styles设置扩展风格,主要的设置在Data中,Data中设置了下拉菜单的所有下拉内容,如图所示。
在Data中每一行作为一个下拉菜单的一行内容,其中要注意的是换行应该用Ctrl+Enter。
在确定按钮添加消息响应函数为
- UpdateData(TRUE);
- char * sz = m_nihao.GetBuffer(m_nihao.GetLength());
- MessageBox(sz,"ss",MB_OK);
Button:
按钮控件是最简单的一个控件,将按钮拖动到要显示的地方,右击属性设置按钮的ID,名称,也可以使用SetDlgItemText来设置按钮的文本,双击拖动好的按钮为按钮添加消息响应函数即可,有一个小窍门,要实现单击按钮后实现按钮文本改变的方法,直接在消息响应函数中添加SetDlgItemText函数即可,在按钮单击时改变按钮的文本。
- int ret;
- UpdateData(TRUE);
- SetDlgItemText(IDOK,"已经按下");
- char * sz = m_nihao.GetBuffer(m_nihao.GetLength());
- ret=MessageBox(sz,"ss",MB_OK);
- if (ret==IDOK)
- {
- SetDlgItemText(IDOK,"确定");
- }
Check Box控件:
Check Box控件是一个多选控件,首先添加一个Check Box控件到你的用户界面,用ClassWizard关联变量时发现这个控件的变量类型是BOOL型变量,那么我们就基本上了解这个控件的用法了,检查这个控件是否被按下的一个简单方法就是判断这个控件的虚拟变量值是TRUE还是FLASE。但是首先需要UpdateData(TRUE);
那么我们就为OnOK这个按钮添加消息响应函数:
- UpdateData(TRUE);
- if (m_check==TRUE)
- {MessageBox("Check Box按下",NULL,MB_OK);}
就能实现我们的功能。
Radio Button:
这个按钮实现的目的和Check Box差不多但是不同的是Check Box控件是在最终我们需要执行的消息响应函数中才检查这个选项是否被选中,而Radio Button是按下后,界面立即响应,执行这个按钮的消息响应函数,所以这个控件没有虚拟变量,而是直接为这个控件添加消息响应事件,和按钮的添加方法相同,不做过多赘述。
List Control:
List Control这个控件比较有意思,我对这个控件使用的也比较少,这里只提供一种使用方法,这里以我做过的一个网络嗅探器为例:
这里以***代表工程名,如sniffer。
首先拖动控件到你需要使用控件的地方,打开ClassWizard,为其关联一个变量,如:m_CtrList。然后找到***Dlg.cpp文件,在对话框函数中(文档工程也许不同,但都在主窗口函数中)BOOL C***Dlg::OnInitDialog()中添加如下代码设置空间风格:
- DWORD dwStyle=GetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE);
- dwStyle&=~LVS_TYPEMASK;
- dwStyle|=LVS_REPORT;
- SetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE,dwStyle);
最后插入想要输入的列名:
- m_CtrList.InsertColumn(0,"数据",LVCFMT_LEFT,525);
- m_CtrList.InsertColumn(0,"目的端口",LVCFMT_LEFT,60);
- m_CtrList.InsertColumn(0,"源端口",LVCFMT_LEFT,50);
- m_CtrList.InsertColumn(0,"协议",LVCFMT_LEFT,40);
- m_CtrList.InsertColumn(0,"目的IP地址",LVCFMT_LEFT,100);
- m_CtrList.InsertColumn(0,"源IP地址",LVCFMT_LEFT,100);
这个基本上控件就设置好了,下面说明如何显示需要输出的文本:
假设每一列的数据都依次在S[3],port1,port2,date中,都是字符串
- index=m_CtrList.InsertItem(0,s1);//创建一行
- m_CtrList.SetItemText(index,1,s2);
- m_CtrList.SetItemText(index,2,s3);
- m_CtrList.SetItemText(index,3,port1);
- m_CtrList.SetItemText(index,4,port2);
- m_CtrList.SetItemText(index,5,date);
这样就可以显示出正确的文本了。
Edit Box:
这个控件是MFC的主要输入控件,从英文名称就可以看出来。
这个控件的使用也相当简单,用鼠标拖动控件到想要使用的地方,打开ClassWizard为其关联虚拟变量,关联的时候可以选择这个变量的类型,有INT,CString,UINT。。。。等等N多种类型,几乎涵盖了所有常用变量类型。关联好变量之后就可以使用了。
- UpdateData(TRUE);
- char * sz =m_edit.GetBuffer(m_edit.GetLength());
- MessageBox(sz,"ss",MB_OK);
另外用Edit Box控件输出一些内容也是可以的,只需要把要输出的内容直接赋值给这个控件的关联变量即可,最后刷新数据。
- void CAaDlg::OnOK()
- {
- // TODO: Add extra validation here
- m_edit="你好";
- UpdateData(FALSE);//注意这里UpdateData的参数是FALSE,至于参数问题,可以自行查找MSDN
- }
Process:
进度条控件也是一个常用控件,当我们将进度条拖动到界面上时为其添加一个消息响应函数,我们会看到消息响应函数的类型是CProcessCtrl,我们通过查询MSDN不难发现,微软为我们提供了很多进度条函数。最常用的就是三个函数。
SetRange 设置进度条最大最小值
SetStep 设置进度条步长
StepIt 增加一个步长
至于进度条的风格,可以右击进度条属性设置,也可以CProcessCtrl类中的成员函数。
首先和List Box控件一样,我们需要在C***Dlg::OnInitDialog()函数中设置好进度条的最大最小值,以及步长等一些必要属性,包括进度条风格等等。
然后就要在需要的时候增加步长,我们还以上面网络嗅探器为例,,我们循环500次,嗅探500个网络数据包,那么设置进度条最小值为0最大值为500,步长为1,那么每次循环增加一次步长就可以了,这个很好理解。
- C***Dlg::OnInitDialog()中添加如下代码:
- m_process.SetRange(0,500);//设置进度条进度范围
- m_process.SetStep(1);//设置进度条步长
循环部分添加如下代码:
每一次循环中m_process.StepIt();
Hot Key:
热键是MFC中非常重要的一个控件之一,热键可以轻松实现一个甚至多个组合键的热键,如果没有热键,假使你要用动态链接库dll或者其他什么全局钩子的方法实现热键功能的话可谓相当麻烦,甚至很难解决数量不定的多个组合键的热键,所以掌握好热键可以帮助我们很多事情。
MFC封装的热键使得我们编程起来也是相当容易。步骤大概就是输入热键->注册热键->填写消息映射->填写热键响应函数,这里有两个小细节。
1. 根据资料,注册热键之后有两种方法实现热键,此处写的是RegisterHotKey方法实现的热键。
2. 根据网上的资料,MFC的热键的宏定义和API函数RegisterHotKey的宏定义是有误差的,这算是一个BUG,导致CTRL和Shift键相互颠倒,但是不幸的是我在写程序的时候并没有遇到这种情况,也不能妄下定论。
下面我们来看看Hot Key控件时如何使用的。
1.首先按照步骤输入热键:
拖动一个Hot Key控件到想设置的地方,用ClassWizard为其关联一个变量,比如m_Hotkey,这样就可以接受到输入的热键了。
2.注册热键:
这一步的目的是为了向窗口注册一个热键,当热键来到的时候向窗口发送WM_HOTKEY的消息。我们在我们的“注册”按钮的消息响应函数中添加如下代码:
- WORD virtualcode,modifiers;
- m_Hotkey.GetHotKey(virtualcode,modifiers); //接收热键信息存储下来
- if (!RegisterHotKey(this->m_hWnd,100,modifiers,virtualcode)) //注册热键
- {
- MessageBox("热键设置冲突","错误",MB_OK);
- }
- else
- MessageBox("热键设置成功","成功",MB_OK);
3.填写消息映射:
到这一步我们的热键已经注册成功了,但是我们按下热键时,时没有反应的,因为我们并没有告诉计算机,按下热键以后干什么。MFC是一个基于消息驱动的框架代码。所以我们要为我们要就收WM_HOTKEY的窗口添加消息映射,使得当窗口接收到WM_HOTKEY消息的时候能够执行我们的热键函数。打开ClassWizard
我们在其中并没有发现WM_HOTKEY消息,微软并没有为我们封装,所以我们只有自己动手了。
在***Dlg.cpp文件中找到如下代码:
- BEGIN_MESSAGE_MAP(CMFCHotKeyDlg, CDialog)
- //{{AFX_MSG_MAP(CMFCHotKeyDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDOK, OnSet)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
这是MFC自定义的一个消息映射处理代码,在其中添加ON_MESSAGE(WM_HOTKEY,MyHotKey),这里的MyHotKey是我们等会需要定义的自定义热键处理函数。
4.填写热键响应函数:
找到***Dlg.h的头文件,在窗口类的protected中添加一个消息响应函数申明afx_msg void MyHotKey(WPARAM wp,LPARAM lp);
然后再***Dlg.cpp文件中添加消息响应函数的定义:
- void CMFCHotKeyDlg::MyHotKey(WPARAM wp,LPARAM lp)
- {
- MessageBox("热键运行成功","SUCCESS",MB_OK);
- }
这样基本上就可以了。
IP Address:
IP控件也是常用的控件之一,也是最简单的一个控件,MFC对他的封装无非就是一个字符串的处理。使用起来也相当简便。
首先拖动控件到指定的地方,用ClassWizard为其关联一个变量,我们看到变量的类型任然是一个类,IPAddressCtrl的类,下面介绍几种常用的操作:
1, 将IP地址输出到Ip控件显示:只需要短短两行代码,假定要显示的IP地址是192.168.1.1,则在确定的消息相应函数添加
- CString a="192.168.1.1";
- m_ip.SetWindowText(a);
2. 将IP地址输入到程序中:
- BYTE a1,a2,a3,a4;
- m_ip.GetAddress(a1,a2,a3,a4);
- CString str;
- str.Format("%d.%d.%d.%d",a1,a2,a3,a4);//这里的nf得到的值是IP值了.
- MessageBox(str);