孙鑫VC++深入详解(2):mfc框架程序剖析

1、基于MFC的程序框架剖析

MFC程序首先定义了一个全局应用程序对象theApp(该对象就表示了应用程序本身),使它在WinMain()函数之前执行,全局对象theApp的构造函数调用时就会先调用其基类CWinApp的构造函数,在基类的构造函数中完成程序的一些初始化的工作,并将应用程序对象的指针保存起来。然后才进入WinMain()函数,MFC中WinMain()函数是程序编译链接时,由链接器将该函数链接到程序中的。WinMain()函数调用AfxWinMain()函数,在AfxWinMain()函数中注册、创建、显示和更新窗口、进入消息循环,因为设置了默认窗口过程故不必再自定义窗口过程。

MFC程序并不是把所有消息都交给默认窗口过程函数DefWindowProc,而是采用消息映射机制来处理消息(标准消息、命令消息、通告消息)。

2、单文档MFC程序结构

单文档MFC程序自动生成5个类,以Test程序为例:

CTestApp应用程序类:用来定义全局应用程序对象,代表应用程序本身,基类为CWinApp;

CMainFrame框架类:表示整个框架窗口,基类为CFrameWnd;

CTestView视类:表示客户区窗口,显示和修改数据,基类为CView;

CTestDoc文档类:用于存储和加载数据,基类为CDocument;

CAboutDlg对话框类:用来显示关于对话框,基类为CDialog;

MFC提供了一个文档/视类(Document/view)结构,数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成,从而把数据管理和显示方法分离开来。

框架类窗口是视类窗口的父窗口,视类窗口始终覆盖在框架类窗口之上,故鼠标单击、鼠标移动等消息只能由视类窗口捕获。

可以利用函数GetParent()获得父窗口的指针,返回类型为CWnd*,故使用时应进行类型转换。

3、窗口类对象与窗口的关系

当一个窗口销毁时,它会调用CWnd类的DestroyWindow()函数,该函数销毁窗口后将CWnd成员变量m_hWnd设为NULL,C++窗口类对象的生命周期和窗口的生命周期是不一致的,它们之间唯一的关系式窗口类对象的内部定义了一个窗口句柄变量m_hWnd,保存了与这个窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的窗口类对象销毁与否要看其生命周期是否结束,但窗口类对象销毁时,与之相关的窗口也将销毁。

4、CButton按钮类

在窗口中显示一个按钮需要两个步骤:1、定义CButton对象,2、调用CButton::Create()函数创建按钮(按钮类型应指定WS_VISIBLE风格)。

virtual BOOL Create(
   LPCTSTR lpszCaption, //按钮文本
   DWORD dwStyle,       //按钮的风格
   const RECT& rect,    //按钮显示的位置和大小
   CWnd* pParentWnd,    //指定父窗口
   UINT nID             //按钮控件ID
);

应用下面的窗口风格到按钮控件:

  • WS_CHILD   Always

  • WS_VISIBLE   Usually

  • WS_DISABLED   Rarely

  • WS_GROUP   To group controls

  • WS_TABSTOP   To include the button in the tabbing order

应用下面的按钮风格到按钮控件:

  • BS_PUSHBUTTON   Creates a command button that sends aBN_CLICKED notification to the owner window when the user clicks the button

  • BS_OWNERDRAW   Creates an owner-drawn button

  • BS_CENTER   Centers text horizontally in the button rectangle

         .......

eg:

static CButton myButton;
myButton.Create(_T("按钮1"), WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, CRect(0,0,100,50), this, 110);

5、WM_CREATE消息

当调用CreateWindow或CreateWindowEx创建窗口的时候系统会发送WM_CREATE消息(对应消息处理函数OnCreate),但是这个消息是在CreateWindow(CreateWindowEx)返回之前发送的。如果一个程序处理这个消息,那么(在OnCreate中)应当返回0以使得窗口的创建过程得以继续。如果对于这个消息程序返回-1,窗口将会被销毁,并且CreateWindowEx或者CreateWindow函数将会返回一个值为NULL的句柄。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值