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)静态数据成员需要在类外单独做初始化,形式如: 变量类型 类名::变量名=初始值;
- CPaintDC和CClientDC又有什么区别?
- CPaintDC和CClientDC的区别
- CPaintDC和CClientDC的区别
- CPaintDC,CClientDC 区别
- CPaintDC\CClientDC\CWindowDC区别
- CClientDC和CPaintDC、CWindowsDC之间的联系和区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- 多态的区别
- android应用的签名
- ibatis in的使用
- 使用SQL除掉文本中特殊的ascll字符比如Enter,Tab,空格键
- Android系统的图标设计规范 icon 大小
- CPaintDC和CClientDC又有什么区别?
- 动态申请二维数组
- 函数的声明和定义
- 排序
- 计算最大值最小值
- 多视的情况下如何在视之间传递数据?MFC的做法是利用文档来处理
- HUAWEI E5776 | LTE 4G E5776 Mobile Hotspot router
- SQL*Loader使用方法
- OnDraw()和OnPaint()好象兄弟俩