SaveDC 和 RestoreDC

SaveDC (HDC hdc);
保存设备上下文栈上。
它的目的是,在不改变设备上下文的情况下,对HDC进行其它的操作,
当这些操作完成后,再对HDC进行恢复。
RestoreDC (HDC hdc, int id) 则是从设备上下文栈中对HDC进行恢复。

典型的用法是:


void
Graphics::
Draw (HDC hdc) {
SaveDC (hdc);

TextOut (hdc, ....);
/** do more things */

RestoreDC (hdc, -1);
}

如上函数,在进入Draw函数中时进行SaveDC, 退出时RestoreDC。
这样,不论外面怎么调用Draw函数,它总能保证不改变调用Draw函数
前的设备上下文。

如:
HDC hdc = GetDC ();
SelectObject (hdc, GetStockObject (BLACK_BRUSH)); // 选个黑画刷
Graphics gr;

gr.Draw (hdc); // 先对gr进行一次画操作

// 我们要保证的是,gr.Draw (hdc)不会改变hdc,这样先前的SelectObject
// 才有效,否则,如果在Graphics::Draw()函数中进行了一次或多次SelectObject时,
// 效果就会难以预料。
FillRect (hdc, 0, 0, 100, 100); // 使用 BLACK_BRUSH进行填充矩形。

ReleaseDC (hdc);

 

 

这就是 SaveDC 和 RestoreDC 的作用。这个和汇编中参数的压栈、弹栈是类似的。

 

------ 补充 ------

--------- SaveDC 和 RestoreDC 的用法 -----

int SaveDC (HDC hdc); 它返回一个标识符,必定是一个正值。

BOOL RestoreDC (HDC hdc, int id); 参数id是已保存的ID值,即为SaveDC的返回值。所以有此用法:

--

int id = SaveDC (hdc);

/*** do something */

RestoreDC (hdc, id);

 

---- 另一种用法。。很多人不愿意使用一个ID变量,在RestoreDC中可以把ID参数设为-1,表示恢复最近保存的HDC。

SaveDC (hdc);

/** ... */

RestoreDC (hdc, -1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值