MFC 控件使用教程

 

combo box控件用法:编程

下拉选择控件,首先将控件拖动到你须要使用控件的地方,用ClassWizard为它关联一个变量,咱们注意到变量类型是CString型的。右击属性,General中能够设置通常属性类容Data中能够设置该控件下拉选择的内容,Styles中设置combo box控件风格,Extended Styles设置扩展风格,主要的设置在Data中,Data中设置了下拉菜单的全部下拉内容,如图所示。网络

在Data中每一行做为一个下拉菜单的一行内容,其中要注意的是换行应该用Ctrl+Enter。框架

在肯定按钮添加消息响应函数为函数

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. char *   sz   =   m_nihao.GetBuffer(m_nihao.GetLength());  
  3. MessageBox(sz,"ss",MB_OK);  

 


Button:this

按钮控件是最简单的一个控件,将按钮拖动到要显示的地方,右击属性设置按钮的ID,名称,也可使用SetDlgItemText来设置按钮的文本,双击拖动好的按钮为按钮添加消息响应函数便可,有一个小窍门,要实现单击按钮后实现按钮文本改变的方法,直接在消息响应函数中添加SetDlgItemText函数便可,在按钮单击时改变按钮的文本。spa

[cpp]  view plain  copy
 
  1.         int ret;  
  2. UpdateData(TRUE);  
  3. SetDlgItemText(IDOK,"已经按下");  
  4. char *   sz   =   m_nihao.GetBuffer(m_nihao.GetLength());  
  5. ret=MessageBox(sz,"ss",MB_OK);  
  6. if (ret==IDOK)  
  7. {  
  8.     SetDlgItemText(IDOK,"肯定");  
  9. }  

 

 


Check Box控件:.net

Check Box控件是一个多选控件,首先添加一个Check Box控件到你的用户界面,用ClassWizard关联变量时发现这个控件的变量类型是BOOL型变量,那么咱们就基本上了解这个控件的用法了,检查这个控件是否被按下的一个简单方法就是判断这个控件的虚拟变量值是TRUE仍是FLASE。可是首先须要UpdateData(TRUE);code

那么咱们就为OnOK这个按钮添加消息响应函数:orm

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. if (m_check==TRUE)  
  3. {MessageBox("Check Box按下",NULL,MB_OK);}  

就能实现咱们的功能。blog

 

 

Radio Button:

这个按钮实现的目的和Check Box差很少可是不一样的是Check Box控件是在最终咱们须要执行的消息响应函数中才检查这个选项是否被选中,而Radio Button是按下后,界面当即响应,执行这个按钮的消息响应函数,因此这个控件没有虚拟变量,而是直接为这个控件添加消息响应事件,和按钮的添加方法相同,不作过多赘述。

 

 

List Control:

List Control这个控件比较有意思,我对这个控件使用的也比较少,这里只提供一种使用方法,这里以我作过的一个网络嗅探器为例:

这里以***表明工程名,如sniffer。

首先拖动控件到你须要使用控件的地方,打开ClassWizard,为其关联一个变量,如:m_CtrList。而后找到***Dlg.cpp文件,在对话框函数中(文档工程也许不一样,但都在主窗口函数中)BOOL C***Dlg::OnInitDialog()中添加以下代码设置空间风格:

[cpp]  view plain  copy
 
  1. DWORD dwStyle=GetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE);                   
  2. dwStyle&=~LVS_TYPEMASK;  
  3. dwStyle|=LVS_REPORT;  
  4. SetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE,dwStyle);  


最后插入想要输入的列名:

[cpp]  view plain  copy
 
  1. m_CtrList.InsertColumn(0,"数据",LVCFMT_LEFT,525);  
  2.     m_CtrList.InsertColumn(0,"目的端口",LVCFMT_LEFT,60);  
  3.     m_CtrList.InsertColumn(0,"源端口",LVCFMT_LEFT,50);  
  4.     m_CtrList.InsertColumn(0,"协议",LVCFMT_LEFT,40);  
  5.     m_CtrList.InsertColumn(0,"目的IP地址",LVCFMT_LEFT,100);  
  6.     m_CtrList.InsertColumn(0,"源IP地址",LVCFMT_LEFT,100);      

这个基本上控件就设置好了,下面说明如何显示须要输出的文本:

假设每一列的数据都依次在S[3],port1,port2,date中,都是字符串

[cpp]  view plain  copy
 
  1. index=m_CtrList.InsertItem(0,s1);//建立一行  
  2. m_CtrList.SetItemText(index,1,s2);  
  3. m_CtrList.SetItemText(index,2,s3);  
  4. m_CtrList.SetItemText(index,3,port1);  
  5. m_CtrList.SetItemText(index,4,port2);  
  6. m_CtrList.SetItemText(index,5,date);  

这样就能够显示出正确的文本了。

 

 

Edit Box:

这个控件是MFC的主要输入控件,从英文名称就能够看出来。

这个控件的使用也至关简单,用鼠标拖动控件到想要使用的地方,打开ClassWizard为其关联虚拟变量,关联的时候能够选择这个变量的类型,有INT,CString,UINT。。。。等等N多种类型,几乎涵盖了全部经常使用变量类型。关联好变量以后就可使用了。

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. char *   sz   =m_edit.GetBuffer(m_edit.GetLength());  
  3. MessageBox(sz,"ss",MB_OK);  

另外用Edit Box控件输出一些内容也是能够的,只须要把要输出的内容直接赋值给这个控件的关联变量便可,最后刷新数据。

[cpp]  view plain  copy
 
  1. void CAaDlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.     m_edit="你好";  
  5.     UpdateData(FALSE);//注意这里UpdateData的参数是FALSE,至于参数问题,能够自行查找MSDN  
  6. }  
  7.   
  8.    

 

 

Process:

进度条控件也是一个经常使用控件,当咱们将进度条拖动到界面上时为其添加一个消息响应函数,咱们会看到消息响应函数的类型是CProcessCtrl,咱们经过查询MSDN不难发现,微软为咱们提供了不少进度条函数。最经常使用的就是三个函数。

SetRange    设置进度条最大最小值

SetStep      设置进度条步长

StepIt       增长一个步长

至于进度条的风格,能够右击进度条属性设置,也能够CProcessCtrl类中的成员函数。

首先和List Box控件同样,咱们须要在C***Dlg::OnInitDialog()函数中设置好进度条的最大最小值,以及步长等一些必要属性,包括进度条风格等等。

而后就要在须要的时候增长步长,咱们还以上面网络嗅探器为例,,咱们循环500次,嗅探500个网络数据包,那么设置进度条最小值为0最大值为500,步长为1,那么每次循环增长一次步长就能够了,这个很好理解。

[cpp]  view plain  copy
 
  1. C***Dlg::OnInitDialog()中添加以下代码:  
  2. m_process.SetRange(0,500);//设置进度条进度范围  
  3. 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的消息。咱们在咱们的“注册”按钮的消息响应函数中添加以下代码:

[cpp]  view plain  copy
 
  1. WORD virtualcode,modifiers;  
  2. m_Hotkey.GetHotKey(virtualcode,modifiers);            //接收热键信息存储下来  
  3. if (!RegisterHotKey(this->m_hWnd,100,modifiers,virtualcode))     //注册热键  
  4. {  
  5.     MessageBox("热键设置冲突","错误",MB_OK);  
  6. }  
  7. else  
  8.     MessageBox("热键设置成功","成功",MB_OK);  

3.填写消息映射:

到这一步咱们的热键已经注册成功了,可是咱们按下热键时,时没有反应的,由于咱们并无告诉计算机,按下热键之后干什么。MFC是一个基于消息驱动的框架代码。因此咱们要为咱们要就收WM_HOTKEY的窗口添加消息映射,使得当窗口接收到WM_HOTKEY消息的时候可以执行咱们的热键函数。打开ClassWizard

咱们在其中并无发现WM_HOTKEY消息,微软并无为咱们封装,因此咱们只有本身动手了。

在***Dlg.cpp文件中找到以下代码:

[cpp]  view plain  copy
 
  1. BEGIN_MESSAGE_MAP(CMFCHotKeyDlg, CDialog)  
  2.     //{{AFX_MSG_MAP(CMFCHotKeyDlg)  
  3.     ON_WM_SYSCOMMAND()  
  4.     ON_WM_PAINT()  
  5.     ON_WM_QUERYDRAGICON()  
  6.     ON_BN_CLICKED(IDOK, OnSet)  
  7.     //}}AFX_MSG_MAP  
  8. END_MESSAGE_MAP()  

这是MFC自定义的一个消息映射处理代码,在其中添加ON_MESSAGE(WM_HOTKEY,MyHotKey),这里的MyHotKey是咱们等会须要定义的自定义热键处理函数。

4.填写热键响应函数:

找到***Dlg.h的头文件,在窗口类的protected中添加一个消息响应函数申明afx_msg void MyHotKey(WPARAM wp,LPARAM lp);

而后再***Dlg.cpp文件中添加消息响应函数的定义:

[cpp]  view plain  copy
 
  1. void CMFCHotKeyDlg::MyHotKey(WPARAM wp,LPARAM lp)  
  2. {  
  3.     MessageBox("热键运行成功","SUCCESS",MB_OK);  
  4. }  


这样基本上就能够了。

 

 

IP Address:

IP控件也是经常使用的控件之一,也是最简单的一个控件,MFC对他的封装无非就是一个字符串的处理。使用起来也至关简便。

首先拖动控件到指定的地方,用ClassWizard为其关联一个变量,咱们看到变量的类型任然是一个类,IPAddressCtrl的类,下面介绍几种经常使用的操做:

1,  将IP地址输出到Ip控件显示:只须要短短两行代码,假定要显示的IP地址是192.168.1.1,则在肯定的消息相应函数添加

[cpp]  view plain  copy
 
  1. CString a="192.168.1.1";  
  2. m_ip.SetWindowText(a);  


 

2.     将IP地址输入到程序中:

[cpp]  view plain  copy
 
  1. BYTE a1,a2,a3,a4;  
  2. m_ip.GetAddress(a1,a2,a3,a4);  
  3. CString str;  
  4. str.Format("%d.%d.%d.%d",a1,a2,a3,a4);//这里的nf获得的值是IP值了.  
  5. MessageBox(str);  


相关文章
相关标签/搜索