DC的几个概念啊
发过贴,但是没有解答清楚,再次发帖,希望一次性搞清楚,谢谢大家发言啊。。。呵呵
对于
对于void COwnerDrawListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
是该RealseDC 还是Detach 合适?
第2个问题:
对于CDialog::OnPaint, 用CDC好,还是CPaintDC好??
第3个问题:
DC 最终是windows回收的, 那么为什么要用户手动释放DC呢??
比如: void COwnerDrawListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
DRAWITEMSTRUCT 有个成员是HDC,
意味着ListBox的每一行都有一个DC的句柄,否则HDC是哪里来的???
谁给它的,是windows给它的, 既然给了它,那么FromHandle 起到的作用仅仅是
由句柄获得指针而言的作用啊, 那么为什么要Deatch 或者RealseDC ???
岂非多此一举??
[解决办法]
1) CDC::FromHandle
If a CDC object is not attached to the handle, a temporary CDC object is created and attached.
The pointer may be temporary and should not be stored beyond immediate use.
如果放回的是临时的CDC,MFC会在OnIdle的时候适当清理,你也可以手动调用CDC::DeleteTempMap()
至于要不要ReleaseDC,就看你的HDC是怎么来的
2)按msdn的这个说法
A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.
OnPaint里应该使用CPaintDC
PS:CPaintDC是CDC的派生类
推荐你看看这个http://apps.hi.baidu.com/share/detail/20176633
3)GDI OBJECT 存在着引用计数,所以需要ReleaseDC
比如你使用了GetDC,用完后就需要Release
3)