使用方法:

BeginPaint

hdc = BeginPaint (hwnd, &ps);

// 使用GDI函数

EndPaint (hwnd, &ps);

GetDC

hdc = GetDC (hwnd);

// 使用GDI函数

ReleaseDC (hwnd, hdc);

作用:

BeginPaint

1. 擦除无效区背景,使无效区变有效;(如果没有无效区,则不需要擦除任何区域背景,也不需要重绘任何区域)

2. 将ps字段填好(即填好字段:hdc、fErase和rcPaint。其中fErase在大多数情况下都被标志为FALSE,rcPaint为无效矩形的边界。)

GetDC

1. 获得窗口显示区域的设备内容句柄。

相同点:

1.  这两种都是Windows应用程序用来取得设备内容句柄的,以便在屏幕上绘图。

2. 两者都需要配对使用,BeginPaint和EndPaint配;GetDC和ReleaseDC配。同时,都需要在同一条消息处理过程中配对使用。不可以在一个消息中BeginPaint,在另一个消息中EndPaint。

区别:

1. 传回的虽然都是hdc但此hdc非彼hdc。BeginPaint传回的hdc是无效区域。GetDC传回的hdc等于整个显示区域。

2. BeginPaint会使无效区域变为有效区域,但GetDC不会。也就是说,如果GetDC不告诉Windows,我已经重绘过了,我有效了,他的无效区域就会一直都在,系统会不停的发送WM_PAINT消息,进行不停的重绘,显示上就会不停的闪烁。

下面举例来使用这两个函数,顺带说明一下InvalidateRect和ValidateRect在其中的使用。

case WM_PAINT:

// InvalidateRect(hWnd, NULL, TRUE);
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
RECT rect;
GetClientRect(hWnd,&rect);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(255,255,0));
//SetBkMode(hdc,OPAQUE);
DrawText(hdc,_T("My first try for the hard program"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd, &ps);
break;

BeginPaint传回的hdc只指向无效区,如果要更新系统自动识别的无效矩形以外的区域,在BeginPaint之前加一句InvalidateRect(hWnd, NULL, TRUE);即可,它将整个窗口显示区域都置为无效。例如,如果窗口显示区域画了一个圆,其中一部分被遮挡住了变为无效,要只画那无效矩形那一部分的圆会比较困难,你会想画整个的,这种时候就整体设为无效即可。

case WM_PAINT:

hdc = GetDC(hWnd);
// TODO: 在此添加任意绘图代码...
RECT rect;
GetClientRect(hWnd,&rect);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(255,255,0));
//SetBkMode(hdc,OPAQUE);
DrawText(hdc,_T("My first try for the hard program"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWnd,hdc);
ValidateRect(hWnd,NULL);
break;

因为GetDC不会将无效区域变为有效,则字体会不停的闪,加上ValidateRect(hWnd,NULL);就是告诉系统整个区域有效了。就不会再一直向系统发送WM_PAINT消息。也就不会一直重绘了,避免了闪烁。

不过在处理WM_PAINT时都会用BeginPaint,这里只是举例说明GetDC的用法。


既然有了BeginPaint为什么还会出现GetDC呢?

下面是《Windows程序设计》中的一段话,我觉得揭示了这个原因。

“虽然最好是在处理WM_PAINT消息处理期间更新整个显示区域,但您也会发现在处理非WM_PAINT消息处理期间绘制显示区域的某个部分也是非常有用的。或者您需要将设备内容句柄用于其它目的,如取得设备内容的信息。

PS: 下面这段是前辈们总结的,记。

1. 因为BeginPaint和EndPaint用到的设备描述符只会在当前的无效区域内绘画,在有效区域内的绘画会自动被过滤,大家都知道,WIN GDI的绘画速度是比较慢的,所以能节省一个象素就节省一个,不用吝啬,这样可以有效加快绘画速度。

2. 无效区域是可以被累加的,当队列中其他消息都被带走时,只剩下WM_PAINT 消息时,无效区域统一重绘。

BeginPaint和GetDC相关推荐

  1. BeginPaint和GetDC有什么区别?【转】

    转自:http://hi.baidu.com/d_b_mike/blog/item/ec8820d0fb9127d5572c84a9.html 这是个windows编程问题. 第一种情况显示出来的字很 ...

  2. VC绘制位图--BeginPaint()与GetDC()的区别

    //======================================================================== //TITLE: //    EVC绘制位图--B ...

  3. BeginPaint和GetDC有什么区别

    windows编程问题 第一种情况显示出来的字很正常. case WM_PAINT: gdc = BeginPaint (hwnd, &ps); TextOut (gdc, 0, 0, s, ...

  4. BeginPaint和GetDC的区别

    BeginPaint和GetDC的区别 代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Gr ...

  5. Beginpaint 与 GetDC 的区别

    InvalidateRect是一个函数,该函数向指定的窗体更新区域添加一个矩形,然后窗体跟新区域的这一部分将被重新绘制. BeginPaint.EndPaint是比较"被动"的,只 ...

  6. Win32中BeginPaint和GetDC的使用

    这是正确的方式,重要的事情说三遍 WM_PAINT: {...hdc = BeginPaint(hWnd, &ps);//hdc = GetDC(hWnd); ... } 1.单独使用GetD ...

  7. 可视化GDI操作题目

    1.GDI是什么的英文缩写? Graphics Device Interface 2.什么是设备的无关性? 操作系统屏蔽了硬件设备的差异 3.GDI的主要任务是什么?起到什么样的作用? 主要任务:负责 ...

  8. 原创]Windows Gdi入门初级应用(VC SDK)

    原创]Windows Gdi入门初级应用(VC SDK) 好久没发贴了,今天手痒痒,发一个. GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄. 这个HDC的获得有几个途径Be ...

  9. Windows的图形设备接口(GDI)入门 上篇

    Windows图形设备接口(GDI)是为与设备无关的图形设计的.所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,使用户编程时无需考虑特殊的硬件设置. 我们利用GDI所提供的众多函数就可以方便的在屏 ...

最新文章

  1. 快速傅里叶变换(FFT)算法【详解】
  2. Android应用优化方案
  3. 计算机二级试题库office选择题,全国计算机二级MSoffice选择题题库2017
  4. 【火爆全网,好评如潮】DS100手持示波器现货发售拉,附原子哥发布会详细讲解视频以及宣传视频...
  5. python 异常处理模块_扩展Python模块系列(五)----异常和错误处理
  6. python数据显示为什么只能显示最后一个变量,Python变量和简单数据类型,之,的
  7. 如何从0到1搭建物联网系统?
  8. python解析器是什么_如何用python写一个简单的词法分析器
  9. MyBatis Invalid bound statement (not found)问题 -- 记一次与空气的斗智斗勇
  10. html和css的缺点,个人缺点20个
  11. 初识 Vue(10)---(计算属性的 setter 和 getter)
  12. python免费课程400节-庆国庆!新更新!《Python400集》课程更新 共14节
  13. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用19
  14. CSDN下载码如何使用?
  15. 2019年中国研究生数学建模大赛的经验分享
  16. 创建google账号收费_谷歌GMS认证收费标准
  17. DataWhale_Pandas Task08 文本数据
  18. JSTree的基本用法
  19. Javaweb入职第二天
  20. TT语音:游戏社交乱象难平

热门文章

  1. Cty的Linux学习笔记(一)
  2. Python数据清洗:数据框列名大小写转换
  3. 招聘 | 上班轰趴,下班狼人杀,天天招人,怕是要发!
  4. certbot 常用的命令
  5. Apache+Tomcat+mod_jk配置教程
  6. 【工作日志】elementUI学习-Layout布局
  7. PMBOK(第六版) 学习笔记 ——《第十章 项目沟通管理》
  8. 【转载】Go语言:操作Windows注册表
  9. 【呼叫中心KPI解析】8、系统话务量
  10. MySQL高可用双活方案