Dr.Wing

心翼的技术笔记本

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

①   框架类MainFrame中的窗口,是在视图类View类的后面。即是说View类像墙纸一样覆盖在MainFrame的上面。

②   OnWndMsg()函数是真正完成消息映射的处理工作,利用函数中的很多if来处理。

③   画图中的画线操作中,可以用MoveToEx()和LineTo()结合;或者用MoveTo()和LineTo()结合。其中MoveToEx()和MoveTo()是定位起点,LineTo()是画线所在的终点位置。确定了两个点既能画线了。

④   同窗口有关的,都继承于CWnd类中,同作图相关的都在CDC类中。

⑤   加了::符号的函数是全局函数,没加的编译器就会默认为当前类中的成员函数。

⑥   GetDC()这个函数的返回值是CDC这个类的一个指针。

⑦   选入设备描述表SelectObject()函数

⑧   静态成员(方法)不属于任何对象,它直接属于一个类,在一开始就已经被定义了。非静态的属于具体的对象,需要且必须要初始化(即是定义一个对象)。静态的调用方法是”类名::方法”

消息映射机制:

一、在头文件(.h)中定义了一个afx_msg_xxxx函数

二、在源文件(.cpp)中的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中需要包含ON_WM_XXXX消息

三、然后在源文件(.cpp)中,写这个消息相应函数的相应代码


画线//--------------------------------------------------------------------------------------------------------------------------------------

需要预先定义一个CPoint类对象,m_Old用来存储起点的位置,注意要在构造函数中,初始化它为0

全局SDK绘制代码如下:

1 HDC hdc;
2 hdc=::GetDC(m_hWnd);
3
4 MoveToEx(hdc,m_Old.x,m_Old.y,NULL);
5
6 LineTo(hdc,point.x,point.y);
7
8 ::ReleaseDC(m_hWnd,hdc);

CDC类方法绘制代码如下,注意,定义了一个CDC类的指针,然后利用CWnd类的成员函数GetDC( )来获取当前窗体设备描述表对象的指针

1     CDC *pDC=GetDC();    //获取设备描述表指针
2 pDC->MoveTo(m_Old);
3 pDC->LineTo(point);
4 ReleaseDC(pDC); //有DC的地方,一定要ReleaseDC

一般性的绘制线条的语句是如下:

 1     CPen pen(PS_SOLID,3,RGB(80,79,123));
2
3 CClientDC dc(this);
4
5 CPen *pPen=dc.SelectObject(&pen);
6
7 dc.MoveTo(m_Old);
8 dc.LineTo(point);
9
10 dc.SelectObject(pPen)

要注意,首先我们用CClientDC来获取DC,其中,选入设备描述表的语句,是通过传递的是指针,这里要明确!

另外,在MSDN上,我们看到

CPen( int nPenStyle, int nWidth, COLORREF crColor );

这里是CPen类函数的一些定义方式,于是在程序中,我们可以直接定义

CPen pen(PS_SOLID,3,RGB(80,79,123));

另外有一个绘制的问题,俩函数

1 CClientDC dc(this);
2 CPen *pPen=dc.SelectObject(&pen);
3 dc.Rectangle(CRect(m_Old,point));

首先是Rectangel函数,里面调用CRect函数绘制了这个矩形的左上角和右下角的点

另外FillRect这个函数是填充一个矩形区域,用法如下:

1 CBrush brs(HS_DIAGCROSS, RGB(0, 255, 0));
2 CClientDC dc(this);
3 dc.FillRect(CRect(m_Old,point),&brs);

注意是用画刷来填充

//--------------------------------------------------------------------------------------------------------------------

本章一个难点在于“透明矩形的绘制”,代码如下:

1 CClientDC dc(this);
2 CBrush *pBrs=CBrush::FromHandle((HBRUSH)GetStockObject(HOLLOW_BRUSH));
3 CBrush *pNowBrs=dc.SelectObject(pBrs);
4 dc.Rectangle(CRect(m_Old,point));
5 dc.SelectObject(pBrs);
FromHandle这个函数,就是把返回的句柄,转换为指针对象,CSDN下面如此解释:
CBrush::FromHandle
static CBrush* PASCAL FromHandle( HBRUSH hBrush );

Return Value

A pointer to a CBrush object if successful; otherwise NULL.

还要注意它是CBrush类的static函数,所以访问方式用CBrush::FromHandle,就是说,带个::符号,这是静态成员函数的访问方式

当然了,FromHandle函数并不是CBrush类的专利,如下图:

posted on 2011-07-10 00:52  心翼  阅读(196)  评论(0编辑  收藏  举报