目录

【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()相关推荐

  1. MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)

    MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...

  2. MFC基本图形的绘制(一)设备环境类CDC、画笔和画刷

    Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点.线.多边形.位图以及文本输出等.MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印. 概述 Vi ...

  3. MFC——画笔和画刷

    MFC--画笔和画刷 一.画笔 1.创建画笔对象 MFC 中可以使用CPen创建画笔对象,其构造函数如下: CPen(int nPenStyle, //指定画笔样式int nWidth, //指定画笔 ...

  4. 五、C语言创建桌面程序:画笔和画刷

    一.画笔画刷的概念 画笔和画刷都用来在画布上绘图.画布就是用来绘画的一块背景,可以有颜色,也可以没有,也可以有图案(比如条纹.网格等):画布可以理解为我们平时作图时使用的纸. 画笔用来画线,可以是封闭 ...

  5. CSharp代码示例每日一讲: 在GDI+中使用画笔和画刷

    CSharp代码示例每日一讲,为刚刚学习编程的人准备,利用最简单的代码介绍CSharp编程知识! 画笔和画刷是图形应用中最常用的两种对象.笔用于绘制图形对象的轮廓,如线条和曲线;刷子是用来填充图形对象 ...

  6. Windows程序设计--画笔和画刷

    画笔和画刷是重要的GDI对象,因为不管你画什么图形都需要画笔和画刷,虽然多数情况下是系统默认的. Windows提供的三种备用画笔(stock pen) 白色画笔:WHITE_PEN 黑色画笔:BLA ...

  7. win32 7.2 绘制图形 画笔和画刷

    "画笔和画刷"的介绍: GDI 中的绘画函数有 3 大类:画点.画线和画填充区域.对于photoshop之类的,一定知道,画线需要画笔,画填充区域需要画刷. GDI 同样也有画刷画 ...

  8. 卷二:图形编程MFC第1篇:画笔、画刷、

    1.MFC文件创建:(1)创建基于对话框的项目,可以直接拖组件: (2)创建单个文档的项目,所有的时间自己编写. 2.常用画图对象学习 (1)画线:①项目->类向导->选择view类-&g ...

  9. 画笔和画刷的种类和使用方法

    画笔的使用和上一章的字体类似,首先用CreatePen()函数创建一个画笔对象,然后与设备文本绑定,同时得到旧的画笔.用完后删除新画笔,并且恢复旧画笔.画笔的种类有7种,参照下表及下面的例子. 值 说 ...

最新文章

  1. 算法--------旋转数组
  2. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
  3. AtCoder Beginner Contest 131 F - Must Be Rectangular!
  4. AWS Loft的数据库周
  5. EbN0、SNR、0.1nmOSNR的区别与联系
  6. 安卓逆向_14 --- 单机和弱联网游戏内购 突破口 和 思路
  7. p沟道mos管导通条件_打开知识大门的捷径!MOS管基本认识
  8. 在线笔记存代码_李宏毅《机器学习》完整版笔记发布
  9. 当前用户更改运行方式出现错误的解决办法
  10. 《算法新解》读记(一)
  11. Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
  12. linux抓包UDP流量
  13. python识别图片中的文字、数值并转文档
  14. 哪个牌子的投影仪更好?哪个品牌投影仪好
  15. 【人脸属性分类】Deep Multi-task Multi-label CNN for Effective Facial Attribute Classification(FAC)
  16. 文件系统错误(-1073740791)解决办法
  17. MATLAB R2018a简介
  18. 如何让收到的邮件附件自动储存在Sharepoint里
  19. C语言实验室内部培训讲义
  20. Vegas的安装激活教程

热门文章

  1. 刷脸支付比以前的支付技术确实安全不少
  2. 【LeetCode题解】BFS层序遍历二叉树
  3. Imatest 学习:Sharpness
  4. js创建数组的四种方法、常用方法、属性
  5. 西北工业大学NOJ(C语言)(更新中)
  6. cad文件不大但是打开特别卡怎么解决?cad保存卡死的方法
  7. android 原生音量条
  8. Java 零钱通项目
  9. mvn java home_Maven中的Java_home
  10. 《大学英语(四)》在线平时作业1