首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

DC的几个概念啊解决方法

2012-02-07 
DC的几个概念啊发过贴,但是没有解答清楚,再次发帖,希望一次性搞清楚,谢谢大家发言啊。。。呵呵对于对于void C

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)



 
 

热点排行