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

  • 相关阅读:
    #翻译# 深入JavaScript的Unicode难题(上)
    深入 JavaScript(6)
    Angular service, 服务
    [译] 什么是移动友好的
    [译] 新手和老手都将受益的JavaScript小技巧
    Create XHR
    计算新浪Weibo消息长度
    SpringMVCDemo中,遇到的问题(四) 之分页功能
    为什么要用where 1=1?
    SpringMVCDemo中,遇到的问题(二)之mybatis中的mapper映射
  • 原文地址:https://www.cnblogs.com/lin1270/p/2302998.html
Copyright © 2020-2023  润新知