【VC++ MFC】vc 画笔和画刷|OnDraw()和OnPaint()
目录
【VC++ MFC】vc 画笔和画刷
【VC++ MFC】OnDraw()和OnPaint()
【VC++ MFC】vc 画笔和画刷
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);//释放透明画刷
说明:
The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes.
HGDIOBJ GetStockObject(
int fnObject // type of stock object
);
Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.
static CBrush* PASCAL FromHandle( HBRUSH hBrush );//FromHandle是一个静态方法,故可用CBrush::FromHandle()形式调用。
转自:vc 画笔和画刷(转载) - zhixing - 博客园
【VC++ MFC】OnDraw()和OnPaint()
1、2012-08-18 15:30:54
OnPaint()是消息响应函数,默认是WM_PAINT消息的入口.
OnDraw()是虚函数,是被OnPaint( )调用的函数
OnPaint( )优先于OnDraw( ),如果重载了OnPaint( ),则不会影响OnDraw( ).如果需要,則需明确调用OnDraw( )函数.
当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或OnPaint()来重画窗口。
OnDraw()和OnPaint()的区别:
CView类派生自CWnd类,而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能(所以一般都是由OnPaint()调用OnDraw()?)。
当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint处理成员函数。
///CView默认的标准的重画函数
void CView::OnPaint()
{
CPaintDC dc(this);
OnPreparDC(&dc);
OnDraw(&dc); //调用了OnDraw
}
///
在MFC程序设计中,按照传统的设计,如果处理WM_PAINT消息,一般会派生一个OnPaint函数,映射到WM_PAINT消息上进行绘图处理。但是很多程序中并没有出现OnPaint,一个OnDraw函数做了更多的绘图操作。而在消息映射的列表中,也没有见到WM_PAINT到OnDraw的映射。
实际上,OnDraw不是OnPaint的映射,出现OnDraw,是为了实现各种不同的设备上的绘图一致性。
首先,读者需要明白的是,WM_PAINT消息是为了绘制屏幕而出现的,因此,在OnPaint中,我们只能存取屏幕DC,进行绘制,常见的代码是:
void MyWnd::OnPaint()
{
CPaintDC dc(this);
//draw code here
}
这里的CPaintDC的构造函数会自动调用BeginPaint,获得一个屏幕DC,并附加在dc对象上。当dc对象析构时,系统自动调用EndPaint并使invalidatedrectangle变成validated状态,从而结束绘制。(注意,重复创建CPaintDC实例会失败也因为如此)
如果我们在OnPaint中绘制,那么在打印机上绘制我们就需要再写一个OnPrint函数,重新绘制。这样,程序设计者就需要维护两套代码。为了简化操作,MFC框架把大部分绘制操作都放在OnDraw中,OnPaint和OnPrint只构造相应的DC,然后分别调用OnDraw.也就是说,OnDraw适用于所有的设备,而OnPaint只适用于屏幕。
大家在设计过程中必须注意:OnDraw是被基类的OnPaint主动调用的,如果你继承了
OnPaint,你应该要么调用基类的OnPaint(此前不得创建CPaintDC实例,也不得调用BeginPaint),要么1\自己创建CPaintDC实例,2\并调用OnDraw.
既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序
///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
void CMyView::OnDraw( CDC* pDC )
{
CMyDoc* pDoc = GetDocument();
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect( &rect );
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength());
}
补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口:OnPaint和OnDraw的区别_tracing的博客-CSDN博客_onpaint和ondraw
【VC++ MFC】vc 画笔和画刷|OnDraw()和OnPaint()相关推荐
- MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)
MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...
- MFC基本图形的绘制(一)设备环境类CDC、画笔和画刷
Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点.线.多边形.位图以及文本输出等.MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印. 概述 Vi ...
- MFC——画笔和画刷
MFC--画笔和画刷 一.画笔 1.创建画笔对象 MFC 中可以使用CPen创建画笔对象,其构造函数如下: CPen(int nPenStyle, //指定画笔样式int nWidth, //指定画笔 ...
- 五、C语言创建桌面程序:画笔和画刷
一.画笔画刷的概念 画笔和画刷都用来在画布上绘图.画布就是用来绘画的一块背景,可以有颜色,也可以没有,也可以有图案(比如条纹.网格等):画布可以理解为我们平时作图时使用的纸. 画笔用来画线,可以是封闭 ...
- CSharp代码示例每日一讲: 在GDI+中使用画笔和画刷
CSharp代码示例每日一讲,为刚刚学习编程的人准备,利用最简单的代码介绍CSharp编程知识! 画笔和画刷是图形应用中最常用的两种对象.笔用于绘制图形对象的轮廓,如线条和曲线;刷子是用来填充图形对象 ...
- Windows程序设计--画笔和画刷
画笔和画刷是重要的GDI对象,因为不管你画什么图形都需要画笔和画刷,虽然多数情况下是系统默认的. Windows提供的三种备用画笔(stock pen) 白色画笔:WHITE_PEN 黑色画笔:BLA ...
- win32 7.2 绘制图形 画笔和画刷
"画笔和画刷"的介绍: GDI 中的绘画函数有 3 大类:画点.画线和画填充区域.对于photoshop之类的,一定知道,画线需要画笔,画填充区域需要画刷. GDI 同样也有画刷画 ...
- 卷二:图形编程MFC第1篇:画笔、画刷、
1.MFC文件创建:(1)创建基于对话框的项目,可以直接拖组件: (2)创建单个文档的项目,所有的时间自己编写. 2.常用画图对象学习 (1)画线:①项目->类向导->选择view类-&g ...
- 画笔和画刷的种类和使用方法
画笔的使用和上一章的字体类似,首先用CreatePen()函数创建一个画笔对象,然后与设备文本绑定,同时得到旧的画笔.用完后删除新画笔,并且恢复旧画笔.画笔的种类有7种,参照下表及下面的例子. 值 说 ...
最新文章
- 算法--------旋转数组
- 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
- AtCoder Beginner Contest 131 F - Must Be Rectangular!
- AWS Loft的数据库周
- EbN0、SNR、0.1nmOSNR的区别与联系
- 安卓逆向_14 --- 单机和弱联网游戏内购 突破口 和 思路
- p沟道mos管导通条件_打开知识大门的捷径!MOS管基本认识
- 在线笔记存代码_李宏毅《机器学习》完整版笔记发布
- 当前用户更改运行方式出现错误的解决办法
- 《算法新解》读记(一)
- Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
- linux抓包UDP流量
- python识别图片中的文字、数值并转文档
- 哪个牌子的投影仪更好?哪个品牌投影仪好
- 【人脸属性分类】Deep Multi-task Multi-label CNN for Effective Facial Attribute Classification(FAC)
- 文件系统错误(-1073740791)解决办法
- MATLAB R2018a简介
- 如何让收到的邮件附件自动储存在Sharepoint里
- C语言实验室内部培训讲义
- Vegas的安装激活教程