gpt4 book ai didi

c++ - (Windows) 何时删除对象和设备上下文?

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:26 24 4
gpt4 key购买 nike

假设我创建了一个函数来处理内存 dc 中的位图并返回它

HBITMAP paint (HWND hwnd)
{

HDC windc = ::GetWindowDC(hwnd);
HDC memdc = ::CreateCompatibleDC(windc);
HBITMAP bitmap = ::CreateCompatibleBitmap(windc,100,100); //Don't bother with the height and width
::SelectObject(memdc,(HGDIOBJ)bitmap);

/* DeleteDC(windc) here? */

//do the painting
//...
//painting done

/*DeleteDC(memdc) here? */

return bitmap;

/* Code does not reach here */
/* So where do I put DeleteObject(bitmap)? */
}

我的问题是何时何地删除位图?另外,删除windc会影响memdc吗?或者 memdc 是纯粹创建的(并且不包含“指向”windc 的信息)?如果这是真的,那么在创建位图和 memdc 之后(在任何绘画之前)删除 windc 是合适的。

最佳答案

DeleteDC(windc);

从不。您必须调用 ReleaseDC (windc);相反。

::CreateCompatibleDC(windc); 之后你不需要 windc 并且不关心它会发生什么。 CreateCompatibleDC 返回的 HDC 仅导出一些参数(设备相关像素表示等),但不以任何方式引用 windc

取而代之的是:

::SelectObject(memdc,(HGDIOBJ)bitmap);

//do the painting
//...
//painting done

/*DeleteDC(memdc) here? */

return bitmap;

你必须做这样的事情:

HGDIOBJ prevBitmap = ::SelectObject(memdc,(HGDIOBJ)bitmap);

//do the painting
//...
//painting done

::SelectObject(memdc,prevBitmap);
DeleteDC(memdc);

return bitmap;

关于c++ - (Windows) 何时删除对象和设备上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com