孙鑫VC第四课学习笔记
消息映射
1. VC中一个点的数据结构 CPoint
2. 消息响应函数:
如一个OnXXX()响应函数,在头文件中在注释宏之间有函数原型的声明
//{{AFX_MSG()
Afx void OnXXX
//}}AFX_MSG
其中afx表明是消息响应函数的声明。
在原文件中,有一个BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()
在这一对宏函数之间,会有消息和消息响应函数的关联宏函数,如On_XXX()。
消息映射的实现:在MFC中,某个窗口的句柄和相应的类的指针有一个对照表,当收到一个消息,通过句柄就可以找到响应的类的指针,我们将这个指针传递给基类,基类会调用一个函数WindowProc(),在WINCORE.CPP中,且是虚函数。这个函数里面调用了OnWndMsg(),真正的消息路由就由这个函数来完成,根据消息类型,然后就到派生类的头文件中,在DECLARE_MESSAGE_MAP()上面有没有消息响应函数的声明,然后在原文件中在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间有没有关联函数。
3. 一些DC的函数区别
一 使用windows API函数的::GetDC()和::ReleaseDC()
二 MFC有一个CDC类CDC *pDc = GetDC()和CWnd的ReleaseDC()
三 CClientDC dc(this)
四 CWindowDC dc(this)
其中CClientDC和CWindowDC的相同点就是在构造函数中会自动调用GetDC,在析构函数中会调用ReleaseDC,不同点就是一个面向各户区域,一个面向各户和非各户区域。
这边顺便讲到了如何获得windows桌面窗口的句柄,使用函数GetDesktopWindow()。
4. 线条的类型和颜色可以通过CPen构造函数来完成,可看MSDN。
一般无论是新的字体或者任何关于线条颜色等,都要将设定的新对象添加到设备描述表中,可以使用SelectObject()函数,它会返回原本的设备类型,即我们使用完毕,应该要恢复原来的设备描述表。
5. 如何创建位图,一般可以在资源中先添加一幅位图,然后调用函数。
CBitmap bitmap;
Bitmap.LoadBitmap(位图资料的ID);
6. C++中static的部分用途
Class Point
{
Public:
Void output()
{
}
Static void init()
{
}
};
Void main()
{
Point::output();//错误
Point::init();//正确
}
说明:类中的静态方法,它并不属于类的某个对象,而只是属于类本身,它在类加载的时候,已经给这个代码分配了代码区,也就是说它不属于某个具体的对象,因此可以这么调用,当然,非静态的方法是属于具体的对象的。
Class Point
{
Public:
Void output()
{
}
Static void init()
{
X = 0;
Y = 0;
}
Private:
Int x, y;
};
Void main()
{
Point::init();//错误
}
说明:在静态方法中调用非静态变量,在Point的对象没有产生之前,init()函数已经有了,但是对于x和y还没有分配内存空间,肯定是不能成功的,当然,x和y的初始化放在output()中肯定是可以的。
另外在非静态成员函数中调用静态函数也是可以的,反之是不可以的。静态成员函数只能访问静态成员变量。
Class Point
{
Public:
Void output()
{
}
Static void init()
{
X = 0;
Y = 0;
}
Private:
Static int x, y;
};
Void main()
{
Point::init();//错误
}
但这样还是有问题的,因为对于静态成员变量,必须在类的外面进行初始化,也就是在外面加上这么两句话:
Point::x = 0;
Point::y = 0;
当然了,如果你在main函数中没有调用Point::init(),那么也就没有必要在类外面对x和y初始化,这不是绝对的。
7. 一些画图的基本知识