发布时间 : 星期五 文章c++1更新完毕开始阅读e498a6cd8bd63186bcebbc63

CRect类介绍 注意:

这个类是从tagRECT结构派生而来的。(tagRECT是RECT结构的不太常用的别名。)这意味着RECT结构的数据成员(left,top,right,和bottom)也是CRect的可访问数据成员。 一个CRect包含用于定义矩形的左上角和右下角点的成员变量。

当指定一个CRect时,必须谨慎地构造它,以使它符合规范——也就是说,使其左坐标值小于右坐标值,使顶坐标值小于底坐标值。例如,左上角为(10,10),右下角为(20,20)就定义了一个符合规范的矩形,但是左上角为(20,20)而右下角为(10,10)的值就定义了一个不符合规范的矩形。如果矩形是不符合规范的,则CRect的许多成员函数都会符合不正确的结果。(参见CRect::NormalizeRect可以得到这些函数的列表。)在你调用一个要求符合规范的矩形的函数之前,你可以通过调用NormalizeRect函数来使不符合规范的矩形成为符合规范的矩形。

当用成员函数CDC::DPtoLP和CDC::LPtoDP来处理CRect时要小心。如果显示环境的映射模式y-extent是负的,就像在MM_LOENGLISH中一样,则CDC::DPtoLP将转换CRect,以使它的顶部坐标大于底部坐标。然后像Height和Size这样的函数将返回负值作为转换后的矩形的高度,则此矩形将是不符合规范的。 当使用重载的CRect操作符时,第一个操作数必须是一个CRect;第二个操作数可以是一个RECT结构或一个CRect对象。 CRect类介绍及GetClientRect

函数功能 该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0) 函数原型

在Win32 SDK, 该API函数原型为 BOOL GetClientRect( HWND hWnd, // 窗口句柄 LPRECT lpRect // 客户区坐标 );

在MFC中,该函数的原型为void GetClientRect(LPRECT lpRect) const; 参数

hWnd:是程序窗口的句柄。

lpRect:是一个指针,指向一个RECT类型的rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0。right和bottom字段设定为显示区域的宽度和高度(像素点数)。 也可以是一个CRrect对象指针。CRect对象有多个参数,与RECT用法相同。

函数的作用总的来说就是把客户区的大小写进第二个参数所指的Rect结构当中。 返回值

如果函数成功,返回一个非零值。

如果函数失败,返回零。要得到更多的错误信息,请使用GetLastError函数

?

?

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

?

写在前面:

我看的『VC++技术内幕』版本为--潘爱民和王国印译清华大学出版的第四版,因从网上看到此版译的最好。

这篇学习笔记是后补的,因为这本书我已经看到了第三十二章,之前并没有做笔记,只是随意的在书上画了画重点,可是越向后学越觉得前面的知识并没有掌握,所以决定重新来过并补上笔记。我认为只有踏踏实实的记录下每天的学习心得才能真正的有所收获。我个人认为学习这本经典之前最好先看看WINDOWS 32位编程的书,至少能用纯SDK写出一些小程序。

第一天:

WINDOWS应用程序一定要有WinMain函数,该函数用来完成一些特殊的任务,象创建程序的主窗口,主窗口用来处理消息的代码。MFC将WinMain隐藏在框架中,不象写SDK程序时可以很容易的找到它。

WINDOWS采用的消息处理机制也交给了程序框架,我们不必担心如何使这些消息和代码联系起来。并且WINDOWS定义好了一些消息,当窗口被创建时系统就会发送WM_CREATE消息,当点击鼠标左键时便系统会发送WM_LBUTTONDOWN消息,当用户按下键盘时系统会发送WM_CHAR消息,当用户关闭窗口时系统会发送WM_CLOSE消息,当用户进行菜单项选择或单击按钮时系统回发送WM_COMMAND消息,什么都不做系统还会发送WM_TIMER消息。先不说别的,先搞清出这几个消息再说。从MSDN中可以很方便的找到关于这几个消息的帮助文档。

WINDOWS提供通用的图形设备接口(GUI),我们通过调用(GDI)函数和硬件打交道,不必理会设备环境,WINDOWS会自动将设备环境结构映射到相应的物理设备,这应该就是设备无关性吧。

动态连接库(DLL)应该是代码重用的典型例子(不知道可不可这样说),把一些模块、自己新编的类单独调试并编译成DLL,及增加代码的可读性也提高了程序模块的灵活性。

用Developer Studio建立项目Developer Studio会创建很多中间文件,这些文件还是有必要说一下的。

APS //支持ResourceView

BSC //浏览器信息文件 CLW //支持ClassWizard

DSP //项目文件,不能删除和用文本编辑器编辑 DSW //工作空间文件,不能删除和用文本编辑器编辑 MAK //外部的创建文件 NCB //支持ClassView

OPT //保存工作空间的配置

PLG //建立日志文件

这些文件都有一定的作用,拿CLW来说,如果你有一个新类,需要加到ClassWizard中,除了将相应的.h 和.cpp加到DSP中还需要重新编译CLW。PLG文件记录着你的项目配置信息。

VC++的源程序浏览器能够使我们从类或函数的角度来了解或编辑程序,而不是直接从文件入手。在看别人的源代码时如果能熟练的使用源代码浏览器将会事倍功半。源程序浏览器主要的查看状态有以下几种:

Definitions and References——选择任何函数、变量、类型、宏定义可以看到它在项目中的定义,并且在何处和什么地方用到它。

Call Graph/Caller Graph——对于所选择的函数,给出它的调用与被调用函数的图示。

Derived Class Graph/Base Class Graph——给出类层次关系的图形表示,可以看到所选择的类的派生类和基类以及成员。

File Outline——对于所选的文件,列出文件中的类、函数和数据成员,同时还显示它们定义的位置和使用位置。

可见Source Brower比起Class View来功能多了很多也更加好用,以前我就不知道,因为一般的VC++书没有讲或根本没有注意这块,看到讲菜单、操作界面、编辑器时总是跳过,心想“没吃过猪肉还没见过猪跑?这种东西不用学就会”。可实际上还是应该仔细的看看的。

对于本章学习雷神建议大家在VC++6中用AppWizard生成一个空的程序,然后试着看看都有那些文件,和他们的类层次、函数、宏、结构的定义,我就是这样干的,学编程不动手是不行的

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

?

?

第二天:Microsoft基本类库应用程序框架

◎MFC是C++的Microsoft Windows API,如果想要开发WINDOWS的应用程序当然VC/MFC是开发环境的首选。 ◎MFC产生的应用程序使用了标准化的结构。(我现在还体会不出这点的优势所在,请高手指点) ◎MFC产生的应用程序短而运行速度快。这应该说的是可以很容易的建立动态连接,其实程序还是需要大量的DLL,不过由于WINDOWS上有很多可以用DLL所以应用程序很短,我是这样想的不知对否。 ◎VC++工具降低了编码的复杂性。这点不容质疑比起TC方便太多了。

◎MFC库功能非常丰富。书上列出了MFC从1.0--4.21的一些特性,我就不废话了,大家应该看看。

这一章节主要介绍了MFC库的优点,其实我本人认为在某些特定环境下其实MFC不一定就象说的那样好。我想不会有人用纯VC做MIS系统吧,太累了。我是这样理解编程序的,如果把学编程看成学武的话,C/C++语言及编程思想(OOP)是内功,API是基本功(编程思想是内功、API是基本功这适用于任何WIN32编程,不论Visual C++、Delphi、C++Builder、VB......),VC/MFC应该不同武功其中的一种,不同的学习方法效果不一样,只要下工夫也都可以达到一定的境界。真正的高手是有着深厚的内功,扎实的基本功,至于武功招数无所谓了,随便一站不丁不八全无破绽,无招胜有招了。对不住扯远了。

C++可以通过类库来进行扩展,我们除了可以使用随编译器提供的类库外还可以很方便使用软件公司销售的类库产品,甚至可以自己开发。而应用程序框架是一种类库的超集,它定义了程序的结构。

下面给出两个示例程序(一个是书上的一个是我写的):

雷神建议: 虽然现在很多书都附CD,CD上有书中所有示例的源代码,但还是应该亲自在VC6用手敲进去。这样可以加深印象以及感受一下编译除错后程序正确运行时的乐趣,因为是纯手工打造。自从我敲了近一百个代码示例后,由于笔误的BUG就很少了,打字速度也提高了。而且最好在原示例代码的基础上做些改动例如别千篇一律的显示HELLO WORLD!换点别的,这样做也可以加深对示例程序的理解。

我的HELLO WORLD用AppWizard向导创建一个显示一个字符串的单文档程序,只需要敲入一行语句,主要是体验MFC的强大功能。

1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。

2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。

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的朋友共同进步!\增加的一行 // TODO: add draw code for native data here }

完了,就这么简单。编译运行。看到了吗?这个程序具备WINDOWS程序的所有特性,例如有菜单、工具条、状态栏、最大化、关闭、甚至还有关于对话框、打印预览.....全了,这就是AppWizard通过MFC动态创建的一个应用程序。从这个小例子可以看出用VC/MFC设计WINDOWS程序多么方便。下面我们看看书上的例子,以便更进一步了解应用程序框架。

书上的例子:

1、先建立一个Win32 Application的应用程序。

2、选择Project->Add to project->Files,分别创建一个名为MyApp.h和一个名为MyApp.cpp的文件。

3、添加代码:(最好照敲以下代码到编译器,别用Ctrl+C/Ctrl+V)