第4课 简单绘图

1.      MFC的消息映射机制:

在每个能接收和处理消息的类中,定义一个消息和消息函数对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针成对出现.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理该消息,则同样依照静态表很容易找到并调用对应的消息处理函数.

MFC消息映射机制是针对能接受消息和处理消息的类来定义对应的消息映射表,而不是由父类来定义所有消息对应的虚函数,由子类来覆盖其函数实现,因为这样做会使程序背着一个很大的虚拟函数表的包袱运行,对内存是一种浪费.

 

2,类的静态成员变量必须初始化

 

3,使用客户区绘图类一般用CClientDC,

要访问整个窗口区域,包括框架窗口客户区和非客户区,桌面等用CWindowDC

CWindowDC dc(GetDesktopWindow());//这个可以画到桌面上其它地方

 

4,在单文档中view挡在MainFrame的前面。此时如果编写针对MainFrame的mouseClick事件,将不会有反应。

 

5,.消息响应会在3处修改代码,1处是在头文件中,

//{{AFX_MSG(CDrawView)

afx_msg void OnLButtonDown(UINT nFlags,CPoint point);

afx_msg void OnLButtonUp(UINT nFlags,CPoint point);

afx_msg void OnMouseMove(UINT nFlags,CPoint point);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

另一处是cpp文件的begin MessageMap和End MessageMap之间,

BEGIN_MESSAGE_MAP(CDrawView, CView)

//{{AFX_MSG_MAP(CDrawView)

ON_WM_LBUTTONDOWN()

ON_WM_LBUTTONUP()

ON_WM_MOUSEMOVE()

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)

END_MESSAGE_MAP()

最后是要有函数实现的代码。

void CDrawView::OnLButtonDown(UINT nFlags,CPoint point)

{

// TOD Add your message handler code hereand/or call default

m_ptOrigin=m_ptOld=point;

m_bDraw=TRUE;

CView::OnLButtonDown(nFlags, point);

}

 

6.画线:定义一个成员变量保存mouseDown的点m_Point

 1)API函数方法画线用HDC

  2)用CDC类成员函数画线。此时别忘记ReleaseDC

  3)用CClientDC

  4)用CWindowDC,用它甚至可以整个屏幕区域画线。

下面是上面4种方法的代码

/*HDC hdc;

hdc=::GetDC(m_hWnd);

MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);

LineTo(hdc,point.x,point.y);

::ReleaseDC(m_hWnd,hdc);必须成对使用。*/

/*CDC *pDC=GetDC();

pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

ReleaseDC(pDC);必须成对使用。*/

//CClientDC dc(this);

/*CClientDC dc(GetParent());

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);此处不需要ReleaseDC,因为CClientDC会自动释放DC*/

//CWindowDC dc(this);

//CWindowDC dc(GetParent());

/*CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);*/

/*CPen pen(PS_DOT,1,RGB(0,255,0));

CClientDC dc(this);

CPen *pOldPen=dc.SelectObject(&pen);

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

dc.SelectObject(pOldPen);*/

  5)用Bitmap填充所画的矩形。

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);

CBrush brush(&bitmap);

CClientDC dc(this);

dc.FillRect(CRect(m_ptOrigin,point),&brush);

//CBRUSH::FromHandle是静态成员函数,所以可以用下面的方法调用。

CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

CBrush *pOldBrush=dc.SelectObject(pBrush);

dc.Rectangle(CRect(m_ptOrigin,point));

dc.SelectObject(pOldBrush);

m_bDraw=FALSE;

  6)用其它颜色画线

CClientDC dc(this);

CPen pen(PS_SOLID,1,RGB(255,0,0));

CPen *pOldPen=dc.SelectObject(&pen);//选中红色画笔

if(m_bDraw==TRUE)

{

 dc.SetROP2(R2_BLACK);//设置绘画模式

 dc.MoveTo(m_ptOrigin);

 //dc.LineTo(point);

 dc.LineTo(m_ptOld);

 //dc.MoveTo(m_ptOrigin);

 dc.MoveTo(m_ptOld);

 dc.LineTo(point);

 //m_ptOrigin=point;

 m_ptOld=point;

}

dc.SelectObject(pOldPen);

 

7.MFC中隐式的包含了windows.h。为什么?

因为在AFXV_W32.h文件中:

// This is a part of the MicrosoftFoundation Classes C++ library.

// Copyright (C) 1992-1998 MicrosoftCorporation

// All rights reserved.

在AFXWIN.h中

// Note: WINDOWS.H already included fromAFXV_W32.H

 

8.如何从句柄获得对象的指针?

答FromHandle

 

9.类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值