




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC编程基础基础一、 概述MFC是一个庞大的类库,它是C+类结构的扩展。使用MFC将显著简化Windows程序的开发。MFC封装了大多数Window API函数,使程序员再开发Windows程序时能充分发挥C+语言的优越性。下面是该类库结构的一部分。CObjectCCmdTargetCWinAppCViewCDocumentCWndCFrameWndCDialogCStaticCButtonCListBox CComboBoxCScrollBarCEditMFC类库中处理程序基本构成和窗口的部分 大多数MFC的类是由一个名为CObject的基类派生而来的。大多数MFC类可以使用这个类所包括的数据成员和成员函数。CWinApp类是在程序创建的时候使用的,而且在每个程序中只能使用一次。CWnd类收集了通常在Windows中用到的所有属性、对话框和控件。CFrameWnd类是从CWnd类继承而来的,它可构造一般应用程序的窗口。CDialog类可以分别实现两种不同特点的对话框:模式对话框和无模式对话框。最后,我们可以从图上看出Windows支持六种本地控件类型:静态文本、可编辑文本、按钮、滚动条、列表框和组合框(列表框的扩展)。MFC类库中还有一些用于管理、文档控制和数据库支持等功能的类。用MFC创建一个应用程序,可以使用MFC类库中的类,但更多的时候,是要从已存在的类派生出新类。在派生出的新类中创建新的成员函数,使新类的实例在程序中实现所需的功能。后面的例子演示了类的派生过程,并对它做进一步的讲解。二、 理解一个MFC程序 设计一个程序在讲述如何编写程序代码之前,很有必要简要地介绍一下用MFC编写程序的过程。假设要编写一个显示“HelloWorld”的程序,虽然这是一个简单的程序,但也需要设计一下。“HelloWorld”,程序需要在屏幕上开一个窗口,该窗口用来显示“HelloWorld”。然后要把“HelloWorld”放入该窗口中。完成这项工作需要三个对象: 程序对象,该对象用来初始化程序并使之同Windows关联。该对象处理所有底层的事件过程。 窗口对象,该对象形成程序的主窗口。 静态文本对象,该对象形成程序的静态文本符号“HelloWorld。 每一个MFC程序都会包括前两个对象。第三个对象是因程序而异的。每个应用程序都定义自己的用户界面对象的集合,这些对象是用来显示程序的输出和接受用户输入的数据。一旦完成了用户界面的设计并决定了实现这个界面所必需的控件,这就可以编写程序来实现屏幕上的那些控件了。程序员可以编制代码来处理用户操作这些控件的时候所产生的事件。在这个“HelloWorld”,程序中,仅有一个必需的控件,它保存字符“HelloWorld”。实际上,很多实用程序的主窗口和对话框上会安排成百上千的控件。 理解程序的代码 下面是“HelloWorid”程序的代码,并给程序加了注释。通过一行一行地分析这个程序的代码,读者可以掌握用MFC创建一个简单程序的方法。以后讲述了如何用AppWizard生成一个复杂的MFC程序的框架。/hello.cpp/ afxwin.h包括了MFC用到的所有数据类型、类、函数、和变量。它也包括其它头文件,/ 如Windows API库#include / 定义应用程序类class CHelloApp : public CWinApppublic:virtual BOOL InitInstance();/ 建立一个应用程序类对象(全局)CHelloApp HelloApp;/ 定义主窗口类class CHelloWindow : public CFrameWnd CStatic* cs; /私有成员,静态控件指针public:CHelloWindow(); /构造函数CHelloWindow(); /析构函数;/ 定义程序类初始化函数,应用程序类的构造函数调用该函数,Winmain()函数被隐藏BOOL CHelloApp:InitInstance()/建立窗口并指向它,m_pMainWnd是CWinThread(CWinApp)的数据成员m_pMainWnd = new CHelloWindow(); m_pMainWnd-ShowWindow(m_nCmdShow); /显示窗口m_pMainWnd-UpdateWindow(); /绘制窗口内各对象return TRUE;/ 窗口类构造函数CHelloWindow:CHelloWindow() / 建立程序主窗口Create(NULL, /该窗口类默认名字Hello World!, /窗口标题WS_OVERLAPPEDWINDOW, /窗口风格CRect(0,0,200,200); /窗口大小尺寸/ 用Cstatic类的构造函数申请内存,并指向它cs = new CStatic();/建立静态控件窗口cs-Create(hello world, /显示文本内容WS_CHILD|WS_VISIBLE|SS_CENTER, /窗口风格属性CRect(50,80,150,150), /窗口尺寸this); /父窗口标识/ 窗口类析构函数CHelloWindow:CHelloWindow() delete cs; /释放静态对象内存上机操作方法:API工程类型,使用MFC类库。三、 定制控件控件是建立Windows应用程序界面的用户界面对象。我们所见到的大多数Windows应用程序和对话框只不过是控件的集合,这些控件是按照程序所要实现的功能来合理布局的。要建立有效的应用程序,必须彻底理解怎样使用Windows中的控件。Windows中只有CStatic、CButton、CEdit、CList、CComboBox和CScrollBar这六种基本控件,以及以后讨论的附加的Windows 95控件集。我们需要理解每一个控件的功能,怎样调整其外观和行为,以及怎样使控件正确地响应用户事件。将这些知识以及对菜单和对话框的理解结合起来,我们就能创建任何可以想象到的Windows应用程序。最简单的控件CStatic用来显示静态文本。类CStatic没有数据成员,只有四个成员函数,即构造函数、函数Create以及两个分别用来获取和设置静态控件图标的函数。该控件不响应用户事件。由于其简单性,以该控件为起点学习Windows控件是稳妥的。 现在讨论类CStatic,进而理解怎样修改和定制控件。后面讨论类CButton和CScrollBar,从而理解对事件的处理。最后用简单的应用程序来综合本次课所学的概念。一旦理解了所有这些控件和类,就可以着手建立完整的应用程序。 基本知识 类CStatic向用户显示静态文本信息。这些信息既可以是纯悴的信息(如描述某个错误的消息对话框中的文本),也可以是用来标识其他控件的简短的标签。 类CStatic的对象还有其他几种显示风格,改变风格可使标签显示成实心矩形、边框或图标。类CStatic的实心矩形或边框式风格能够可视化地将界面要素组合起来,并可在控件之间添加分隔条。 CStatic控件总是某个父窗口的子窗口。通常情况下,父窗口是应用程序的主窗口或对话框。用两行代码和一条声明语句就可以建立静态文本控件。CStatic *cs;cs=new CStatic();cs-Create(“hello world”,WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(50,80,150,150),this); 上面两行建立控件的代码通常也是用MFC手工建立其他所有控件的范例。对new的调用为类CStatic的实例分配了内存,在此过程中,它调用了该类的构造函数。构造函数完成了该类所需要的所有初始化任务。Create函数建立了窗口级的控件,并把它显示在屏幕上。B00L CStatic:Create(LPCSTR lpText, 控件所显示的文本 DWORD dwStyle, 控件的窗口风格 const RECT& rect, 控件在其父窗口中的位置和大小 CWnd * pParentWnd, 父窗口(NULL值是非法的,它必须有父窗口) UINT nID=0xffff); 控件的资源ID(可有可无)如果成功地建立了控件,函数返回TRUE,否则返回FALSE。 参数dwStyle是最重要的参数,它控制控件的外观和行为。 CStatic的风格 所有的控件都有各种显示风格。函数Create在建立控件时用dwStyle参数确定了这些风格。风格参数是通过不同屏蔽常量的“或”操作建立的一个位屏蔽。在MFC文档中可查找到有关CStatic控件的可用常量(先找到CStatic:Create函数所在的页面,然后单击该页的Static Style项),下面是对这些常量的简要描述:从CWnd继承来的风格:WS_CHILD CStatic必需具有的风格WS_VISIBLE控件对用户是可见的WS_DISABLED控件拒绝用户事件WS_BORDER控件的文本用边框框起来CStatic固有的风格:SS_BLACKFRAME控件显示成矩形边框,颜色与窗口的边框颜色相同SS_BLACKRECT控件显示成实心矩形,颜色与窗口的边框颜色相同SS_CENTER文本居中SS_GRAYFRAME控件显示成矩形边框,颜色与桌面颜色相同SS_GRAYRECT控件显示成实心矩形,颜色与桌面颜色相同SS_IC0N控件显示成图标,文本字符串用作资源文件中的图标的名字,rect参数仅控制控件的位置SS_LEFT文本左对齐,多出的文本回行SS_LEFTN0WORDWRAP文本左对齐,多出的文本被裁剪掉SS_NOPREFIX除非使用该属性,否则文本字符串中的字符&表示加速键前缀SS_RIGHT文本右对齐,多出的文本回行SS_SIMPLE单行文本,左对齐,父窗口忽略所有的CTLCOLOR消息SS_USERITEM用户定义项SS_WHITEFRAME控件显示成矩形边框,颜色与窗口的背景色相同SS_WHITERECT控件显示成实心矩形,颜色与窗口的背景色相同这些常量有两个不同的来源。以“SS”(Static Style的缩写)开头的常量只适用于CStatic控件。以“WS”(Window Style的缩写)开头的常量适用于所有的窗口,因此在CWnd的对象中定义这些常量,CStatic继承了其行为。CWnd中还定义了很多以“WS”开头的风格常量,在MFC文档中查找CWnd:Create函数可查到这些常量。适用于CStatic对象的以“WS”开头的风格常量只有上面四个。CStatic对象至少是风格常量WS_CHILD 和WS_VISIBLE的“或”操作。除非该控件是另一个窗口的子窗口,否则它是不能被建立的;而且如果没有指定WS_VISIBLE,那么它是不可见的。WS_DISABLE控制标签对事件的响应。因为标签并不响应击键或鼠标单击等事件,所以特地将它禁止掉是多余的。其他风格属性是可有可无的,它们控制标签的外观。修改传递给函数CStatic:Create的风格属性,可以控制静态控件在屏幕上的显示。用风格属性修改CStatic对象的文本显示可使我们掌握很多不同的风格。代码分析下面代码可有助于理解CStatic对象的行为。/static1.cpp#include / Declare the application classclass CTestApp : public CWinApppublic:virtual BOOL InitInstance();CTestApp TestApp; class CTestWindow : public CFrameWnd CStatic* cs;public:CTestWindow();CTestWindow();BOOL CTestApp:InitInstance()m_pMainWnd = new CTestWindow();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;CTestWindow:CTestWindow() CRect r;Create(NULL, CStatic Tests, WS_OVERLAPPEDWINDOW,CRect(0,0,200,200);GetClientRect(&r);r.InflateRect(-20,-20);cs = new CStatic();cs-Create(hello world ,WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,r,this);CTestWindow:CTestWindow()delete cs; 字体通过调用CStatic从CWnd继承来的SetFont函数,我们可以修改静态标签所使用的字体。注意两个类如何交互作用。/static6.cpp#include class CTestApp : public CWinApppublic:virtual BOOL InitInstance();CTestApp TestApp; class CTestWindow : public CFrameWnd CStatic* cs;CFont *font;public:CTestWindow();CTestWindow();BOOL CTestApp:InitInstance()m_pMainWnd = new CTestWindow();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;CTestWindow:CTestWindow() CRect r;Create(NULL, CStatic Tests, WS_OVERLAPPEDWINDOW,CRect(0,0,200,200);GetClientRect(&r);r.InflateRect(-20,-20);cs = new CStatic();cs-Create(Hello World,WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,r,this);/ Create a new 36 point Arial fontfont = new CFont;font-CreateFont(36,0,0,0,700,0,0,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, arial); / Cause the label to use the new fontcs-SetFont(font);CTestWindow:CTestWindow()delete cs; delete font;四、 消息和事件处理按钮、窗口改变大小、定时器/ button4.cpp#include #define IDC_BUTTON 100#define IDT_TIMER1 200/ 定义应用程序类class CButtonApp : public CWinApppublic:virtual BOOL InitInstance();/ 建立应用程序类对象(实例)CButtonApp ButtonApp; / 定义主窗口类class CButtonWindow : public CFrameWnd CButton *button; /按钮类对象指针public:CButtonWindow(); /构造函数afx_msg void HandleButton(); /按钮事件处理函数afx_msg void OnSize(UINT, int, int); /尺寸大小改变处理函数afx_msg void OnTimer(UINT); /时间消息处理函数DECLARE_MESSAGE_MAP() /定义一个消息映像;/ 按钮消息处理函数定义void CButtonWindow:HandleButton()MessageBeep(0xFFFFFFFF);/ 改变窗口尺寸处理函数void CButtonWindow:OnSize(UINT nType, int cx,int cy)CRect r;GetClientRect(&r);r.InflateRect(-20,-20);button-MoveWindow(r);/ 时间消息处理函数void CButtonWindow:OnTimer(UINT id)MessageBeep(0xFFFFFFFF);/ 消息影射表BEGIN_MESSAGE_MAP(CButtonWindow, CFrameWnd) /两个参数 窗口类与它的基类ON_BN_CLICKED(IDC_BUTTON, HandleButton) /控件ID,处理函数,窗口消息ON_WM_SIZE() /系统消息 参考CWnd类 自动调用OnSize()ON_WM_TIMER() /定时器消息 无分号END_MESSAGE_MAP()/ 应用程序初始化函数BOOL CButtonApp:InitInstance()m_pMainWnd = new CButtonWindow();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;/ 窗口类构造函数CButtonWindow:CButtonWindow() CRect r;/ 建立窗口Create(NULL, CButton Tests, WS_OVERLAPPEDWINDOW,CRect(0,0,200,200);/ Set up the timerSetTimer(IDT_TIMER1, 1000, NULL); / 1000 ms./ 获得窗口的客户矩形尺寸GetClientRect(&r);r.InflateRect(-20,-20);/ 建立一个按钮对象button = new CButton();button-Create(Push me,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,r,this,IDC_BUTTON);滚动条/ sb2.cpp#include #define IDC_SCROLLBAR 100const int MAX_RANGE=100;const int MIN_RANGE=0;/ Declare the application classclass CScrollBarApp : public CWinApppublic:virtual BOOL InitInstance();/ Create an instance of the application classCScrollBarApp ScrollBarApp; / Declare the main window classclass CScrollBarWindow : public CFrameWnd CScrollBar *sb;public:CScrollBarWindow();afx_msg void OnHScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar);DECLARE_MESSAGE_MAP() ;/ The message handler functionvoid CScrollBarWindow:OnHScroll(UINT nSBCode,UINT nPos, CScrollBar* pScrollBar)int pos;pos = sb-GetScrollPos();switch ( nSBCode )case SB_LINEUP:pos -= 1;break;case SB_LINEDOWN:pos += 1;break;case SB_PAGEUP:pos -= 10;break;case SB_PAGEDOWN:pos += 10;break;case SB_TOP:pos = MIN_RANGE;break;case SB_BOTTOM:pos = MAX_RANGE;break;case SB_THUMBPOSITION:pos = nPos;break;default:return;if ( pos MAX_RANGE )pos = MAX_RANGE;sb-SetScrollPos( pos, TRUE );/ The message mapBEGIN_MESSAGE_MAP(CScrollBarWindow, CFrameWnd)ON_WM_HSCROLL()END_MESSAGE_MAP()/ The InitInstance function is called once/ when the application first executesBOOL CScrollBarApp:InitInstance()m_pMainWnd = new CScrollBarWindow();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;/ The constructor for the window classCScrollBarWindow:CScrollBarWindow() CRect r;/ Create the window itselfCreate(NULL, CScrollBar Tests, WS_OVERLAPPEDWINDOW,CRect(0,0,200,200);/ Get the size of the client rectangleGetClientRect(&r);/ Create a scroll barsb = new CScrollBar();sb-Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,CRect(10,10,r.Width()-10,30),this,IDC_SCROLLBAR);sb-SetScrollRange(MIN_RANGE,MAX_RANGE,TRUE);五、简单应用程序摄氏温度转换器/ f2c.cpp#include #include const int IDC_SB1=100;const int IDC_CS1=101;const int IDC_CS2=102;const int IDC_BUTTON=103;const int MIN_RANGE=0;const int MAX_RANGE=100;/ Define an application objectclass CApp : public CWinApppublic:virtual BOOL InitInstance();/ Create an instance of the application objectCApp App; / Define the window objectclass CWindow : public CFrameWnd CScrollBar* sb1;CStatic* cs1;CStatic* cs2;CButton* button;public:CWindow(); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);afx_msg void handleButton();DECLARE_MESSAGE_MAP();/ The message mapBEGIN_MESSAGE_MAP( CWindow, CFrameWnd )ON_WM_HSCROLL()ON_BN_CLICKED(IDC_BUTTON, handleButton)END_MESSAGE_MAP()/ Window constructorCWindow:CWindow() / Create the windowCreate(NULL, 摄氏温度转换器, WS_OVERLAPPEDWINDOW,CRect(0,0,208,208); / Create the fahrenheit labelcs1 = new CStatic();cs1-Create(Farhenheit = 32,WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,200,50),this, IDC_CS1);/ Create celsius labelcs2 = new CStatic();cs2-Create(Celsius = 0,WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,51,200,100),this, IDC_CS2);/ Create the scroll barsb1 = new CScrollBar();sb1-Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,CRect(0,101,200,130),this, IDC_SB1);sb1-SetScrollRange(MIN_RANGE,MAX_RANGE,TRUE);sb1-SetScrollPos(32);/ Create quit buttonbutton = new CButton();button - Create(Quit,WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,131,200,180),this, IDC_BUTTON);/ Handle the horizontal scroll barvoid CWindow:OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )int pos;pos = pScrollBar-GetScrollPos();switch ( nSBCode )case SB_LINEUP:pos -= 1;break;case SB_LINEDOWN:pos += 1;break;case SB_PAGEUP: pos -= 10;break;case SB_PAGEDOWN:pos += 10;break;case SB_TOP:pos = MIN_RANGE;break;case SB_BOTTOM:pos = MAX_RANGE;break;case SB_THUMBPOSITION:pos = nPos;break;default:return;if ( pos MAX_RANGE )pos = MAX_RANGE;sb1-SetScrollPos( pos, TRUE );/ set the labels to the new valueschar s100;ostrstream ostr(s,100);ostr Fahrenheit= pos ends;SetDlgItemText(IDC_CS1,s);ostr.seekp(ios:beg);ostr Celsius= (pos-32)*5/9 ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;利息计算器/ interest.cpp#include #include #include #include const int IDC_ED1=100;const int IDC_ED2=101;const int IDC_ED3=102;const int IDC_RESULT=103;const int IDC_BUTTON=104;/ Define an application objectclass CApp : public CWinApppublic:virtual BOOL InitInstance();/ Create an instance of the applicationCApp App; / Define the window objectclass CWindow : public CFrameWnd CEdit* ed1;CEdit* ed2;CEdit* ed3;CStatic* cs1;CStatic* cs2;CStatic* cs3;CStatic* result;CButton* button;CBrush *brush;public:CWindow(); CWindow(); afx_msg void HandleChange();afx_msg void HandleButton();afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );DECLARE_MESSAGE_MAP()virtual BOOL PreTranslateMessage(MSG* msg);/ This function interprets tab keys properlyBOOL CWindow:PreTranslateMessage(MSG *msg)return :IsDialogMessage(m_hWnd,msg);/ Message mapBEGIN_MESSAGE_MAP( CWindow, CFrameWnd )ON_EN_CHANGE(IDC_ED1, HandleChange)ON_EN_CHANGE(IDC_ED2, HandleChange)ON_EN_CHANGE(IDC_ED3, HandleChange)ON_BN_CLICKED(IDC_BUTTON, HandleButton)END_MESSAGE_MAP()/ Window constructorCWindow:CWindow() / Create the windowCreate(NULL, Interest, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, CRect(CPoint(10,10),CSize(160,226); / Create the labelscs1 = new CStatic();cs1-Create(Amount,WS_CHILD|WS_VISIBLE,CRect(CPoint(8,10),CSize(72,20),this);cs2 = new CStatic();cs2-Create(Rate(%),WS_CHILD|WS_VIS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物资搬迁协议合同书模板
- 班班通安装劳务合同范本
- 精准扶贫房改造合同范本
- 销售店集体买车合同范本
- 牛肉面合作协议合同范本
- 物业消防水维修合同范本
- 燃气供货合同协议书模板
- 苗木移栽合同协议书样本
- 网签合同撤销协议书范本
- 甲状旁腺切除手术协议书
- 心血管内科基础知识:综合试题及答案
- 云南省昆明市官渡区2023-2024学年五年级下学期期末考试数学试题
- 主厂房桥式起重机安装施工方案改
- 人教版五年级数学上册解决问题分类练习及答案
- 剑桥(join in)版小学英语三年级下册同步练习试题(全册)
- 2024年武定县欣武产业投资运营有限公司招聘笔试参考题库附带答案详解
- 2024年广东省政工师理论知识考试参考题库(含答案)
- 盆底功能障碍问卷(PFDI20)
- 新入职的职工劳动合同书
- 【创优】风力发电工程标准清单(国标、行标)
- 2021全方位高压喷射注浆技术规程
评论
0/150
提交评论