孙鑫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);

  

posted @ 2014-10-01 14:17  龙泽一狼  阅读(122)  评论(0编辑  收藏  举报