孙鑫C++第四堂课要点
1、在MFC中,弹出的界面中,视图类覆盖框架类,所以试图对框架类的修改,在界面上看不见。
2、在MFC中,在不同类中建立相同响应函数,其中CView最先响应,其次是CMainFrame类,再次是CDoc类。
3、静态的方法不属于某个对象,而是属于类本身的,在调用之前,系统就已经给该方法存储起来。
1 #include "iostream" 2 Class Point 3 { 4 void output() {}; 5 static void init() {}; 6 }; 7 8 void main() 9 { 10 Point pt; 11 pt.output(); 12 pt.init(); //先定义一个对象,再调用函数,编译不会报错 13 14 Point::output(); //会报错,必须先声明一个对象 15 Point::init(); //不会报错,前面有static 16 }
#include<iostream.h>
class Point
{
public:
void output(){};
static void init()
{
/*
x=0;
y=0; 这里编译将会报错,原因是在静态函数中不能够引用非静态函数和变量,
*/
};
private:
int x,y;
};
void main()
{
Point::init();
Point::output(); //编译将会报错
}
3、一个字体的高度height=tmAscent+tmDescent,在结构体LPTEXTMETRIC可见。
4、MFC中消息处理机制称为消息映射,当消息(例如:OnLButtonDown())产生后,通常该消息是与一个窗口相关的,而系统已经建立起一个窗口的句柄与基类指针的映射,这样可以通过窗口的句柄找到C++中该窗口类对象的指针,利用该指针调用基类的WindowProc函数进行处理,WindowProc函数中调用OnWndMsg函数进行处理,而在OnWndMsg函数中,会判断你的消息种类,就会查找你的消息映射,查找你的消息映射主要通过两种方式,一是通过查找头文件的消息响应函数原型的声明,二是源文件中BEGIN_MESSAGE_MAP 与END_MESSAGE_MAP()之间的消息,从而最终找到消息响应函数。
5、MFC中将所有作图都封装在CDC(device context)类中,
//在OnLButtonUp响应函数中画出直线,其中m_pt为Cmfctest9View中声明一个CPoint的私有成员变量 void Cmfctest9View::OnLButtonUp(UINT nFlags, CPoint point) { //第一种方法: HDC hdc; hdc=::GetDC(m_hWnd); MoveToEx(hdc,m_pt.x,m_pt.y,NULL); LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc); //第二种方法 CDC *pDC=GetDC(); pDC->MoveTo(m_pt); pDC->LineTo(point); ReleaseDC(pDC); //第三种方法 CClientDC dc(this); //CClientDC包括了在构造的时候调用GetDC,而在析构的时候调用ReleaseDC,在这里想要获得父类(CMainFrame),用dc(GetParent()) dc.MoveTo(m_pt); dc.LineTo(point); //第四中方法 CWindowDC dc(this); //CWindowDC可以访问整个窗口区域 dc.MoveTo(m_pt); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }
6、注意SelectObject的用法:
CClientDc dc(this); CPen pen(PS_SOLID,1,RGB(255,0,0)); CPen *pOldPen=dc.SelectObject(&pen); //将已经构造的笔选入DC设备描述表中,返回一个旧的笔对象的指针 ......... dc.Selectobject(pOldPen); //重新将旧的笔选入设备描述表中,防止其他画图程序也用相同构造的笔(pen)
7、建立透明画刷的方法:GetStockObject()返回笔、画刷、字体的句柄,而将句柄转化为指向笔、画刷、字体对象的指针要用FromHandle()(静态函数),注意数据类型的转换
CClientDC dc(this); CBrush*brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//NULL_BRUSH为空画刷,FromHandle为静态函数 CBrush* pOldBrush=dc.SelectObject(brush); dc.Rectangle(CRect(m_pt,point)); dc.SelectObject(pOldBrush);