首先我们来写一个样例:

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

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

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

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

5.编写代码:

#include "stdafx.h"
#include "resource.h"
//视图类(创建方式与工具栏与工具栏步骤类似)
class CMyView:public CView
{
public:
virtual void OnDraw( CDC* pDC );
DECLARE_MESSAGE_MAP ()
protected:
afx_msg void OnTest(); };
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_COMMAND(ID_TEST,OnTest)
END_MESSAGE_MAP() void CMyView::OnTest()
{
MessageBox("CMView::OnTest");
}
void CMyView::OnDraw( CDC* pDC )
{
pDC->TextOut(100,100,"Hello World!");
}
//框架窗体类
class CMainFrame :public CFrameWnd
{
public:
// CMyView m_wndView;//视图类对象
CMyView*m_pWndView;//视图类的指针
DECLARE_MESSAGE_MAP()
protected:
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); };
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP() int CMainFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if(-1==CFrameWnd::OnCreate(lpCreateStruct))//父类的
{
return -1;
}
//创建视图窗体
m_pWndView = new CMyView;//在堆中创建对象
m_pWndView->Create(NULL,"MyView",WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,100,100),
this,AFX_IDW_PANE_FIRST);//AFX_IDW_PANE_FIRST可使边框和客户区重叠
//将视图设置为活动视图
//方式1:调用函数
// SetActiveView(m_pWndView);
//方式2:指针赋值
m_pViewActive = m_pWndView; return 0;
}
//应用程序类
class CViewApp :public CWinApp
{
public:
virtual BOOL InitInstance(); };
CViewApp theApp;//唯一的应用程序对象
BOOL CViewApp::InitInstance()
{
//创建主要的主框架窗体
CMainFrame *pFrame = new CMainFrame;
//创建窗体,内部调用Create函数
pFrame->LoadFrame(IDR_MENU1);//比Create函数用起来简单
//将窗体设置为应用程序主窗体
m_pMainWnd = pFrame;
//显示和更新
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateData(); return TRUE;
}

注意:

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

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

思考&提升:

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

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

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

创建时视图的ID填AFX_IDW_PANE_FIRST

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

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

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

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

BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
CPushRoutingFrame push(this); // pump through current view FIRST
CView* pView = GetActiveView();
if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; // then pump through frame
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; // last but not least, pump through app
CWinApp* pApp = AfxGetApp();
if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; return FALSE;
}

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

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. Java基础(七):重写与重载

    一.重写(Override): 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是 ...

  2. 关于一道JS面试题的思考

    题目: ; i < ; i++) { setTimeout(function() { console.log(new Date, i); }, ); } console.log(new Date ...

  3. 【SpringBoot】SpringBoot性能优化

    Spring 框架给企业软件开发者提供了常见问题的通用解决方案,包括那些在未来开发中没有意识到的问题.但是,它构建的 J2EE 项目变得越来越臃肿,逐渐被 Spring Boot 所替代.Spring ...

  4. Pylons架构网站开发从0到1

    首先说明下这里的从0到1指的是从没有听说过pylons到开发出一个看上去还不错的网站.一个月前,我没有听说过也不知道什么是pylons,HTML只知道一些标签,JavaScript也不怎么懂,由于只倾 ...

  5. ArcEngine开发各种几何错误代码

    E_GEOMETRY_AMBIGUOUSPARTTYPE - Static variable in interface com.esri.arcgis.geometry.esriGeometryErr ...

  6. Javascript高级程序设计-对象

    学习Javascript,最难的地方是什么? Object(对象)最难,初学者不容易掌握. Javascript是一种基于对象(object-based)的语言,它的语法中没有class(类). C# ...

  7. 动态SQL(学习笔记)

    动态SQL EXECUTE IMMEDIATE 动态SQL字符串 [BUCK COLLECT] INTO 自定义的变量,,|记录类型 USING [IN |OUT|IN OUT]绑定的参数] [RET ...

  8. STM32F429I-DISCO 和GPS的亲热接触

    第27章 GPS LCD显示教程 本期教程为大家解说GPS Global Positioning System(全球定位系统)的使用,.GPS是由美国国防部研制建立的一种具有全方位.全天候.全时段.高 ...

  9. Android:子线程向UI主线程发送消息

    在Android里,UI线程是不同意被堵塞的.因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要如何通知UI线程呢? 我们能够在UI主线程中创建一个handler对象,然后通过重写其h ...

  10. 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

    一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环 ...