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