• [Programming Visual C++]Chapter Five The Lifetime of a GDI Selection


    pDC->SelectObject返回的指针所指向的GDI对象有可能会被delete掉,所以不能只保存返回的指针。
    正确的做法:convert the return pointer to Windows Handle with the GetSafeHdc member function.

    For other device contexts, such as those for printers and memory buffers, your assignments can last longer. For these long-life device contexts, things get a little more complicated. The complexity results from the temporary nature of GDI C++ object pointers returned by the SelectObject function. (The temporary "object" will be destroyed by the application framework during the idle loop processing of the application, sometime after the handler function returns the call. See MFC Technical Note #3 in the online documentation.) You can't simply store the pointer in a class data member; instead, you must convert it to a Windows handle (the only permanent GDI identifier) with the GetSafeHdc member function. Here's an example:

    // m_pPrintFont points to a CFont object created in CMyView's constructor
    // m_hOldFont is a CMyView data member of type HFONT, initialized to 0

    void CMyView::SwitchToCourier(CDC* pDC)
    {
    m_pPrintFont->CreateFont(30, 10, 0, 0, 400, FALSE, FALSE,
    0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_MODERN,
    "Courier New"); // TrueType
    CFont* pOldFont = pDC->SelectObject(m_pPrintFont);

    // m_hOldFont is the CGdiObject public data member that stores
    // the handle
    m_hOldFont = (HFONT) pOldFont->GetSafeHandle();
    }

    void CMyView:SwitchToOriginalFont(CDC* pDC)
    {
    // FromHandle is a static member function that returns an
    // object pointer
    if (m_hOldFont) {
    pDC->SelectObject(CFont::FromHandle(m_hOldFont));
    }
    }

    // m_pPrintFont is deleted in the CMyView destructor

  • 相关阅读:
    自定义控制器的View(loadView)及其注意点
    多控制器之UIWindow
    多控制器之UIApplication
    浅谈Xcode5和Xcode7在系统创建的文件夹和文件中的区别
    自动计算label字体的高度和图片拉伸处理(封装成分类分享)
    左滑功能和多选功能(在一些列表都会用到的功能)
    数据刷新
    字典转模型第三方框架---MJExtension
    UI之UItableView重用机制的性能问题
    如何设置苹果电脑自带的wife连接手机
  • 原文地址:https://www.cnblogs.com/huqingyu/p/200415.html
Copyright © 2020-2023  润新知