VC++基础教程
Visual C++/MFC
入门教程
VC
开发指南
1.1
如½学½
VC
这个问题很多朋友½问过我,
½然流汗是必须的,
½同时如果按照某种思路进行有计划
的学习就会起到更½的效果。万事开头难,为了帮助朋友们更快的掌握
VC
开发,下面我将
自己的一点½会讲一下:
1、需要有½的 C/C++基础。正所谓“磨刀不误砍柴工”
,最开始接触
VC
时不要急于开
始
Windows
程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加
对语言的熟悉程度,
同时也训练自己的思维和熟悉一些在编程中常犯的错误。
更重要的是理
解并½运用
C++的各种特性,这些在以后的开发中½会有很大的帮助,特别是利用 MFC
进
行开发的朋友对
C++一定要½熟练运用。
2、理解 Windows
的消息机制,窗口句柄和其他
GUI
句柄的含义和用途。了解和
MFC
各个类功½相近的
API
½数。
3、一定要理解 MFC
中消息映射的½用。
4、训练自己在编写代码时不½用参考书而是½用 Help Online。
5、记½一些常用的消息名称和参数的意义。
6、学会看别人的代码。
7、多看书,少买书,买书前一定要慎重。
8、闲下来的时候就看参考书。
9、多来我的主页。^O^
后面几条是我个人的一点意见,½可以根据需要和自身的情况选用适用于自己的方法。
此外我将一些我在选择参考书时的原则:
对于初学者:
应该选择一些内容比较全面的书籍,
并且书籍中的内容应该以合理的方式
安排,在½用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。½量买翻译的
书,因为这些书一般½比较易懂,而且语言比较½松。买书前一定要慎重如果买到不½用的
书可½会对自己的学习积极性产生打击。
对于已经掌握了
VC
的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的
认识。需要选择一些对原理讲解的比较透½的书籍,这样一来才会对新技术有更多的了解,
最½书中对技术的应用有一定的阐述。½量选择示范代码必较精简的书,可以节约银子。
此外最½涉猎一些辅助性的书籍。
1.2
理解
Windows
消息机制
Windows
系统是一个消息驱动的
OS,什么是消息呢?我很难说得清楚,也很难下一个定义
(谁在嘘我)
,我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。
1、
消息的组成:
一个消息由一个消息名称
(UINT) 和两个参数
,
(WPARAM,
LPARAM)
。
½用户进行了输入或是窗口的状态发生改变时系统½会发送消息到某一个窗口。
例如½菜单
½中之后会有
WM_COMMAND
消息发送,WPARAM 的高字中(HIWORD(wParam))是½
令的
ID
号,对菜单来讲就是菜单
ID。½然用户也可以定义自己的消息名称,也可以利用自
定义消息来发送通知和传送数据。
2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可
以对消息进行分析,
对自己感兴趣的消息进行处理。
例如½希望对菜单选择进行处理那么½
可以定义对
WM_COMMAND
进行处理的代码,如果希望在窗口中进行图½输出就必须对
WM_PAINT
进行处理。
3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责
处理那些½不处理消息。正因为有了这个默认窗口过程我们才可以利用
Windows
的窗口进
行开发而不必过多关注窗口各种消息的处理。
例如窗口在被拖动时会有很多消息发送,
而我
们½可以不予理睬让系统自己去处理。
4、窗口句柄:说到消息就不½不说窗口句柄,系统通过窗口句柄来在整个系统中唯一
标识一个窗口,
发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。
而每个
窗口½会有自己的窗口过程,
所以用户的输入就会被正确的处理。
例如有两个窗口共用一个
窗口过程代码,
½在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是
窗口二。
5、示例:下面有一段伪代码演示如½在窗口过程中处理消息
LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
switch(uMessageType)
{//½用 SWITCH
语句将各种消息分开
case(WM_PAINT):
doYourWindow(...);//在窗口需要重新绘制时进行输出
break;
case(WM_LBUTTONDOWN):
doYourWork(...);//在鼠标左键被按下时进行处理
break;
default:
callDefaultWndProc(...);//对于其它情况就让系统自己处理
break;
}
}
接下来谈谈什么是消息机制:
系统将会维护一个或多个消息队列,
所有产生的消息½回
被放入或是插入队列中。
系统会在队列中取出每一条消息,
根据消息的接收句柄而将该消息
发送给拥有该窗口的程序的消息循环。
每一个运行的程序½有自己的消息循环,
在循环中得
而在没有消息时消息循环就
到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。
将控制权交给系统所以
Windows
可以同时进行多个任务。下面的伪代码演示了消息循环的
用法:
while(1)
{
id=getMessage(...);
if(id == quit)
break;
translateMessage(...);
}
½该程序没有消息通知时
getMessage
就不会返回,
也就不会占用系统的
CPU
时间。 图
示消息投递模式
在
16
½的系统中系统中只有一个消息队列,所以系统必须等待½前任务处理消息后才
可以发送下一消息到相应程序,
如果一个程序陷如死循环或是耗时操½时系统就会得不到控
制权。这种多任务系统也就称为协同式的多任务系统。Windows3.X 就是这种系统。
而
32
½的系统中每一运行的程序½会有一个消息队列,所以系统可以在多个消息队列
中½换而不必等待½前程序完成消息处理就可以得到控制权。
这种多任务系统就称为抢先式
的多任务系统。Windows95/NT 就是这种系统。
1.3
利用
Visual C++/MFC
开发
Windows
程序的优势
MFC
借 助
C++
的 优 势 为
Windows
开 发 开 辟 了 一 片 新 天 地 , 同 时 也 借 助
ApplicationWizzard
½开发者摆脱离了那些每次½必写基本代码,
借助
ClassWizard
和消息映
射½开发者摆脱了定义消息处理时那种混乱和冗长的代码段。
更令人兴奋的是利用
C++的封
装功½½开发者摆脱
Windows
中各种句柄的困扰,只需要面对
C++中的对象,这样一来½
开发更接近开发语言而远离系统。
(½我个人认为了解系统原理对开发很有帮助)
正因为
MFC
是建立在
C++的基础上,所以我强调 C/C++语言基础对开发的重要性。利用
C++的封装性开发者可以更容易理解和操½各种窗口对象;
利用
C++的派生性开发者可以减
少开发自定义窗口的时间和创造出可重用的代码;
利用虚拟性可以在必要时更½的控制窗口
的活动。而且
C++本身所具备的超越 C
语言的特性½可以½开发者编写出更易用,更灵活
的代码。
在
MFC
中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏
定义将消息分派到不同的成员½数进行处理。下面简单讲述一下这种方法的实现方法:
代码如下
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_COMMAND(ID_FONT_DROPDOWN, DoNothing)
END_MESSAGE_MAP()
经过编译后,代码被替换为如下½式(这只是½讲解,实际情况比这复杂得多)
:
//BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
CMainFrame::newWndProc(...)
{
switch(...)
{
//{{AFX_MSG_MAP(CMainFrame)
//
ON_WM_CREATE()
case(WM_CREATE):
OnCreate(...);
break;
//}}AFX_MSG_MAP
//
ON_COMMAND(ID_FONT_DROPDOWN, DoNothing)
case(WM_COMMAND):
if(HIWORD(wP)==ID_FONT_DROPDOWN)
{
DoNothing(...);
}
break;
//END_MESSAGE_MAP()
}
}
newWndProc
就是窗口过程只要是该类的实例生成的窗口½½用该窗口过程。
所以了解了
Windows
的消息机制在加上对消息映射的理解就很容易了解
MFC
开发的基本思
路了。
1.4
利用
MFC
进行开发的通用方法介绍
以下是我在最初学习
VC
时所常用的开发思路和方法,
希望½对初学
VC
的朋友有所帮助和
启发。
1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。
2、开发注重交互的简单应用程序可以½用对话框为基础的窗口,如果文件读写简单这可利
用
CFile
进行。
3、
开发注重交互并且文件读写复杂的的简单应用程序可以利用以
CFormView
为基础视的单
文档视结构。
4、利用对话框得到用户输入的数据,在等级提高后可½用就地输入。
5、
在对多文档要求不强烈时½量避免多文档视结构,
可以利用分隔条产生单文档多视结构。
6、在要求在多个文档间传递数据时½用多文档视结构。
7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功½的目的。
8、½量避免½用多文档多视结构。
9、不要½用多重继承并½量减少一个类中封装过多的功½。
1.5 MFC
中常用类,宏,½数介绍
常用类
CRect:用来表示矩½的类,拥有四个成员变量:top left bottom right。分别表是左上角和右
下角的坐标。可以通过以下的方法构造:
CRect( int l, int t, int r, int b );
指明四个坐标
CRect( const RECT& srcRect );
由
RECT
结构构造
CRect( LPCRECT lpSrcRect );
由
RECT
结构构造
CRect( POINT point, SIZE size );
有左上角坐标和尺寸构造
CRect( POINT topLeft, POINT bottomRight );
有两点坐标构造
下面介绍几个成员½数:
int Width( ) const;
得到½度
int Height( ) const;
得到高度
CSize Size( ) const;
得到尺寸
CPoint& TopLeft( );
得到左上角坐标
CPoint& BottomRight( );
得到右下角坐标
CPoint CenterPoint( ) const;
得½中心坐标
此外矩½可以和点(CPoint)相加进行½移,和另一个矩½相加得到“并”操½后的矩½。
CPoint:用来表示一个点的坐标,有两个成员变量:x y。
可以和另一个点相加。
CString:用来表示可变长度的字符串。½用 CString
可不指明内存大小,CString 会根据需要
自行分配。下面介绍几个成员½数:
GetLength
得到字符串长度
GetAt
得到指定½½处的字符
operator +
相½于
strcat
void Format( LPCTSTR lpszFormat, ... );
相½于
sprintf
Find
查找指定字符,字符串
Compare
比较
CompareNoCase
不区分大小写比较
MakeUpper
改为小写
MakeLower
改为大写
CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为 CString
对象的实例。
下面介绍几个成员½数:
Add
增加
CString
RemoveAt
删除指定½½
CString
对象
RemoveAll
删除数组中所有
CString
对象
GetAt
得到指定½½的
CString
对象
SetAt
修改指定½½的
CString
对象
InsertAt
在某一½½插入
CString
对象
常用宏
RGB
TRACE
ASSERT
VERIFY
常用½数
CWindApp* AfxGetApp();
HINSTANCE AfxGetInstanceHandle( );
HINSTANCE AfxGetResourceHandle( );
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于弹
出一个消息框
2.1
和
GUI
有关的各种对象
在
Windows
中有各种
GUI
对象(不要和
C++对象混淆)
,½½在进行绘图就需要利用
这些对象。而各种对象½拥有各种属性,下面分别讲述各种
GUI
对象和拥有的属性。
字½对象
CFont
用于输出文字时选用不同风格和大小的字½。
可选择的风格包括:
是否
为斜½,是否为粗½,字½名称,是否有下划线等。颜色和背景色不属于字½的属性。关于
如½创建和½用字½在
2.2
在窗口中输出文字中会详细讲解。
刷子
CBrush
对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它
的属性为颜色,是否采用½格和½格的类型如水平的,垂直的,交叉的等。½也可以利用
8*8
的½图来创建一个自定义模板的刷子,
在½用这种刷子填充时系统会利用½图逐步填充
区域。关于如½创建和½用刷子在
2.3
½用刷子,笔进行绘图中会详细讲解。
评论