vc之控件篇
VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。
VC6.0中控件及按钮的设置和使用

VC6.0中控件及按钮的设置和使用VC学习笔记1:按钮的使能与禁止用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;则m_Button1.EnableWindow(true); 使按钮处于允许状态m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示VC学习笔记2:控件的隐藏与显示用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。
例1:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_HIDE ); //隐藏控件例2:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_SHOW ); //显示控件以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。
VC学习笔记3:改变控件的大小和位置用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);void MoveWindow(LPCRECT lpRect);第一种用法需给出控件新的坐标和宽度、高度;第二种用法给出存放位置的CRect对象;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);第一个参数我不会用,一般设为NULL;x、y控件位置;cx、cy控件宽度和高度;nFlags常用取值:SWP_NOZORDER:忽略第一个参数;SWP_NOMOVE:忽略x、y,维持位置不变;SWP_NOSIZE:忽略cx、cy,维持大小不变;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ) ; //编辑控件的大小和位置都改变以上方法也适用于各种窗口。
VC中使用TABControl控件

VC中使用TABControl控件VC中使用TAB Control控件假如我现在有个SDI程序,View是Form View,想在上面放个Tab Control,包含两个Page。
现在让我们来看看应该怎样处理。
首先当然要增加一个Tab Control资源,然后利用Class Wizard,在View中增加一个Control变量。
接着建立两个对话框资源,别忘了把Style改为Child,Border 改为None。
然后就可以在上面加其他控件了。
接着利用Class Wizard,分别为这两个对话框建立两个类,比如CPage1和CPage2。
然后在View类头文件中,加入这两个对话框对象。
同时增加一个变量int m_CurSelTab,用了表明是哪个Page即将被切换。
为了避免用户在切换Tab时,程序对Tab Index的枚举,可以利用数组来做这个事情。
在View的初始化函数中需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面,等等。
void CTab_testView::OnInitialUpdate(){CFormView::OnInitialUpdate(); GetParent()-RecalcLayout(); ResizeParentToFit();//为Tab Control增加两个页面m_tab.InsertItem(0, _T(“First"));m_tab.InsertItem(1, _T("Second")); //创建两个对话框m_page2.Create(IDD___, m_tab); //设定在Tab内显示的范围CRect rc;m_tab.GetClientRect(rc);rc.top += 20;rc.bottom -= 8;rc.left += 8;rc.right -= 8;m_page1.MoveWindow(rc);m_page2.MoveWindow(rc);//把对话框对象指针保存起来pDialog = m_page1;pDialog = m_page2;//显示初始页面pDialog-ShowWindow(SW_SHOW);pDialog-ShowWindow(SW_HIDE);//保存当前选择m_CurSelTab = 0;}这里面需要注意的是,我用了一个CDialog指针数组来进行保存,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。
vc常用控件

1.表头控制Header Control2.图像列表控制Image List3.列表控制和视List Control&List View4.树控制和视Tree Control&Tree View5.标签控制和视Tab Control&Tab View6.工具条控制Toolbar Control7.进度条控制Progress Control8.滑动条控制Slider Control9.旋转按钮控制Spin Button Control10.状态条控制Status Bar Control其中,绝大部分通用控制在MFC类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到MFC结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。
两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过CListCtrl& ctrlList =GetListCtrl()成员函数取得视类引用ctrlList之后,就可以利用列表视的视函数对视进行各项操作(ctrlList.Add等)。
第1章演练CHeadCtrl表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。
一般为数据列的标题,可以包括多个部分,用户可以拖动每个部分并可以控制每列的宽度。
表头控制类提供了普通表头控制的基本方法,只有在WINDOWS95以后版本系统中才提供,其方法包含在afxcmn.h文件中,一般与标签控制(CTabCtrl)和列表控制(CListCtrl)组合使用。
1.1 表头控制的对象结构1.1.1 表头控制对象的建立方法CHeaderCtrl &cheaderCtrl 建立表头控制对象Create 建立表头并绑定对象CHeaderCtrl::Create的格式如下:BOOL Create( DWORD dwStyle, const RECT&rect, CWnd* pParentWnd, UINT nID );其返回值非零时初始化成功,否则失败。
VC中FlexGrid控件的使用及合并单元格

VC中FlexGrid控件的使用及合并单元格、可编辑操作!1. 给FlexGrid控件绑定成员变量:m_FlexGrid。
2. 设置行列数m_FlexGrid.SetCols(4); //设置列数m_FlexGrid.SetRows(6); //设置行数3. 设置固定行数和固定列数m_FlexGrid.SetFixedRows(1); //设置固定行数为1行m_FlexGrid.SetFixedCols(0); //设置固定列数为0列4. 设置列宽、行高m_FlexGrid.SetColWidth(1,1500); //设置列号为1的列宽为1500m_FlexGrid.SetRowHeight(2,300); //设置行号为2的行高为3005. 设置文本对齐方式m_FlexGrid.SetColAlignment(1,4); //设置列号为1的文本对齐方式参数对应描述为:0 单元内容顶部左对齐。
1 单元内容中间左对齐。
对字符串的缺省设置值。
2 单元内容底部左对齐。
3 单元内容顶部居中。
4 单元内容中间居中。
5 单元内容底部居中。
6 单元内容顶部右对齐。
7 单元内容中间右对齐。
对数字的缺省设置值。
8 单元内容底部右对齐。
9 单元内容一般对齐方式。
对字符串中间左对齐而对数值中间右对齐。
6. 设置表头和单元格内容m_FlexGrid.SetTextArray(0,"Head1"); //设置表头(第1列)内容为“Head1”m_FlexGrid.SetTextMatrix(1,1,"Text"); //设置单元格(行号1列号1)内容为“Text”7. 增加一行m_FlexGrid.AddItem("AddString",(COleVariant)(3L)); //在行号为3的位置增加一行8. 合并单元格for(i=0;i<4;i++)m_FlexGrid.SetTextMatrix(5,i,"合计"); //将行号为5、列号从0到4的单元格内容设为相同“合计”m_FlexGrid.SetMergeCells(2); //设置单元格合并方式(下述)m_FlexGrid.SetMergeRow(5,TRUE); //设置要合并的行SetMergeCells函数的参数值如下:0: flexMergeNever 默认的选项,就是不合并1: flexMergeFree 不规则的合并2: flexMergeRestrictRows 行合并3: flexMergeRestrictColumns 列合并4: flexMergeRestrictBoth 行,列都合并注意只有单元格内容相同时才能进行合并操作。
vc tab控件的用法

vc tab控件的用法
VC中的Tab控件是一种用于创建多页面的用户界面(UI)的工具。
它可以让用户在不同的页面之间切换,以便更好地管理和显示不同的内容。
要使用VC中的Tab控件,您需要执行以下步骤:
1. 在您的VC项目中添加Tab控件。
您可以在Visual Studio的设计视图中直接从工具箱中拖动Tab控件到您的UI中,或者您也可以手动编写代码来创建Tab 控件。
2. 配置Tab控件的属性。
您可以通过属性窗口来设置Tab控件的属性,例如Tab 页的样式、位置、大小等。
3. 添加Tab页。
您可以使用Tab控件的“Pages”属性来添加Tab页。
每个Tab 页都是一个单独的窗口,可以包含您想要显示的内容。
4. 在每个Tab页中添加控件。
您可以在每个T ab页中添加其他控件,例如按钮、文本框、标签等,以便用户可以与页面进行交互。
5. 编写事件处理程序。
您需要编写事件处理程序来处理用户与Tab控件的交互,例如当用户单击一个Tab页时,您可能需要显示不同的内容。
总之,VC中的Tab控件是一种非常有用的工具,可以让您创建复杂的UI,并在不同的页面中显示不同的内容。
如果您想要在您的应用程序中使用Tab控件,请参考VC的文档或教程以获取更多信息。
1。
VC++基础控件案例图详解

V C++基础控件案例图详解-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN一.简单MFC应用程序开发。
例1. 编写如下图的程序,若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。
(1)工程创建①选择“文件|新建”命令;②在“工程”选项卡中,选定“MFC App Wizard(exe),输入工程名称TEST,单击“确定”按钮;③选定“D基本对话框”即创建基于对话框的应用程序,单击“完成”按钮。
(2)放置控件,先删除原有的控件,然后放置本例需要的控件,本例共涉及4个控件:2个编辑框和2个命令按钮。
编辑框主要用来输入数据,也可以用来显示数据;命令按钮用来执行有关操作。
(3)设置控件的属性,控件添加后就要设置其有关的属性。
上编辑框的属性设置:选定“Multiline”复选框,编辑框中可以输入多行文本;选定“Vertical scroll和Auto VScroll,编辑框将有垂直滚动条;选定“Want Return”。
下编辑框的属性设置同上编辑框,但可不选定“Want Return”。
(4)连接变量,为控件连接变量就是为控件起一个名字。
每一个控件都是一个对象,调用MFC类库中的函数都是通过对象来实现的。
编辑框属于CEdit类,一个具体的编辑框就是一个CEdit类的对象,如上IDC_EDIT1和IDC_EDIT2。
这些对象必须有名称才能对它们进行操作,所以要给每一个对象连接一个变量,作为对象的名称。
这个变量将成为类中的一个数据成员。
现在为IDC_EDIT1连接一个变量m_e1。
①在IDC_EDIT1编辑框中右击鼠标出现快捷菜单选择“建立类向导”,如下图所示。
②在上图中选择“创建类向导”后,弹出如下图所示的MFC ClassWizard对话框,在“Member Variables”中,选定“IDC_EDIT1”,再选择“Add Variable”按钮。
vc复选框及相关控件使用

5.复选框单选框下面以一个具体的例子演示复选框和单选框的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105b。
(2)在对话框上加一个静态文本框和两个单选框,标题分别是“性别”、“男”、“女”,第一个单选框选中群组(Group)属性,按下Ctrl+T组合键测试一下,是否只能选“男”或“女”。
(3)利用类向导,为第一个单选框增加一个整型的成员变量m_iSex。
(4)增加1个静态文本框和3个复选框,标题分别是“个人爱好”、“中国象棋”、“上网聊天”和“电脑游戏”。
(5)双击“确定”按钮增加响应函数,具体代码如下:void CEx040105bDlg::OnOK(){CDialog::OnOK();CString strMess ;if(0 == m_iSex)strMess = "你是帅哥\n";else if(1 == m_iSex)strMess = "你是美女\n";elsestrMess = "性别未知\n";//复选框也可以关联变量,如果关联的变量值为true表示被选中,此处用另外一种方法。
strMess += "---------------\n你的受好\n";CButton * pBtn = NULL ;pBtn = (CButton * )GetDlgItem(IDC_CHECK1);if(NULL != pBtn && pBtn->GetCheck())strMess += "中国象棋\n";pBtn = (CButton * )GetDlgItem(IDC_CHECK2);if(NULL != pBtn && pBtn->GetCheck())strMess += "上网聊天\n";pBtn = (CButton * )GetDlgItem(IDC_CHECK3);if(NULL != pBtn && pBtn->GetCheck())strMess += "电脑游戏\n";AfxMessageBox(strMess);}(6)为了美观,可以加一个群组控件,并把对话框的标题改成“个人信息”,按Ctrl + F5组合键创建并运行Ex040105b.exe,效果如图4-9所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC之控件篇1 使用Windows标准控件1.1 常见控件列表Windows标准控件即普通控件,撰写此文时,笔者每天面对的Word就带了一脸的控件,当然你肯定也熟悉:字体选择下拉框、工具栏、滚动条、状态栏,如此等等。
常见的Windows标准控件在VC里就有:图2 控件集窗口通常这个控件集窗口在你的对话框设计界面的附近总能找到,如果找不到,在VC工具栏的任何空白处点击右键,在弹出菜单的Controls菜单项前面打上勾即可,如图所示:图3 显示控件集窗口你也许已经看到了,我们图1所示的FlashPlayer中有3个控件是Windows标准控件,好,我们先系统地学习一下怎么使用这3个控件。
1.2 引入控件1. 准备对话框对话框相当于控件的容器,我们当然要先准备一个对话框。
好办,直接创建一个基于对话框的工程就是了:图4 准备对话框Step 1注意,在Step 2中要确认“3D Controls”和“ActiveX Controls”前面打上勾,如图所示:图5 准备对话框Step 2这样你的程序就支持三维控件和我们后面即将使用到的ActiveX控件了。
如果去掉了勾,或者你面对的正是你师兄当年准备论文的旧的project,它好像并不支持ActiveX控件,那该怎么办呢(好多VC网友总是带着那张哭丧脸的表情问我这种问题)?没事,在主程序文件的Ini tInstance()函数头部加上以下语句即可:查看源代码拷贝至剪贴板打印代码1.BOOL CFlashPlayerApp::InitInstance()2.{3. AfxEnableControlContainer();4.5.#ifdef _AFXDLL6. Enable3dControls(); // Call this when using MFC in a shared DLL7.#else8. Enable3dControlsStatic(); // Call this when linking to MFC statically9.#endif10.11.//…12.}B O O L CFl ashPl ayer App::I ni t I nst a{Af xEnabl eCont r ol Cont ai ne#i f def_AFXD LL对话框准备好了,缺省情况下,它总会自动带上3个控件:2个按钮,“确定”与“取消”和一个“TOD O: 在这里设置对话控制” 文本标签。
2. 准备文本编辑框文本标签我们并不需要,那么就直接删除之。
但我们需要一个文本编辑框,用以显示Flash文件路径。
引入新的Windows标准控件很简单,只要简单地从控件集窗口选择相应的控件拖拽至对话框即可。
好,我们拖来一个文本编辑框:图6 引入文本编辑框控件1.3 设置控件属性引入来的控件,可以通过鼠标简单的拖拽调整其位置和大小,当然,你还可以通过属性对话框来设计这个控件。
在控件上右击鼠标,弹出菜单:图7 控件的属性窗口这个菜单即将覆盖本教程的大部分内容,菜单最下面的三行分别为:ClassWizard… 为控件创建类及变量Events… 为控件映射事件Properties 设置控件的属性前两项后面的内容将要讨论到,我们现在只关心Properties(属性),点击它即可弹出文本编辑框的属性界面:图8 文本编辑框的属性界面我们按照以下的步骤进行控件的属性设置:1. 在“General(普通)”标签页里将文本编辑框的ID修改成IDC_FLASH_FILE,而不是缺省的IDC_STATIC;2. 在“Styles(样式)”标签页里将文本编辑框的Read-only打勾,这样我们的文本编辑框就显示成灰色,并且只读。
也就是说,它的,内容只能由程序更改,用户不能手动输入;3. 同理,在两个按钮的“General(普通)”标签页里,设置它们的Caption(标题),分别为“浏览…”和“退出”;4. 在“浏览…”按钮的“General(普通)”标签页里,将它的ID设置成ID_BROWSER;需要指出的是,每个控件都具有ID,就相当于每个人都具有一个身份证号。
除了IDC_STAT IC(它的值是-1),每个对话框的控件的ID都必须唯一,不能重复。
一些特定的ID代表特定的含义,如:IDOK对应于“确定”按钮,IDCANCEL对应于“取消”按钮,IDC_STATIC则对应于一个匿名控件。
MFC认识这些特定的ID,并赋值于指定的行为,例如:你可以不需要编写任何代码,就可以使用“确定”按钮关闭对话框,就是这个原因。
以上内容指引你如何修改控件的属性,包括它的ID、标题以及样式。
这种修改都是所见即所得的,运行程序,你就会欣喜地发现,一切确实都改过来了。
1.4 映射控件变量好了,你现在有了一个文本编辑框,可是如何使用它,你还是一无所知。
那么,我们开始学习如何将控件映射成一个变量,这个过程即“映射控件变量”,或曰“绑定控件变量”。
映射控件变量是VC的一个很好的功能,有了它,你就可以象使用一个变量一样控制控件。
映射成什么类型的变量,这依赖于你的控件。
一般来说,一个控件可以映射成一个值变量(Val ue),也可以映射成一个控件对象(Control)。
如:一个文本编辑框既可以映射成一个CSt ring值,也可以映射成一个CEdit对象,CString是个字符串,而CEdit则是MFC为文本编辑框专门准备的控件类。
1.4.1 控件-> 值变量我们从简单的入手,先将我们的文件路径文本编辑框映射成一个普通的值变量,按照以下操作慢慢来:1. 在编辑框上打开右键菜单(如图7所示),选择ClassWizard…,弹出以下界面:图9 ClassWizard窗口有点晕。
先不管别的,因为我们要映射变量,我们就选择“Member Variables”标签页,这儿可以看到当前对话框中的所有控件,包括我们的文本框和其它两个按钮;2. 找到我们的IDC_FLASH_FILE,双击之(或者点击“Add Variable…”按钮),就弹出了映射控件变量窗口:图10 添加控件值变量该界面分别要求输入变量名、类别和变量类型,不用争了,我们选择Value和CString,将I DC_FLASH_FILE映射成CString m_sFilePath。
大功告成!可以同时观察VC程序代码中的变化:查看源代码拷贝至剪贴板打印代码1.class CFlashPlayerDlg : public CDialog2.{3.// …4.// Dialog Data5. //{{AFX_DATA(CFlashPlayerDlg)6. enum { IDD = IDD_FLASHPLAYER_DIALOG };7. CString m_sFilePath;8. //}}AFX_DATA9.}10.11.CFlashPlayerDlg::CFlashPlayerDlg(CWnd* pParent /*=NULL*/)12.: CDialog(CFlashPlayerDlg::IDD, pParent)13.{14. //{{AFX_DATA_INIT(CFlashPlayerDlg)15. m_sFilePath = _T("");16. //}}AFX_DATA_INIT17. // …18.}19.20.void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)21.{22. CDialog::DoDataExchange(pDX);23. //{{AFX_DATA_MAP(CFlashPlayerDlg)24. DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);25. //}}AFX_DATA_MAP26.}cl ass CFl ashPl ayer D l g :publ i c C{//…//D i al og D at a下面我们先试试这个CString m_sFilePath的使用,如:查看源代码拷贝至剪贴板打印代码1.BOOL CFlashPlayerDlg::OnInitDialog()2.{3. CDialog::OnInitDialog();4. m_sFilePath = "空即是色";5. // …6.}B O O L CFl ashPl ayer D l g::O nI ni t D i al o{CD i al og::O nI ni t D i al og();m_sFi l ePat h= "空即是色遗憾的是,以上的代码是没用的!与Visual Basic不同,在VC的世界里,映射的值变量与实际控件的内容并不保持同步,欲使用映射的值变量就必须额外地使用到UpdateData()函数,它的函数原型如下:查看源代码拷贝至剪贴板打印代码1.CWnd::UpdateData2.BOOL UpdateData( BOOL bSaveAndValidate = TRUE );CW nd::U pdat eD at aB O O L U pdat eD at a(B O O L bSaveA简单地说,UpdateData(TRUE)读取对话框中各控件的内容,并及时反映到其映射值中去;U pdateData(FALSE)则恰恰相反,它将当前映射值反映到控件中去,如:在文本框里面显示你刚刚设置的字符串“空即是色”。
我们现在是要通过变量修改控件,因此,我们采用UpdateData(FALSE),以上的代码修改成:查看源代码拷贝至剪贴板打印代码1.BOOL CFlashPlayerDlg::OnInitDialog()2.{3. CDialog::OnInitDialog();4. m_sFilePath = "请点击“浏览”按钮选择文件!";5. UpdateData(FALSE);6. // …7.}B O O L CFl ashPl ayer D l g::O nI ni t D i al o{CD i al og::O nI ni t D i al og();m_sFi l ePat h= "请点击“现在的运行界面就可以看到m_sFilePath的内容了:图11 使用映射变量修改文本编辑框的内容UpdateData ()如何知道哪些控件与哪些变量映射,靠的是DoDataExchange(),读者没必要对DoDataExchange()了解更多,但注意不要随便手动修改DoDataExchange()中的代码。
1.4.2 控件-> 控件对象与值变量不同,如果映射变量是一个控件对象,那么就没有必要调用UpdateData ()来完成同步。