《VC++编程入门.doc》由会员分享,可在线阅读,更多相关《VC++编程入门.doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基于MFC的VC+编程入门1创建程序框架2编译程序3设计程序界面4添加菜单项的消息相应函数5菜单项Ckeck状态()的控制6创建对话框7将对话框与Menu Item(或其他事件)联系起来8通过对话框进行数据的输入和输出9设定对话框Tab Order及初始光标焦点位置10鼠标事件的响应11WINDOWS定时器TIMER的使用12在窗口内显示文本信息13在窗口中画图14使用MFC消息框15在窗口中画曲线基于MFC的VC+编程入门1 创建程序框架:运行Microsoft Visual C+,进入VC+编译器主界面。打开“File”菜单项,点击“New”,出现一个对话框,点击对话框上方“Project
2、s”,在该对话框下面的栏目中点击“MFC AppWizard(exe)”,并在对话框右上方“Project Name”中填上项目名称,如“MyfirstCpp”,然后按“OK”Button,出现“MFC AppWizardStep1”对话框,选“Single Document”然后按“Finish”Button,直至结束这一步。查看VC+编译器界面左面的文件(项目)管理窗口,点击下方的“FileView”,项目管理窗口内出现“MyFirstCpp files”,点击该条目,下面出现“Source Files”、“Header Files”及“Resource Files”等条目,分别为该Pro
3、ject(项目)的源代码、头文件及资源文件。点击“Source Files”或“Header Files”,发现其中应经存在了一些文件,这些是机器自动生成的文件和代码。2 编译程序:点击“Build”菜单项,其中出现一项“Build MyfirstCpp.exe”,点击该项,启动VCC+编译器,待编译结束后,生成一个名为“MyfirstCpp.exe”的可执行文件。运行该程序(可以点击“Build”菜单的“Execute MyfirstCpp.exe”或直接点击工具栏中“!”按钮),出现该程序的窗口,该窗口中已经有了几个菜单项:“文件”、“编辑”、“查看”及“帮助等”,这些都是编译器自动生成的
4、。3 设计程序界面:点击左侧项目管理窗口下方的“ResourceView”, 项目管理窗口内出现“Accelerator”、“Dialog”、“Menu”、“ToolBar”等条目,要在编译器自动生成的窗口中添加(或修改)菜单项,点击“menu”下的“IDR-MAINFRAME”,编译器右侧窗口出现该程序的界面。增加新的菜单项,可以点击最后一个菜单项后面的虚线框,弹出一个编辑新的菜单项的对话框,在“Caption”编辑框内填上菜单的名字。若菜单为弹出(下拉)式的,选中“Pop-up”项,否则不选。非弹出菜单,要填写一个ID名。而弹出式菜单,本身不需要ID名,填好菜单名后,点击该新加的菜单,下面
5、出现下拉框,点击该框内的虚线框可以增加该菜单项的下拉框的条目,在“Caption”栏内填写每个条目的名称(如“Item1”,“Item2”)和ID,ID名的格式为“ID_XXXX_YYYY”,其中“XXXX”为菜单项名,“YYYY”为下拉项目名,如“ID_TEST_ITEM1”, 再次点击虚线框可以继续增加该菜单项的下拉框的条目,并为其填写新的ID,如“ID_TEST_ITEM2”。菜单设计结束后,点击“Build MyfirstCpp.exe”重新编译。编译结束后,再运行程序(点击工具栏中“!”按钮),界面中出现了刚添加的菜单项,但点击该菜单项,下拉项目均为灰色,处于无效状态(i.e., n
6、ot active)。4 添加菜单项的消息相应函数:在VC+主界面的“View”菜单项中点击“Classwizard”,进入“MFC Classwizard”对话框。在“Object IDs”栏中中出现刚添加的菜单项的ID: “ID_TEST_ITEM1”及“ID_TEST_ITEM2”。选中“ID_TEST_ITEM1”,并在对话框右上“Class name”栏目选中“CMyfirstCppView”,然后点击“Messages”栏目中的“COMMAND”,此时对话框右侧的“Add Function”Button变亮,点击“COMMAND”项或“Add Function”按钮,弹出一个对话框
7、“Add Member Function”,添加相应得成员函数名(可以使用默认名,也可以自己添加),如添加函数名“OnTest_Item1”,然后按“OK”Button,此时“MFC Classwizard”最下面的“Member functions”栏目内出现一行新内容“OnTest_Item1 ON_ID_ OnTest_Item1: COMMAND”。最后按“OK”Button结束,退回到VC+主界面窗口。查看“MyfirstCppView.cpp”发现在最后面增加了下面一段程序:void CMyfirstCppView:On_Test_Item1 () / TODO: Add your
8、 command handler code here这段程序即为菜单选项“Test”中的“Item1”项的消息响应函数,该函数的原型也自动出现在相应的头文件“MyfirstCppView.h”中。当然,这个函数目前只是个框架而已,尚不能做任何事情,具体代码将根据程序的需要由编程者自行添加。同时在“MyfirstCppView.cpp”文件的开头部分的消息映射表(MESSAGE_MAP)当中也出现了以下新内容(灰色字):BEGIN_MESSAGE_MAP(CMyfirstCppView, CView)/AFX_MSG_MAP(CMyfirstCppView)ON_COMMAND(ID_TEST_
9、ITEM1, OnTest_Item1)/AFX_MSG_MAP/ Standard printing commands.END_MESSAGE_MAP()同样方法添加菜单项“Item2”的消息响应函数,然后重新编译程序,完成菜单消息响应函数的添加。再次运行程序,点击菜单项“Test”,见其下拉项目“Item1”和“Item2”变为黑色(有效),可以点击,但点击后并无任何反应。5 菜单项Ckeck状态()的控制:下拉菜单的每个条目前面可以用“”标出是否该项已被选中。添加Check标志的具体步骤为:(1) 先在相应的Header File中添加一个字串变量,如在“MyfirstCppView.h
10、”文件中加入下面一行:CStringItemStatus;(2) 用Classwizard工具创建“OnCreate”函数: 在Classwizard对话框内将“Class name”栏选为“CMyfirstCppView”,“Message”栏选“WM_CREATE”, 此时对话框右侧的“Add Function”Button变亮,点击“Add Function”按钮,然后按“OK”Button。在MyfirstCppView.Cpp文件中出现下面函数:int CMyfirstCppView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:
11、OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code herereturn 0;双冒号(:)前面是类名,后面是函数明,表示函数OnCreate()是属于CMyfirstCppView类的成员函数。在该函数里添加下面一行,对变量ItemStatus进行初始化:ItemStatus = OFF;(3)在On_Test_Item1()函数中添加下面代码:if (ItemStatus = ON) ItemStatus = OFF;else ItemStatus = ON;(4) 利用Clas
12、swizard创建“OnUpDateItem1”函数:在Classwizard对话框内将“Class name”选为CMyfirstCppView,“Object IDs”栏选“ID_TEST_ITEM1”,右边“Messages”栏目选“UPDATE_COMMAND_UI”,按“OK”钮,在“CMyfirstCppView.Cpp”文件中出现下面代码段:void CMyfirstCppView:OnUpdateTestItema(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here 在该函数内添加下面一行:p
13、CmdUI-SetCheck(ItemStatus = ON);(5) 重新编译并运行程序,发现菜单项“Test”=“Item1”开始时未被选中,按一次该项变为选中(其前出现),再按一次又变为未选中。6创建对话框:两种方法可以进入对话框资源编辑状态:1)在VC+编译器主界面左侧的项目文件管理对话框内选择下方的“ResourceView”,然后将光标放在“Dialog”上点击鼠标右键,在弹出的对话框内选“Insert”;2)在VC+主界面的菜单中打开“Insert”项,点击“Resource”再点击“Dialog”,进入对话框编辑界面,并出现一个默认的最简单的对话框,只包含“OK”和“Cance
14、l”按钮,同时旁边还有一个控件(controls)工具栏,内有各种常用控件(如下图所示)。其中“Aa” 控件为静态文本框,只用来显示一些说明信息,而“ab|” 控件为编辑框,可以用来输入和输出数据。根据需要可用鼠标将其拖入对话框内,设计所需要的对话框。下面创建一个简单的对话框:1) 给新对话框命名:编译器为刚创建的对话框分配一个默认的名称和ID号,如不想用默认的名字,可自行命名。将光标放在新对话框内,单击鼠标右键,弹出一个菜单,点击最后一项“Properties”弹出一个“Dialog Properties”对话框,在“Caption”栏中填写新创建对话框的名字(如“Dialog 1”),在“
15、ID”栏目中填写新对话框的ID(如,“IDD_MYDIALOG1”)(对话框的ID都以IDD_开头)。2) 将“Aa” 控件拖入对话框内(或鼠标左键单击一下工具栏中的“Aa”,然后在对话框内任意位置单击鼠标左键),则对话框内出现一个新的“Static”控件,将光标放在该控件上,然后单击鼠标右键,弹出一个菜单,点击最后一项“Properties”弹出一个“Text Properties”对话框,在“Caption”栏目内填写欲显示的内容,如“This is my first dialog !”,其ID为“IDC_STATIC”可以不用修改。3) 创建对话框类:对话框不同于菜单项,每个对话框为一个
16、新的类,因此要想使用(在某一时刻显示)该对话框,必须首先为新创建的对话框窗创建相应的类。鼠标左键双4) 击新创建的对话框,弹出一个“Adding a class”对话框,按“OK”钮,弹出另一对话框,“Dialog ID”栏显示的是刚创建的对话框的ID(若不是,利用下拉条找到刚创建的对话框的ID),中间一栏“Base Class”中显示的是“CDialog”表示将从MFC的对话框类“CDialog”派生一个新的对话框类,在最上面的“Name”栏中添加该新类的名称,如“MyDia1”,同时下面的“File name”一栏自动出现对应该类的原代码文件名:“MyDia1.cpp”,按“OK”钮,进入
17、MFC Classwizard界面,右上角“Class name”栏目中出现“MyDia1”,按“OK”钮退回到VC+编辑器主界面,查看左侧的文件管理器窗口Header File 和Source File中分别出现了“MyDia1.h”和“MyDia1.cpp” 文件,在MyDia1.h文件中有一行class MyDia1 : public CDialog表明增加了一个新的名为“MyDia1”的类,冒号(:)表示该类是从MFC基类“CDialog”中派生出来的。此时文件MyDia1.cpp几乎是空的,表示该对话框空几乎不做任何事情。至此一个新的对话框及对应的类创建结束。但是重新编译并运行程序发
18、现该对话框并不出现,因为还没有将该对话框与程序(确切地说是某个事件)联系起来。7 将对话框与Menu Item(或其他事件)联系起来:为了在运行程序后点击菜单项“Test”中的“Item1”后弹出刚创建的对话框“Dialog 1”,需完成以下步骤:1) 在MyfirstCppView.cpp前面的包含文件中加一行:#include “MyDial.h”2) 在菜单项“Test”中的“Item1”的消息相应函数On_Test_Item1 ()中添加:MyDia1dlg;dlg.DoModal();重新编译并运行程序,点击“Test”中的“Item1”,弹出刚创建的对话框,但该对话框没有什么实际的
19、功能。8 通过对话框进行数据的输入和输出设计一个对话框可以输入两个数据,程序对这两个数据进行某种运算,然后用另一个对话框将结果显示出来。1) 按前面方法设计一个新的对话框,如下图所示,名为“Dialog 2”, ID为“IDD_MYDIA2”。鼠标右击第一个“Edit”控件,点击“properties”,在弹出的对话框中的ID栏中将该控件的ID改为“IDC_NUM1”,同样方法将第二个“Edit”控件的ID改为“IDC_NUM2”。2) 添加成员变量:进入MFC Classwizard,Class name栏选“MyDia2”,对话框最上一行选“Member variables”,Contro
20、l IDs栏目选“IDC_NUM1”,按右侧的“Add variables”按钮,弹出一个对话框:在“Member variable name”栏目内填上对应控件“IDC_NUM1”的成员变量的名字(成员变量名必须以m_开头),如“m_dia2_num1”,在“Category”栏目中选择该变量的类型,此处选为“int”型,选择“OK”Button关闭该对话框退回到“MFC Classwizard”对话框,在IDC_NUM1的后面出现了“intm_dia2_num1”字样,还可以在对话框底部的“Minimum Value”和“Maximum Value”栏目内填上该变量的取值范围的限制。同样方
21、法填上对应控件“IDC_NUM2”的成员变量,“m_dia2_num2”。点击“OK”按钮关闭MFC Classwizard对话框,回到VC+主窗口。在左侧文件管理窗口点击Header File中的“MyDia2.h”发现其中出现如下内容:/ Dialog Data/AFX_DATA(MyDia2)enum IDD = IDD_MYDIA2 ;intm_dia2_num1;intm_dia2_num2;/AFX_DATA表示在该类中添加了两个成员变量。成员变量的初始化在相应的源代码文件“MyDia2.cpp”中该类的构造函数MyDia2()中完成,可以修改该处的代码该改变m_dia2_num1
22、或m_dia2_num2的初始值。MyDia2:MyDia2(CWnd* pParent /*=NULL*/): CDialog(MyDia2:IDD, pParent)/AFX_DATA_INIT(Dial2)m_dia2_num1 = 0;m_dia2_num2 = 0;/AFX_DATA_INIT3)再设计一个输出计算结果的对话框:对话框的ID为“IDD_MYDIA3”,Edit控件的ID为“IDC_RESULT”,进入Classwizard创建该对话框的类“MyDia3”,并为Edit控件添加一个Double型的成员变量“m_dia3_result”。4)将该对话框与菜单项“Test”
23、的下拉项“Item2”联系起来:在MyfirstCppView.cpp前面的包含文件中加几行:#include “MyDia2.h”#include “MyDia3.h”#include “math.h”在菜单项“Test”中的“Item2”的消息相应函数On_Test_Item2 ()中添加:MyDia2dlg;MyDia3dlg3;intx;inty;double z;if (dlg.DoModal() = IDOK) x = dlg.m_dia2_num1;y = dlg.m_dia2_num2;z = sqrt(pow(x,2)+pow(y,2);dlg3.m_dia3_result
24、= z;dlg3.DoModal();编译并运行程序,打开“Test”菜单项,点击“Item2”,在弹出的对话框输入数据栏内填上输入数据,按“OK”钮,出现另一对话框,显示计算结果。9 设定对话框Tab Order及初始光标焦点位置:上面的数据输入对话框输入数据时必须先将光标焦点调到欲输入数据的栏目,然后再调到下一个输入栏目输入下一个数据。可以在设计对话框时设定各控件的Tab Order,这样可以通过键盘的“Tab”键在对话框的栏目间转换。在VC+主界面的文件管理器栏内点击欲编辑的对话框(如IDD_MYDIA2),进入对话框编辑状态,点击VC+编辑器主菜单中的“Layout”,在弹出的下拉菜单
25、中点击“Tab Order”项,刚才打开的处在被编辑状态的对话框中出现控件的编号,如下图所示欲重新进行排序,只需按希望的顺序依次点击控件即可。重排序后如下图所示。重新编译并运行程序,点击菜单Test的Item2后,弹出的对话框如下图所示。此时光标焦点位于第一个编辑框,可直接输入数据,按“Tab”键即可直接到第二个编辑框输入第二个数据。利用Layout菜单中其他工具还可以帮助调整对话框内控件的大小及位置对齐等。Note: 一个程序如已经在运行状态,再次运行该程序则可以有同一程序的两个(甚至多个)版本同时在内存中运行(因为WINDOWS是一个多任务操作系统)。但是若一个程序已经在运行,则不能对其进
26、行编译,因此重新编译之前必须关闭正在运行中的该程序。10 鼠标事件的响应:1) 双击鼠标左键,弹出一个消息框:进入Classwizard界面,最上一行选“Message Maps”,“Object IDs”栏选“CMyfirstCppView”,“Class name”一栏也选“CMyfirstCppView”,“Messages”栏目选“WM_LBUTTONDBCLICK”,然后按“Add Function”钮,按“Edit Code”钮直接进入鼠标左键双击的消息响应函数OnLButtonDblClk()。在该函数内加入下面一行AfxMessageBox(You Double-Clicked
27、 the Left Mouse Buttont!);编译并运行程序,在程序的窗口内双击鼠标左键,弹出下面消息框:2) 单击鼠标右键,弹出一个对话框显示鼠标点击处的座标值:先设计一个新对话框,名为“Dialog 4”, ID为“IDD_DIA4”,如下图所示:为其两个Edit控件分别添加成员变量:m_dia4_memb1和m_dia4_memb2。再添加鼠标右键单击事件的消息响应函数到MyfirstCppView.cpp,并填写下面代码(先在程序前面添加”#include “MyDia4.h”):void CMyfirstCppView:OnRButtonDown(UINT nFlags, CP
28、oint point) / TODO: Add your message handler code here and/or call defaultMyDiag4 dlg;dlg.m_mouse_x = point.x;dlg.m_mouse_y = point.y;dlg.DoModal();CView:OnRButtonDown(nFlags, point);编译并运行程序,在窗口内单击鼠标右键,弹出下面对话框:在窗口内不同位置,单击鼠标右键,对话框内显示的数据不同。11 WINDOWS定时器TIMER的使用WINDOWS提供了定时器功能,可以用来控制程序按照规定的时间执行制定的功能。定时
29、器通过添加WINDOWS消息TIMER来实现。进入MFC ClassWizard,在Class name滚动条内选择相应的类(即欲把TIMER的消息响应函数加到哪个类中,通常加到View类中),然后在Message滚动窗口内双击WM_TIMER,在Member functions窗口中出现消息响应函数“OnTimer ON_WM_TIMER”。关闭MFC ClassWizard,在该类的实现函数中出现下面语句:void CMyfirstCppView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or
30、 call defaultCView:OnTimer(nIDEvent);在该函数内根据程序需要添加相应的代码。为了启动定时器,需要在程序的适当位置设置定时器,即添加下面语句:SetTimer(1,1000,NULL);其中第一个参数为定时器编号(可以同时打开多个定时器),第二个参数为设定时间(单位为mS)。若希望程序一运行立即启动定时器,可以在MFC ClassWizard相应类中添加WINDOWS消息WM_CREATE,并为其添加响应函数ON_WM_CREATE,然后将上述定时器设置语句添加到该函数内。也可以将定时器的设置语句放到某个控件的消息响应函数内,这样通过该控件来启动定时器。为了避
31、免在定时器处理过程中(如果处理时间大于定时器设定时间)定时器再次到时从而造成混乱,通常进入定时器响应函数内先关闭该定时器,处理结束后重新打开:KillTimer(1);/先关闭定时器/此处添加定时器处理程序SetTimer(1,1000,NULL);/重新启动定时器12 在窗口内显示文本信息在WINDOWS中不能像在DOS下那样直接在屏幕上显示文本信息,可以在View类的(创建Project时自动生成的)OnDraw()函数中实现文本信息的显示。例如,在OnDraw()函数中添加下面程序可以charTxData200;intx = 100, y = 50;wsprintf(TxData,%s,
32、 This is a test sentence.);pDC-TextOut(x,y, TxData);上述程序只能在程序运行后显示一次信息,若想在程序运行过程当中在窗口中显示信息,不能直接调用OnDraw()函数,而是在程序中希望输出信息的地方使用InvalidateRect( )函数,如下面所示: InvalidateRect(CRect(1, 5, 799, 580),TRUE);该函数的功能是窗口中的一个矩形区域无效,参数Crect( )指定一个矩形区域。执行该语句后立即进入OnDraw()函数,并刷新InvalidateRect( )所指定的矩形区域(即重新显示该区域的内容)。每条用
33、一次InvalidateRect( )函数,窗口对应的部分刷新1次。例:设定2个定时器并在窗口中分别显示2个定时器的指示数。(1) 在ON_WM_CREATE函数中添加SetTimer(1,1000,NULL);SetTimer(2,100,NULL);(2) 在CMyfirstCppView的头文件CMyfirstCppView.h中添加2个成员变量intcounter1, counter2;(3) 在构造函数CMyfirstCppView ()中对其进行初始化counter1 = 0;counter2 = 0;(4) 在定时器响应函数OnTimer( )中添加if (nIDEvent =
34、1) KillTimer(1);counter1+;InvalidateRect(CRect(1, 5, 799, 200),TRUE);SetTimer(1,2000,NULL); else KillTimer(2);counter2+;InvalidateRect(CRect(1, 200, 799, 580),TRUE);SetTimer(2,1000,NULL);(5) 在OnDraw( )函数中添加charTxData200;intx = 10, y = 10;wsprintf(TxData,%s,Counter1: );pDC-TextOut(x,y, TxData);wsprin
35、tf(TxData,%d,counter1);pDC-TextOut(x+120,y, TxData);y = y+300;wsprintf(TxData,%s,Counter2: );pDC-TextOut(x,y, TxData);wsprintf(TxData,%d,counter2);pDC-TextOut(x+120,y, TxData);运行上述程序在窗口内的两部分分别显示2个定时器的值。13 在窗口中画图在窗口中画图也可以利用OnDraw( )函数,或者利用OnPaint( )。利用OnDraw( )函数在窗口中画图与上面介绍的显示文本信息的原理类似。MFC中的CDC类提供了丰富
36、的绘图工具和函数。如果画空心的图(只有轮廓)需要用CPen对象选定一个画笔,若要对封闭图形的内部进行填充,则还要用CBrush对象定义一个画刷。在OnDraw( )函数添加下面程序:/建立一个画笔对象,可以画红色的宽度为 1 个像素的实线 CPen aPen(PS_SOLID,1,RGB(255,0,0); / 将画笔对象选进设备上下文 CPen *pOldPen = pDC-SelectObject(&aPen); / 用选定画笔画四条直线,构成一个矩形 pDC-MoveTo(10,10); /将画笔移动到指定位置pDC-LineTo(50,10); /从当前位置到指定位置用制定画笔画线pD
37、C-LineTo(50,50); pDC-LineTo(10,50); pDC-LineTo(10,10); / 恢复原来的画笔对象 pDC-SelectObject(pOldPen); / 建立一个绿色的画刷对象 CBrush brBackGround(RGB(0,255,0); / 将该对象选进设备上下文 CBrush *pOldBrush = pDC-SelectObject(&brBackGround); / 在规定范围内画一个填充椭圆 CRect rcEllipse(100,100,300,200); pDC-Ellipse(rcEllipse); / 恢复原来的画刷对象 pDC-S
38、electObject(pOldBrush);/用缺省画刷画一个运动的椭圆pDC-Ellipse(50+x,50+x,100+x,100+x); 在类的头文件CMyfirstCppView中定义一个成员变量:intx;在构造函数CMyfirstCppView ()中对其进行初始化x = 0;在OnTimer( )函数中添加:KillTimer(1);if (xEllipse(x-50,y-50,x+50,y+50);运行程序,窗口中画出的圆随鼠标而动。若希望先用鼠标选中窗口中的圆,然后按住才能拖着走,则可按下面方式修改:(1) CMyfirstCppView.h中定义一个BOOL型成员变量:b
39、ool MsDwn;(2) 在构造函数CMyfirstCppView ()中对其进行初始化:MsDwn = false;(3) 添加鼠标左键按下消息: 用MFC ClassWizard添加鼠标左键按下消息WM_LBUTTONDWON的响应函数“OnLButtonDown ON_WM_LBUTTONDWON”,并在OnLButtonDown( )函数中添加代码:float fx,fy;fx = (float)point.x;fy = (float)point.y;if (sqrt(fx-x)*(fx-x)+(fy-y)*(fy-y) MoveTo(1,300);for (i=0;iLineTo(i,(int)y);(2) 动态曲线在头文件CMyfirstCppView中定义下面成员变量:bool drawsine, rg;intxx, xx0;float yy, yy0;在CMyfirstCppView的构造函数中进行初始化xx = 0;yy0 = 300;yy = 300;drawsine = false;rg = true;在OnTimer( )中添加代码:KillTimer(1)
限制150内