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);

posted @ 2011-12-27 09:21  夜雨無聲  阅读(3610)  评论(0编辑  收藏  举报