首先我们来写一个样例:

1.建一个win32简单应用程序,不要觉得这样就不能写出MFC程序,由于是不是MFC程序取决于调没调MFC函数。

2. 删除入口函数。仅仅留下#include "stdafx.h"

3.将stdafx.h中的头文件 <windows.h> 更改为 <afxwin.h>。

4.Project-->Settings菜单项中设置使用MFC库

5.编写代码:

  1. #include "stdafx.h"
  2. #include "resource.h"
  3. //视图类(创建方式与工具栏与工具栏步骤类似)
  4. class CMyView:public CView
  5. {
  6. public:
  7. virtual void OnDraw( CDC* pDC );
  8. DECLARE_MESSAGE_MAP ()
  9. protected:
  10. afx_msg void OnTest();
  11.  
  12. };
  13. BEGIN_MESSAGE_MAP(CMyView,CView)
  14. ON_COMMAND(ID_TEST,OnTest)
  15. END_MESSAGE_MAP()
  16.  
  17. void CMyView::OnTest()
  18. {
  19. MessageBox("CMView::OnTest");
  20. }
  21. void CMyView::OnDraw( CDC* pDC )
  22. {
  23. pDC->TextOut(100,100,"Hello World!");
  24. }
  25. //框架窗体类
  26. class CMainFrame :public CFrameWnd
  27. {
  28. public:
  29. // CMyView m_wndView;//视图类对象
  30. CMyView*m_pWndView;//视图类的指针
  31. DECLARE_MESSAGE_MAP()
  32. protected:
  33. afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );
  34.  
  35. };
  36. BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
  37. ON_WM_CREATE()
  38. END_MESSAGE_MAP()
  39.  
  40. int CMainFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )
  41. {
  42. if(-1==CFrameWnd::OnCreate(lpCreateStruct))//父类的
  43. {
  44. return -1;
  45. }
  46. //创建视图窗体
  47. m_pWndView = new CMyView;//在堆中创建对象
  48. m_pWndView->Create(NULL,"MyView",WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,100,100),
  49. this,AFX_IDW_PANE_FIRST);//AFX_IDW_PANE_FIRST可使边框和客户区重叠
  50. //将视图设置为活动视图
  51. //方式1:调用函数
  52. // SetActiveView(m_pWndView);
  53. //方式2:指针赋值
  54. m_pViewActive = m_pWndView;
  55.  
  56. return 0;
  57. }
  58. //应用程序类
  59. class CViewApp :public CWinApp
  60. {
  61. public:
  62. virtual BOOL InitInstance();
  63.  
  64. };
  65. CViewApp theApp;//唯一的应用程序对象
  66. BOOL CViewApp::InitInstance()
  67. {
  68. //创建主要的主框架窗体
  69. CMainFrame *pFrame = new CMainFrame;
  70. //创建窗体,内部调用Create函数
  71. pFrame->LoadFrame(IDR_MENU1);//比Create函数用起来简单
  72. //将窗体设置为应用程序主窗体
  73. m_pMainWnd = pFrame;
  74. //显示和更新
  75. pFrame->ShowWindow(SW_SHOW);
  76. pFrame->UpdateData();
  77.  
  78. return TRUE;
  79. }

注意:

实例化CMyView对象前必须重写OnDraw()函数,由于OnDraw()是纯虚函数

        视图窗体的创建是在CMainFrame的 OnCreate()函数中调Create函数

思考&提升:

1. 为什么非要使用视图类的指针来?

因为在CView::PostNcDestroy()函数中,调用了delete this;  所以,视图对象的创建放到堆中。即new 对象。

2. 创建视图时,如何视图铺满框架窗体的客户区?

创建时视图的ID填AFX_IDW_PANE_FIRST

3.  为什么要将视图对象设置为框架窗体的活动视图?

由于 处理菜单等命令消息的先后顺序: 活动视图->框架窗体->应用程序。

我们将对此进行验证:在消息提示框那行加断点,调试执行,我们通过调用堆栈得到下图调用信息

菜单消息都属于命令消息。所以我们找CFrameWnd 的 OnCmdMsg。双击进入CFrameWnd::OnCmdMsg()中得到

  1. BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
  2. AFX_CMDHANDLERINFO* pHandlerInfo)
  3. {
  4. CPushRoutingFrame push(this);
  5.  
  6. // pump through current view FIRST
  7. CView* pView = GetActiveView();
  8. if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  9. return TRUE;
  10.  
  11. // then pump through frame
  12. if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  13. return TRUE;
  14.  
  15. // last but not least, pump through app
  16. CWinApp* pApp = AfxGetApp();
  17. if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  18. return TRUE;
  19.  
  20. return FALSE;
  21. }

能够看出:处理菜单等命令消息的先后顺序: 活动视图->框架窗体->应用程序

4.OnPaint与OnDraw之间的关系?

OnPaint调的是OnDraw。

由于OnDraw函数比OnPaint更简单。不用加入消息映射所以视图的信息显示,直接在OnDraw函数中。

5.为什么不用框架窗体的客户区显示数据。而非要用视图窗体显示?

框架窗体:就好像个容器,负责装各种各样的子窗体

视图窗体:是一种子窗体。父类是框架窗体,负责显示数据。这样做是由于当应用程序比較复杂时,我们希望一个类去做一件事

CView类的使用的更多相关文章

  1. CWinApp类CMultiDocTemplate类CDocument类CView类的关系

    转自:http://blog.csdn.net/bboot/article/details/26884011 不得不转,瞬间搞清了很多问题,短小精悍 1.CWinApp类   它包含并管理着应用程序的 ...

  2. MFC中用户自定义类响应自定义消息

    这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义 ...

  3. MFC修改视图CView的背景颜色

    (1) 在CYournameView(就是你的视图类,以下以CDrawLineView为例)添加了一个背景颜色变量 COLORREF m_bgcolor; (2)修改这个函数: BOOL CDrawL ...

  4. VC窗口类的销毁-是否需要delete

    Windows窗口如果使用new的方法添加之后,在父窗口析构的时候,有些需要delete有些却不需要delete.这个的确有点坑,由于c++的实现,对于每个自己new的对象,我都会delete删除它, ...

  5. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  6. MFC的本质

    一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...

  7. 重绘控件中OnPaint、OnDraw、OnDrawItem和DrawItem的区别

    ==================================================================================================== ...

  8. visual C++ 项目和解决方案的区别

    项目:         项目是构成某个程序的全部组件的容器,该程序可能是控制台程序.基于窗口的程序或某种别的程序.程序通常由一个或多个包含用户代码的源文件,可能还要加上包含其它辅助数据的文件组成.某个 ...

  9. MFC学习-第2,3课 MFC框架的运行机制

    转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...

随机推荐

  1. 《House of Cards》观后感

    <House of Cards>,首先我得说好看,36个赞,比我以前看的那些美剧都要好看,虽然我是个屌丝程序员,但是我还是希望我自己看书不只看专业的书那种,虽然我是个屌丝程序员,工科男,所 ...

  2. TreeListControl 不同类别的行使用不同的数据模板

  3. cognos report上钻下钻报表处理方法(2)

    在此之前已经说过了在报表本身单个维度上面的上钻与下钻,本次说的是传递参数追溯到其他报表.比如从部门追溯到部门每一位员工的数据分析, 如图:报表1 点击信托业务一总部跳转到下面的报表2,显示每一位执行经 ...

  4. Java+FlashWavRecorder实现网页录音并上传

    [注意] 最新版本号请看这里:http://uikoo9.com/blog/detail/java-flashwavrecorder [前言] 肯定有需求要网页录音,并且要上传.这奇葩需求. 然后找到 ...

  5. JavaScript 之 日常积累

    1. <a>标签"加入收藏",兼容IE,FireFox等 function bookmarksite() { if (window.sidebar) { // Mozi ...

  6. eclipse安装maven3

    maven3 安装: 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Maven是 Apache 下的一个项目,目前最新版本是 3.0.4,我用的也是这个. 首先去官网下载 Maven ...

  7. xcode8 的坑 Info.plist 配置app权限

    好多更新完Xcode8 的小盆友们(我也是小盆友啦),会发现当我们调用系统功能,相册,相机,麦克风等会出现崩溃,而控制台打印出一堆乱七八糟的看不懂的东西,但是最后一句话是有用的,给出了崩溃的原因 啦, ...

  8. java String分配内存空间备忘

    栈内存 堆内存 基础类型,对象引用(堆内存地址) 由new创建的对象和数组, 存取速度快 相对于栈内存较慢 数据大小声明周期必须确定 分配的内存由java虚拟机自动垃圾回收器管理.动态分配内存大小 共 ...

  9. linux sar命令详细说明相关参数

    详细说明linux的sar命令 sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括: ...

  10. 数据挖掘之权重计算(PageRank)

    刘  勇  Email:lyssym@sina.com 简介 鉴于在Web抓取服务和文本挖掘之句子向量中对权重值的计算需要,本文基于MapReduce计算模型实现了PageRank算法.为验证本文算法 ...