使用方法:

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. AI新基建如何构建?浪潮给出了一个答案
  2. php 正则教程,最通俗易懂的php正则表达式教程(上)
  3. python安装cv-oracle时如何解决vc++的问题_python中cx_Oracle模块安装遇到的问题与解决方法...
  4. python检测变量是否有定义(即使用前检查是否定义好)
  5. 兼顾FPGA和单片机
  6. 2011阿里巴巴程序设计公开赛 / 1002 Fruit Ninja
  7. “Abp.AbpBootstrapper – System.MissingMethodException: Method not found: Void Abp.Configuration.Setti
  8. Java EE开发 十大官方参考书手册
  9. 同济线性代数教材(第五版)-第2章 矩阵及其运算
  10. 饿了么Redis Cluster集群化演进
  11. 海报看起来很普通?数字平原概念设计来制作
  12. Unity Shader 常规光照模型代码整理
  13. python程序的三种控制结构_python二级考试大纲内容:程序的三种控制结构
  14. 使用OpenCV实现Halcon算法(1)亚像素提取边缘,Sub-Pixel Edge Detector
  15. 我为什么反对提“全栈工程师”?
  16. GridView数据库分页+自定义分页导航(二):自定义分页导航。首页、上一页、下一页、尾页和跳转
  17. 图像采集及传输速率计算
  18. 发动机压缩比怎么计算公式_怎么知道汽车压缩比
  19. pytest—pytest.mark.parametrize的使用
  20. 广州数控广数cnc数据采集入门一

热门文章

  1. python随机生成正态分布_正态分布数据随机生成
  2. mysql-connector-java 到底有什么用
  3. 数商云SRM供应商系统询比价采购业务流程介绍,重塑汽修企业核心竞争力
  4. Vue | Vue.js 组件化基础 - 脚手架
  5. #0/1分数规划,SPFA,负环#洛谷 1768 天路
  6. plc和单片机及c语言区别,PLC与单片机的区别是什么?
  7. 呼叫中心系统话务功能模块
  8. 基于双目视觉的三维重建C++实战
  9. 微型计算机的基本组成电路,微型计算机的基本组成电路.ppt
  10. CSS基础属性:width/height