CPaintDC和CClientDC又有什么区别?

来源:互联网 发布:产品网络推广 编辑:程序博客网 时间:2024/04/30 17:13

1) 在mfc结构里OnPaint是CWnd的成员函数. OnDraw是CView的成员函数.
2) OnPaint()调用OnDraw(),OnPrint也会调用OnDraw(),所以OnDraw()是显示和打印的共同操作。
OnPaint是WM_PAINT消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。 OnPaint中首先构造一个CPaintDC类得实例,然后以这个实例为参数来调用虚函数OnPreapreDC来进行一些绘制前的一些处理,比如设置映射模式,最后调用OnDraw。
而OnDraw和OnPreapreDC不是消息处理函数。所以不是因为重绘消息所引发的。OnPaint导致OnDraw被调用时,比如在OnLButtonDown等消息处理函数中绘图时,要先自己调用OnPreapreDC。
至于CPaintDC和CClientDC根本是两回事情。CPaintDC是一个设备环境类,在OnPaint中作为参数传递给OnPreapreDC 来作设备环境的设置。真正和CClientDC具有可比性的是CWindowDC,它们一个是描述客户区域,一个是描述整个屏幕。
如果是对CView或从CView类派生的窗口绘图时应该用OnDraw()。

二、       绘图DC的获取

 

说明:在View类添加WM_LBUTTONDOWN和WM_LBUTTONUP的消息处理函数,我们将用来演示各种DC的获取,以及显示效果。

 

View类添加全局变量CPoint m_ptOrigin用来存储左键按下点坐标。下面集中来关注OnLButtonUp中的绘图程序和效果。

 

以下语句添加于OnLButtonUp函数中,可以查看不同的效果。

 

1,使用SDK获取DC句柄:

 

HDC hdc;

hdc=::GetDc(m_hWnd);//获取DC句柄

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

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

::ReleaseDC(m_hWnd,hdc);//释放DC

 

2,利用CDC类指针和CWin类成员函数获取DC。

 

CDC *pDC=GetDC();

pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

ReleaseDC(pDC);

 

3,利用CClientDC对象。(CClientDC类从CDC类派生来的)

 

CClientDC dc(this);

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

 

4,利用CWindowDC对象。(CWindowDC类从CDC类派生来的)

CWindowDC dc(this);//

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

5,父窗口(MainFrame框架)和屏幕指针。

将上面的dc(this)分别改成GetParent()和GetDesktopWindow(),就可以得到父窗口指针和屏幕窗口指针。

可以分别试验画线效果。

 

6,利用画笔改变线条颜色和类型:

CPen pen(PS_DOT,1,RGB(0,255,0));//构造画笔对象

CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);//将画笔选入DC

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

dc.SelectObject(pOldPen);//恢复先前的画笔

 

7,使用画刷(通常利用画刷去填充矩形区域):

使用单色画刷

CBrush brush(RGB(255,0,0));//构造画刷对象

CClientDC dc(this);

dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的画刷去填充矩形区域

 

使用位图画刷

CBitmap bitmap;//构造位图对象(使用前需要初试化)

bitmap.LoadBitmap(IDB_BITMAP1);//初试化位图对象

CBrush brush(&bitmap);//构造位图画刷

CClientDC dc(this);

dc.FillRect(CRect(m_ptOrigin,point),&brush);//用指定的位图画刷去填充矩形区域

 

使用透明画刷

CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//获取透明画刷对象指针

CClientDC dc(this);

CBrush *pOldBrush=dc.SelectObject(pBrush);//将透明画刷选入DC

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

dc.SelectObject(pOldBrush);//释放透明画刷

8,注意点:

 

1)静态方法不属于某一个具体对象,而属于类本身,在类加载的时候就已经为类静态方法分配了代码去,故可用CBrush::FromHandle()形式调用。

2)静态方法中,不能引用非静态的数据成员和方法。

3)静态数据成员需要在类外单独做初始化,形式如: 变量类型 类名::变量名=初始值;

分享到: 
  • 上一篇:MFC view类dc的获得
  • 下一篇:openCV中文网站

  • 原创粉丝点击