『VC++技术内幕』学习笔记(3)

2016-02-19 12:57 3 1 收藏

想要天天向上,就要懂得享受学习。图老师为大家推荐『VC++技术内幕』学习笔记(3),精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

【 tulaoshi.com - 编程语言 】

    第三篇:消息映射和视图类

   在写了两篇笔记后有很多朋友给我发信,和我交流一些在学习过程中的问题。但由于我也是一个初学者,对一些问题自己也没有把握,所以实在不敢做答,但我会尽量尽我所能和大家一起研究,谢谢大家的鼓励和信任。

   在开始先补充一下上一篇的内容“内容窗口的创建”,兼答天歌网友的问题(如果天歌兄弟能看到的话 )。为了简化我们看一个更简单代码,只有一个文件,创建一个空白的窗口,什么也不做。注意哦:真写程序时还是要分成.h和.cpp两个文件比较清晰。
   前几步和『VC++技术内幕』学习笔记(2)中的一样,下面是代码:
//**********************************
// MyApp.cpp

#include "afxwin.h" //afxwin.h会调用windows.h是MFC编程的途径,只要用到MFC就一定要包含它。

class CMyApp:public CWinApp //从CWinApp继承一个类
{
public:
virtual BOOL InitInstance();//重载InitInstance虚函数
};

class CMyFrame:public CFrameWnd //从CFrameWnd继承一个类
{};

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

CMyApp myApp; //最后又激活应用程序的构造函数

BOOL CMyApp::InitInstance ()
{
m_pMainWnd=new CMyFrame;
//new 激活了CMyFrame类构造函数CFrameWnd(),构造函数调又用CREATE()
//m_pMainWnd在MFC的定义CWnd* m_pMainWnd;// main window (usually same AfxGetApp()-m_pMainWnd)
//m_pMainWnd保存窗口的位置
((CMyFrame * )m_pMainWnd)-Create(NULL,"一个MFC应用程序:空白窗口"); //创建窗口
m_pMainWnd-ShowWindow(m_nCmdShow); //显示在屏幕上
return TRUE;
}
   如果还不明白建议查看MSDN或看看侯大师的深入浅出。关于这个问题就说到这,最后对天歌朋友的学习态度表示敬意。

    下面进入正体,让我们继续来看看MFC的消息映射。

   MFC是通过一些宏来将特定的消息影射到派生类相应的成员函数上,这种体制的好处是允许某些非窗口类(如文档类)来控制命令消息。且不需要C++作任何扩展。

   MFC的消息控制函数要求提供函数原形、函数体以及消息映射中的入口。真的很麻烦,还好用Class Wizard可以很容易的将上面说到的东西加到我们的类中。例如只要在Class Wizard中添加WM_LBUTTONDOWN消息,则相应的代码便加在合适的地方。怎么样简单多了吧。

   应用程序除了包含应用程序框架类外,一般还要包含文档和视图类。这种文档-视图结构是应用框架的核心。我一直做MIS开发,当然不是用VC用的是VB,所以看到这我很不自觉的想到了后台数据库和界面的关系,这个例子可能不是很恰当,但却能很好的帮助我们理解文档和视图。文档好比后台的数据库,视图就是界面上显示的内容,同一个数据库可以用不同的界面显示,但由于所有的界面内容都是从数据库中数据得来,所以当数据库发生变化时所有的相关界面显示都会跟着改变。越来越觉得不恰当,不过实在想不出别的例子了。我们的应用程序实际上就是通过视图对文档进行一系列操作,不单指输出。下面我们看看视图类。

   视图是一个从CView类派生的类的对象,在屏幕上显示的窗口就是一种。对象的行为完全由类的成员函数和数据成员决定,其中及包括派生类中的特定函数,也包括基类的标准函数,所以了解MFC类库的结构以及各类的标准成员函数是多么重要啊,别怕麻烦找来MFC的源码读读,看多少算多少,但肯定不白看,这是雷神的经验。

记得上一篇的我的例子吗

1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。
2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。
此时MFC应用程序框架便帮我们完成了应用程序,你可以执行它,它会在屏幕上显示一个典型的WINDOWS风格的空白窗口。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

    我们来看一下项目程序所在目录下的文件:
myapp01.dsp //项目文件
myapp01.dsw //工作空间文件
myapp01.rc //资源描述文件
myapp01View.cpp //包含CMyAppView类成员函数的视图类实现文件 重点
myapp01View.h //包含CMyAppView类成员函数的视图类头文件 重点
myapp01.opt //二进制文件,告诉Developer Studio本项目的哪些文件是打开的,又是如何排列的
readme.txt //用来解释所产生的所有文件,未列出的myapp01Doc.cpp、myapp01Doc.h、StdAfx.cpp、StdAfx.h....在这里都可以找到相应解释。
resource.h //包含#define常量定义的头文件
   仔细研究一下myapp01View.cpp和myapp01View.h文件,程序核心CMyAppView类在这两个文件中定义,就是我们今天要学的视图类。要想看到CMyAppView类的全貌,应该用Source Browser查看,选择CMyApp01View,按Alt+F12,选择Base Class and Members 选项。我们会看到CMyAppView类的层次关系(从哪来得),以及所有成员函数,包括从基类继承的(在Class View中不能显示父类的成员函数)。我们发现实际上你什么也不用做就拥有了一个有着强大功能的类。

   下面我们看一下CMyAppView类的OnDraw成员函数,它是虚函数作用是每当窗口需重绘时应用程序框架会调用它。它的原型是这样的(在myapp01View.h可以找到)
virtual void OnDraw(CDC* pDC); // overridden to draw this view
   参数是CDC类的指针,WINDOWS是通过和窗口相关联的设备环境(CDC类的对象就是设备环境)和显示硬件进行通讯。有了这个指针我们便可以调用CDC类的成员函数来完成各种绘制工作,如上一篇用到的textout()还有一些Ellipse()、Polygon()、BitBlt()等等在MSDN中有好长的一篇,它是直接从CObject派生的,好了我们开始在OnDraw()里添加一些绘图工作。

3、在Class View选择CMyApp01View类的OnDraw()成员函数双击会在C++编译器看到以下内容
void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
在 // TODO: add draw code for native data here的位置增加一行代码
void CMyApp01View::OnDraw(CDC* pDC)
{
CMyApp01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC-TextOut(10,10,"雷神愿意和所有学VC的朋友共同进步!");
pDC-SelectStockObject (DKGRAY_BRUSH); //选择刷子
pDC-Ellipse (CRect(20,40,120,140)); //画圆,CRect是MFC库提供的一个表示WINDOWS矩形类
pDC-Rectangle (CRect(220,240,120,140)); //画矩形
// TODO: add draw code for native data here
}
编译运行,成功了吧。先到这吧。另外以后的文章将同时贴在写作区。

来源:http://www.tulaoshi.com/n/20160219/1602610.html

延伸阅读
第八章:使用ActiveX控件 1,ActiveX控件是一个直接插入到C++程序中的软件模块,以前常称OLE控件(OCX),是基于MS-COM技术。 2,ActiveX控件与普通Windows控件比较: 相同点:ActiveX控件也可看成是一个子窗口(可以看成这样的)。 如果想在对话框上加入ActiveX控件,则只要在对话框编辑器中,把ActiveX控件放在适当的位置上,并在资源模...
第六章:模式对话框和Windows通用控件 1,对话框也是窗口,它不当可以接受消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图操作。 2,模式对话框在被关闭之前,用户无法在同一应用程序的其它地方进行工作。模式对话框更易于编程。 无模式对话框在它仍保留在屏幕的同时,用户还可以在应用程序的其它窗口进行工作。 3,对话框...
第一章:Microsoft Windows 和 Visual C++ 1,Windows应用程序中一定要有WinMain函数,用来完成某些特殊的任务,其中最主要的是创建应用次序的主窗口。 2,DOS下,所有次序的目标模块在创建过程中都被静态连接起来。而Windows允许动态连接,即一些特定结构的库(DLL)可以在运行过程中被装入和连接,并且被多个应用程序共享。 3,项目是一些相...
第四章:基本事件处理、映射模式和滚动视图 1,消息映射:如在视窗中按下鼠标做键,会自动发送WM_LBUTTONDOWN消息,如果要对这消息有所反应的话,需 //{{AFX_MSG(CEx04aView)  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//头文件声明消息响应函数原型。 /
去年的时候,由于某种原因,我需要将一个文件的二进制形式以文本的格式输出到一个文本文件中,类似下面这个样子:   4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00   B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00 00 00 00 00...

经验教程

733

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部