TCanvas中SaveDC和RestoreDC的用法

原创 2003年01月02日 09:15:00

                                TCanvas中SaveDC和RestoreDC 的用处

摘要:这篇文章展示如何正确地使用TCanvas中的SaveDC和RestoreDC.作者是Vyatcheslav Baranov.

    Windows的GDI函数“SaveDC“和”RestoreDC”可以储存和恢复设备场景状态(device context state)。可是TCanvas类并没有封装这两个函数。但是,这些函数对于恢复设备场景状态却又是非常必要的。例如, 调用IntersectClipRect函数而发生文章中剪切区域发生改变时。

问题
在TCanvas中使用SaveDC和RestoreDC有两个问题.

第一个问题是调用Restore后将造成设备场景状态与TCanvas状态不相符合。
第二个问题出现在WIN9X中.问题发生在调用SaveDC和RestoreDC函数时,当还没有删除SaveDC就在设备场景中选择了GDI对象(font,pen或brush). 这是WIN9X程序中一个普遍的缺点。

解决方案
解决第一个问题,就是在RestoreDC后调用TCanvas的Refresh函数。Refresh方法可以把设备场景转换回到默认状态(利用被选择的存储对象)并且将TCanvas设置成取消选定状态.因此,设备场景的真实状态和TCanvas状态会相互对应起来。

第二个问题的解决有一点困难.非常有必要将TCanvas的Handle属性值存放进一个附加的变量中,以便我们能调用TCanvas的Refresh方法。这时我们可以将这个附加变量作为DC参数调用SaveDC函数。

Refresh方法将把设备场景设置成默认状态。这个附加变量的使用可以将设备场景存入这个默认状态。

下面的代码演示了SaveDC和RestoreDC的一般用法:
HDC DC;
int SaveIndex;

DC = Canvas->Handle;
Canvas->Refresh ();
SaveIndex = SaveDC (DC);
 .
 . // 一些对TCanvas的调用 ...
 .
RestoreDC (DC, SaveIndex);
Canvas->Refresh ();
 .
 . // 一些对TCanvas的其他调用 ...

更多的信息可在以下站点找到:  http://www.mblab.by.ru/

SaveDC()和RestoreDC()

    补充一点保存设备描述表的内容。    在某些情况下,您可能想改变某些设备描述表属性,用改变后的属性进行绘图,然后恢复原来的设备描述表。要简化这一过程,可以通过如下调用来保存设备描述表的状态: ...
  • jinjingwen
  • jinjingwen
  • 2010年07月28日 10:30
  • 2837

Rect的合并 TCANVAS

var  DestRect,SrcRect:TRect;  i,TemW:Integer;begin  Result:=TBitmap.Create;  Result.Width:=0;  for i...
  • jiap1723
  • jiap1723
  • 2010年05月11日 16:47
  • 5920

Delphi 设备描述表 ;TCanvas...

设备描述表与TCanvas(Device Contexts and TCanvas) Windows使用术语设备描述表(device context,后面简称为DC)描述用户可在其上画图的画布。DC...
  • lailai186
  • lailai186
  • 2013年04月03日 11:15
  • 1250

WinAPI: DrawTextEx - 多功能文本绘制 Delphi需要把&替换成&&才可以

Delphi默认使用:DT_NOPREFIX   procedure TCanvas.TextRect(var Rect: TRect; var Text: string; ...
  • xiuzhentianting
  • xiuzhentianting
  • 2015年09月14日 18:50
  • 354

CClientDC CDC CPaintDC CWindowDC 的区别

一 CClientDC       CClientDC 派生于CDC 类        客户区设备上下文,其矩形区域为窗口整个客户区,客户区的左上角的坐标为(0,0),与特定的窗口相关联,...
  • xue_jiang_han2013
  • xue_jiang_han2013
  • 2014年07月04日 15:43
  • 776

【精心整理】【实用】visual C++中最常用的类与API函数

http://blog.csdn.net/poem_qianmo/article/details/7326776 ]这篇文章能让初学者快速了解visual C++ MFC中常见的核心的类与函...
  • zb872676223
  • zb872676223
  • 2014年08月16日 17:24
  • 423

SaveDC 和 RestoreDC

SaveDC (HDC hdc); 保存设备上下文栈上。 它的目的是,在不改变设备上下文的情况下,对HDC进行其它的操作, 当这些操作完成后,再对HDC进行恢复。 RestoreDC (HDC...
  • sdnumqy
  • sdnumqy
  • 2014年01月06日 15:51
  • 364

SaveDC与RestoreDC

以下内容摘自Windows程序设计一书 某些情况下,您可能想改变某些设备内容属性,用改变后的属性进行绘图,然后恢复原来的设备内容。要简化这一过程,可以通过如下调用来保存设备内容的状态: idSaved...
  • qq_25779555
  • qq_25779555
  • 2017年09月17日 15:02
  • 57

Windows API 功能详解

 Windows API 功能详解  1.API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络...
  • cqltbe131421
  • cqltbe131421
  • 2017年03月06日 11:42
  • 1466

TeamTalk源码分析之win-client

windows的程序的基本原理: 1. windows消息机制(消息如何产生、如何发送、如何处理,常见的消息有哪些、消息的优先级、如何自定义消息、窗体消息、常用控件消息) 2. gdi原理(要熟悉...
  • mao834099514
  • mao834099514
  • 2017年07月15日 14:40
  • 1012
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCanvas中SaveDC和RestoreDC的用法
举报原因:
原因补充:

(最多只允许输入30个字)