GDI :: DeleteObject是如何工作的

时间:2015-08-06 08:08:10

标签: c++ winapi gdi

根据MSDN

  

DeleteObject函数删除逻辑笔,画笔,字体,位图,   区域或调色板,释放与之关联的所有系统资源   宾语。删除对象后,不再显示指定的句柄   有效的。

所以一个人(我自己)会认为一旦执行了DeleteObject,HANDLE就不再有效了。但是在我用其他WinAPI调用保存对象之前删除对象后,由:: GetObject()检索的对象会发生什么?

        HFONT hFont = reinterpret_cast<HFONT>(::SendMessage(hwndCtrl, WM_GETFONT, 0, 0));
        if (nullptr == hFont)
        {
            LOG_ERROR(L"Invalid font specified");
            return false;
        }

        LOGFONT font = { 0 };
        if (0 == ::GetObject(hFont, sizeof(font), &font))
        {
            LOG_ERROR(L"Failed getting font");
            return false;
        }

        font.lfHeight = nSize;



       ::DeleteObject(hFont);
        HFONT hFontEx = ::CreateFontIndirect(&font);
        LPARAM lparam = MAKELPARAM(TRUE, 0);
        WPARAM wparam = (WPARAM)(hFontEx);
        SendMessage(hwndCtrl, WM_SETFONT, wparam, lparam);

如下例所示,如果我决定删除我的HFONT,在通过SendMessage发送新消息之前,我会检索一些意外的结果,其他控件的字体也会改变,就好像我一样产生了某种手柄泄漏。

1 个答案:

答案 0 :(得分:2)

  

所以一个人(我自己)会认为一旦执行了DeleteObject,就会   手柄不再有效。但是检索到的对象会发生什么   by :: GetObject()一旦删除对象,然后再保存它们   其他WinAPI电话?

使用GetObject,您可以获得对象的描述,而不是新对象。删除句柄后它保持不变。

  

如下例所示,如果我之前决定删除我的HFONT   通过SendMessage发送新消息,我检索了一些意外的消息   结果,其他控件的字体发生了变化,就好像我一样   产生了某种手柄泄漏。

如果你想发送一条删除了HFONT的消息,我想如果你发送任何其他垃圾,结果将是相同的。