孙鑫VC第四课学习笔记

孙鑫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有一个CDCCDC *pDc = GetDC()CWndReleaseDC()

CClientDC dc(this)

CWindowDC dc(this)

其中CClientDCCWindowDC的相同点就是在构造函数中会自动调用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()函数已经有了,但是对于xy还没有分配内存空间,肯定是不能成功的,当然,xy的初始化放在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(),那么也就没有必要在类外面对xy初始化,这不是绝对的。

 

7.         一些画图的基本知识

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值