vc之控件篇
vc++6.0中radio控件的使用

先为对话框加上2个radio button,分别是Radio1和Radio2。
问题1:如何让Radio1或者Radio2默认选上?如何知道哪个被选上了?关键是选上,“默认”只要放在OnInitDialog()即可。
三种方法可以让它选上,第一种:((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上第二种:关联一个congtrol型变量(子类化),好ctrl+W(即打开classwizard),点开Member Variables,咦?怎么没有IDC_RADIO1这个ID?原来是没有分组。
因为radio button通常都是成组使用的,在一组里面是互斥的。
取消,回到对话框资源面板,右键Radio1查看属性把Group选上,那么,Radio1和Radio2就是一组了(怎么知道他们是一组的?后面说)。
此时,就可以为Radio1增加一congtrol型变量m_ctrlRadio1了。
如下:m_ctrlRadio1.SetCheck(TRUE);同样可以使用GetCheck()获取状态。
第三种:关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:m_nRadio1 = -1;m_nRadio1别赋值-1表示哪个都没有选上。
如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1就是第二个被选上了(这里同样有问题,哪个是第一个?哪个是第二个?)。
获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值即可。
在VC+工具栏中添加Slider控件实现视图实时缩放

第28卷第4期华北水利水电学院学报Vo1.28NO.4 2007年8月Journal of Noah China Institute of Water Conservancy and Hydroelectric Power Aug.2007文章编号:1002-5634(2007)04-0069-03在vc++工具栏中添加slider控件实现试图实时缩放宋素荣(郑州市科技中专,河南郑州450011)摘要:用slider控件的滑动来实时控制视图平滑地缩放,利用控件的范围控制缩放的大小,程序通过vc++平台,用S l i d e r控件能方便地实现控制视图缩放,也比单纯放大缩小视图要直观连续,更适合用户的需要.同时,利用同样的思想,也可以很方便地实现其他界面上的改进。
关键词:工具栏;S l i d e r控件;视图缩放中图分类号:TP311.13文献标识码:AVisual C++所提供的标准工具条中只有一些简单的诸如文档打开、存储以及一些编辑功能按钮.而Visual C++自身的工具条功能十分丰富,如果想在视图区绘图,必然涉及到视图的缩放问题.滑动控件是Windows中最常用的控件之一.一般由一个滑动条、一个滑块和可选的刻度组成.用户可以通过移动滑块在相应的控件中显示对应的值.通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值.滑动控件在应用程序中用途极为广泛,如在桌面的属性中就可以看到.如果在工具栏中加入Slider控件来控制视图的缩放,是十分直观和方便的.在此讨论如何利用VC++6.0在工具栏中增加Slider控件以及如何控制视图的缩放.1Slider控件的使用Slider的常用属性设置函数:1.GetRange,SetRange函数.查询和设置滑动条的取值范围,默认为0—100.函数定义形式如下:void GetRange(int&nMin,int&nMax)eonst;void SetRange(int nMin,int nMax,BOOLbRe—drGETaw=FALSE);2.GetPos,SetPos函数.查询和设置滑动条的当前值.函数定义形式如下:int GetPos()eonst;int SetPos(int nPos);3.GetPageSize,SetPageSize函数.查询和设置函滑块和块移动量,块移动量是指当按下PgUp或Pg -Down时滑块的移动量。
VC单选按钮使用

VC单选按钮使用一、VC单选按钮的基本用法为了实现单选的效果,我们需要将所有的单选按钮分组。
可以使用“组框”控件来为一组单选按钮提供一个可视的边界。
然后,将每个单选按钮的属性“所属组”设置为该组框控件。
这样,用户只能在同一个组中选择一个选项。
二、VC单选按钮的属性设置除了所属组外,VC单选按钮还有其他一些重要的属性需要设置。
1.文本属性:用于显示单选按钮的文本。
可以通过在控件资源设计器中输入文本来设置。
2.默认状态:可以设置单选按钮在初始状态下被选中还是未选中。
可以通过在资源设计器中选择单选按钮并设置其属性“默认”来设置。
3.可见性:可以设置单选按钮是否可见。
可以通过设置属性“可见性”来实现。
4.启用状态:可以设置单选按钮是否可用。
可以通过设置属性“启用状态”来实现。
5.位置和大小:可以设置单选按钮在对话框中的位置和大小,以适应界面布局。
可以通过调整属性“位置”和“大小”来实现。
三、VC单选按钮的事件处理当用户选择一个单选按钮时,我们通常需要处理相应的事件。
处理事件的方式有很多,下面是一种常见的方式:通过给每个单选按钮关联一个事件处理程序。
首先,在资源设计器中选择单选按钮,并右键单击选择“属性”。
在属性面板中选择“事件”,然后选择对应的事件(如“单击”)。
然后,输入或选择一个事件处理程序的函数名。
在创建的事件处理程序函数中,我们可以执行任何我们希望在用户选择该单选按钮时执行的操作。
例如,我们可以更新其他控件的状态,执行计算或显示相关信息。
四、VC单选按钮的最佳实践在设计和使用VC单选按钮时2.分组和布局:将需要选择的选项分组,并使用边框或其他可视元素将它们分隔开。
合理布局和对齐这些组框和单选按钮,以方便用户选择。
3.默认选项:根据用户的使用习惯和需求,设置一个默认的选项。
这有助于用户快速完成任务,减少不必要的操作。
4.禁用选项:根据情况,禁用一些选项,以防止用户选择不合适的选项。
5.状态更新:当用户选择一个单选按钮时,考虑更新其他相关控件的状态,以提供一致和准确的反馈给用户。
用VC实现三维图形ActiveX控件

第15卷第4期南华大学学报(理工版)Vol.15No.4 2001年12月Journal of Nanhua Nuiveri sity(Science&Engineering Edi tion)Dec.2001文章编号:1006-737X(2001)04-0063-04用VC实现三维图形ActiveX控件陆玲1,熊正为2,王志畅1(1.华东地质学院信息工程系,江西临川344000;2.南华大学建筑工程与资源环境学院,湖南衡阳421001)摘要:以正方体线框图为例,论述了用VisualC++ 6.0如何实现三维图形的Ac-tiveX控件的制作,为今后用VC开发专用图形软件提供了有利帮助.关键词:Visual C++6.0;三维图形;ActiveX控件中图分类号:TP391.72文献标识码:B0前言Visual C++现已成为较流行的编程工具,它不仅全面地贯彻了面向对象技术,而且在编译优化技术方面较其它同类产品具有明显优势.在编写专用应用软件时,特别是图形应用软件,用户除了使用MFC类中的绘图类外,还要在图形类的基础上派生出适用的类或编写图形ActiveX控件.1问题的提出在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图工作.CDC类定义了设备环境对象的类,该类提供的成员函数可以完成的操作包括:设备环境操作、使用绘图工具、使用颜色和调色板等.C DC类的成员函数可以获得和设置绘图属性、坐标变换、区域操作、画线、画简单二维图形等工作,但没有三维图形的绘制.本文就是针对三维图形设计一个简单的实用的ActiveX 控件.2三维图形的绘制2.1投影变换把三维物体变为二维图形表示的过程称为投影变换.我们通过屏幕显示出的三维图形都是三维物体经过投影变换后的二维图形.投影变换有几种方式,本文采用的是斜平行投影.如图1所示:设定投影方向的矢量为(X p,Y p,Z p),物体上的一点为(x,y,z),投影面为XOY面,则投影线的参数方程为:X s=x+X p#tY s=y+Y p#tZ s=z+Z p#t因为(X s,Y s,Z s)在z=0的平面上,故Z s= 0;则有t=-z/Z p,把t代入上述参数方程可得:图1投影变换示意图Fig.1Sketch m ap of projection exchangeX收稿日期:2001-10-29作者简介:陆玲(1962-),女,湖南衡阳人,副教授.研究方向:计算机图形图象处理,数据库.X s =x -X p /Z p #z Y s =y -Y p /Z p #z改变投影方向,可改变物体z 方向的投影长度及方向.2.2 三维图形的表示三维物体在计算机中常用线框、表面和实体三种模型表示.我们采用简单的实体模型.如对于如图2的单位正方体,可按图3表示:图2 单位正方体示意图图3 实体模型示意图Fig.2 Sketch m ap of unit cubeFig.3 Sketch map o f object model2.3 消除隐藏面消除隐藏面是指将不可见的面不画,本文仅论述凸多面体的消除隐藏面的方法.凸多面体的特点是某一面要么可见,要么就不可见,不可能出现一个面一部份可见,一部分不可见的情况.凸多面体是由若干个平面围成的物体.假设这些平面方程为:a i x +b i y +c i z +d i =0(i =1,2,,n)调整系数的符号,使每个平面的法向量指向多面体内部(如图3中的线表,面的边框顺序按右手法则,其法向量指向体内),如果投影方向为(X p ,Y p ,Z p ),那么(a i ,b i ,c i )#(X p ,Y p ,Z p )<0时,此平面为不可见面,在作图时,此面不绘制.2.4 计算平面法向量已知平面上三个点的坐标为(x 1,y 1,z 1)、(x 2,y 2,z 2)、(x 3,y 3,z 3),其顺序符合右手法则,其大拇指所指方向为该平面的法向量(x ,y ,z ),则:x =(y 2-y 1)(z 3-z 1)-(y 3-y 1)(z 2-z 1)y =(z 2-z 1)(x 3-x 1)-(z 3-z 1)(x 2-x 1)z =(x 2-x 1)(y 3-y 1)-(x 3-x 1)(y 2-y 1)3 创建三维图形ActiveX 控件3.1 建立ActiveX 控件框架ApppWizard 提供了建立Ac tiveX 控件框架的方法.单击File 菜单下的New,选择Project,选中MFC ActiveX Control Wizard,输入控件名(如为zft),按OK 后,后两部使用缺省选项,最后按Fin -ish 完成控件的设置.3.2添加属性图4 添加属性对话框Fig.4 Adding property dialogue本文为了使程序简化,只设计投影方向的三个分量X,Y,Z 属性.使用Class Wizard 添加定制属性.选取Vie w,Class Wizard 之后,单击Automation.在zftCtl 类中,单击Add Property,按如图4填写对话框,完成X 属性的添加.同理,填加Y 和Z 属性.在zftCtl 中的DoProp Exchange(),对属性进行初始化,添加如下行:PX_String(pPX,0X 0,m_x,0100);PX_String(pPX,0Y 0,m_y,0100);PX_String(pPX,0Z 0,m_z,0100);64南华大学学报(理工版) 2001年12月3.3 设置属性页在Project W orkspace 窗口中单击Resource -Vie w ,将Dialog 中的IDD_PROPPAGE _DIEROLL 对话框改为如图5形式:图5 设置属性对话框Fig.5 Setting property dialogue将三个编辑框的I D 分别改为IDC_X,IDC _Y,IDC_Z,并将它们与相应成员变量和属性相连:引出Class Wizard,选择Me mber Variables,在CzftProp -Pa ge 类中,选中I DC _X,单击Add Variable,按如图6方式填写内容.同理完成对I DC_Y 和IDC _Z 的相连.3.3 编写绘图代码图形绘制的代码属于控件类的ZftCtl 的On -Dra w()的方法.每当Windows 要重画包括控件的屏幕部分时,就会自动调用此函数.在此函数后部分添加如下代码(注:删除其中绘制椭圆的代码).图6 添加成员变量对话框Fig.6 Adding member variables dialogueshort point[][3]={{0,0,0},{1,0,0},{1,1,0},{0,1,0},{0,0,1},{0,1,1},{1,1,1},{1,0,1}}; //顶点表short line[]={0,1,2,3,0,4,5,6,7,4,1,7,6,2,1,0,3,5,4,0,0,4,7,1,0,2,6,5,3,2}; //线表short face[][2]={{0,4},{5,9},{10,14},{15,19},{20,24},{25,29}}; //面表short d[3],i,j,k,x,y,z,x1,y1,z1,x2,y2,z2,m,dd,max,min,num;float xmin,xmax,ymin,ymax,xx,yy,xbl,ybl,bl;dd=8; //顶点数m=6; //面数d[0]=atoi(m _x);d[1]=atoi(m_y);d[2]=atoi (m_z); //获取属性页中投影方向xmin=ymin=32767;xmax=yma x -32767;for(i=0;i<dd;i++){xx=point[i][0]-(float)d[0]/d[2]*point [i][2];yy=point[i][1]-(float)d[1]/d[2]*point [i][2];if (xx>xma x)xmax=xx;if (xx<xmin)xmin=xx;if (yy>yma x)ymax=yy;if (yy<ymin)ymin=yy;} //计算物体顶点坐标的最大最小值xbl=(rcBounds.right-rcBounds.left)/(xmax-xmin);ybl=(rcBounds.bottom -rcBounds.top)/(ymax -ymin);if(xbl<ybl)bl=xbl;else bl=ybl;for(i=0;i<dd;i ++){point[i][0]=(point[i][0])*bl;point[i][1]=(point[i][1])*bl;point[i][2]=(point[i][2])*bl;} //根据用户改变控件的大小,反算物体顶点坐标实际值for(i=0;i<m;i ++){x1=point[line [face [i][0]+1]][0]-point [line[face[i][0]]][0];x2=point[line [face [i][0]+2]][0]-point [line[face[i][0]]][0];y1=point[line [face [i][0]+1]][1]-point[line[face[i][0]]][1];y2=point[line [face [i][0]+2]][1]-point [line[face[i][0]]][1];z1=point [line [face [i][0]+1]][2]-point [line[face[i][0]]][2];z2=point [line [face [i][0]+2]][2]-point [line[face[i][0]]][2];65第15卷第4期 陆 玲等:用VC 实现三维图形ActiveX 控件x=y1*z2-y2*z1;y=z1*x2-z2*x1;z=x1*y2-x2*y1;if((x*d[0]+y*d[1]+z*d[2])>0){x1=point[line[face[i][0]]][0]-(float)d[0]/ d[2]*point[line[face[i][0]]][2];y1=point[line[face[i][0]]][1]-(float)d[1]/ d[2]*point[line[face[i][0]]][2];pdc->MoveTo(x1-xmin*bl,y1-ymin* bl);for(j=1;j<=face[i][1]-face[i][0];j+ +){x2=point[b[i][j]][0]-(float)d[0]/d[2]* point[b[i][j]][2];y2=point[b[i][j]][1]-(float)d[1]/d[2]* point[b[i][j]][2];pdc->Line To(x2-xmin*bl,y2-ymin*bl);}}}}4结束语本文仅以简单正方体线框图为例,论述了制作三维物体ActiveX控件的方法,以此可扩充到任意凸多面体三维物体控件的制作,只要将面表、线表与项点表中的数据换成所需绘制的物体数据就可.如果要绘制实心物体图,只需在绘制物体投影表面(多边形)的同时,添加一条填充多边形语句(C DC类成员函数)即可,但要添加填充类型属性.参考文献:[1]孙家广,杨长贵.计算机图形学[M].北京:清华大学出版社,1995.[2]唐泽圣等.计算机图形学基础[M].北京:清华大学出版社,1995.[3]熊璋,陆民燕,等.掌握M icrosoft Visual C++编程[M].电子工业出版社,1995.[4]三味创作室.Visual C++6.0应用与提高[M].科学出版社,1999.[5](美)Chuck Sphar.Visual C++6学习指南[M].机械工业出出版社,1999.[6]朱友芹,等.新编Windows API参考大全[M].电子工业出版社,2000.Expansion ActiveX Control ofThree Dimensions Graph with Visual C++LU Ling1,XIONG Zheng-Wei2,WANG Zhi-Chang1(r mation Engineering Department of East C hina Geological Institute,Linchuan,JX,344000;2.School of Architectural Engineering,Resources and Environment,Nanhua University,Hengyang421001,Hunan,China)Abstract:Taking a cube an example,the author in this paper tries to make ActiveX control of three-dimensions graph with Visual C++6.It is of help for the exploitation of special graph software using Visual VC++6.Key words:Visual C++6;three-dimensions graph;ActiveX control66南华大学学报(理工版)2001年12月。
VC6.0中画图用的chart控件

//设置背景颜色 m_Chart.GetBackdrop().GetFill().SetStyle(1); m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);
//设置数据系列的颜色:如果是曲线图则对应每条曲线的颜色 for (int i = 1; i <= m_Chart.GetColumnCount(); i++ ) {//这里设置为随机颜色 m_Chart.GetPlot().GetSeriesCollection().GetItem(i).GetPen().GetVtColor().Set(rand() * 230 / RAND_MAX, rand() * 230 / RAND_MAX, rand() * 230 / RAND_MAX); m_Chart.GetPlot().GetSeriesCollection().GetItem(i).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); } //设置 x 轴的其他属性 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注 X 轴刻度 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个标注 m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); // 每刻度一个刻度线
VS2010_MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)-软件开发-鸡啄米

gfffffffffffffffff... 持续关注~。请问鸡啄米交流群在哪呢? 31楼说得很合我意有木有。博主写得很... OnSetActive 函数本身有下... 照这个说法,什么都有缺点,那么什么都可以替 代 感谢鸡啄米 呵呵 MFC学得很受用 double r(3.0); VS... 投资二十元,净赚一千万,免费下载百万... 开始学MFC,本节内容蛮多的,有些难... 赞一个,不错,就这这博客看完一章后又...
void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;
获取滚动条的滚动范围。参数lpMinPos指向滚动条滚动范围的最小值,参数lpMaxPos指向滚动 条滚动范围的最大值。
void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);
SB_BOTTOM/SB_RIGHT:滚动到底端(右端) SB_TOP/SB_LEFT:滚动到顶端(左端) SB_LINEDOWN/SB_LINERIGHT:向下(向右)滚动一行(列) SB_LINEUP/SB_LINELEFT:向上(向左)滚动一行(列) SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滚动一页 SB_PAGEUP/SB_PAGELEFT:向上(向左)滚动一页 SB_THUMBPOSITION:滚动到指定位置 SB_THUMBTRACK:滚动框被拖动。可利用该消息来跟踪对滚动框的拖动 SB_ENDSCROLL:滚动结束
// 滚动框的位置,当fMask 中包含SIF_POS 有效
8.
int nTrackPos;
// 滚动时滚动框的位置,当fMask 中包含SIF_TRACKP
【初学VC讲稿】第5篇:对话框应用简单示例

进行更新使之包含新的对话框资源,并且该项目的resource.h文件也会被更新,以便能包含
新的#define常量。
(2)利用ClassWizard创建Cdialog的派生类,并将它同第一步创建的资源相连接。ClassWizard会自动在Developer Studio的项目中加入相应的代码和头文件。
今天我们来学习对话框的编程
【知识要点】(参考《Visual C++技术内幕》)
1,模式对话框(Modal dialog box):打开后直至关闭期间不可在应用程序的其它位置工作。非模式对话框(Modalless dialog box):打开后直至关闭期间可在应用程序的其它位置工作。
2,对话框编程的一般步骤
while(1)
{s
if(dlg.DoModal()==IDCANCEL)//选择[退出]将退出应用程序
{
return false;
}
if(dlg.m_strPassword=="123456")//密码正确,跳出循环
{
break;
}
else//密码不正确,提示重新输入
{
AfxMessageBox("密码不正确,请重新输入");
Member variable name:m_strPassword
Category:value
Variable type:Cstring
4,在MyDefMsg.cpp文件中修改BOOL CMyDefMsgApp::InitInstance()
BOOL CMyDefMsgApp::InitInstance()
VC-MFC对话框控件随窗口自动调整大小

作者:**************一般情况下,我们新建的对话框,里面的“确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。
而MFC默认不支持控件大小按比例缩放功能最简单的情况:当我们点击最大化按钮的时候,对话框会最大化,但是控件“确定”和“取消”不会跟着变大。
如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。
我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windows message handle中有个WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。
那么我们可以根据这个消息,在窗口大小发生变化的时候,利用MoveWindow()函数来重新设置各个控件的大小。
在网上查了一些资料,都不方便使用,还需要自己写好多代码。
在这里我封装了一个简单的类,可以实现这个功能:用法是,1、在对话框类头文件中添加此类的对象CItemResize m_itemSize;2、在窗口初始化函数OnInitDialog中填写需要改变大小的对应控件的ID号:m_itemSize.AddItemRect(IDOK, this);m_itemSize.AddItemRect(IDC_LIST1, this);此处的ID替换成对话框上实际的ID。
3、在OnSize函数中调用:m_itemSize.ResizeItem();功能实现完毕类代码代码如下:头文件:ItemResize.h#ifndef ITEMRESIZE_H#define ITMERESIZE_H/************************************************************************/ /* 作者:***************/ /************************************************************************/#include<stdio.h>#include<vector>using namespace std;typedef struct_RESIZEINFO{UINT nID;CWnd* pParent;float fLeft;float fRight;float fTop;float fBottom;}RESIZEINFO;class CItemResize{CRect m_rectDlg;//在窗口创建时,添加需要自动按比例调整大小的控件ID。
- 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 ()来完成同步。