阅读:1336回复:3
【请教】关于GDI的若干问题!
1,HWND hwnd = FindWindow();
这样得到的窗口句柄好像不用CloseHandle来释放。如果直接使hwnd=NULL,会不会出现内存泄漏? (难道hwnd指向的是系统的内存区域?) 2,CDC * pdc = GetDC() ; 在处理完成以后,是不是一定要ReleaseDC(pdc)来释放? ReleaseDC()以后是否还需要调用 delete pdc? (我看到一本关于windows图像编程的书,上面写的比较模糊,书上提供的代码从来都没调用ReleaseDC) 3,CDC * pdc = new CDC ; pdc->CreateCompatibleDC() pdc->CreateCompatibleDC()以后应该ReleaseDC()吧? CreateCompatibleDC()以后,我用pdc画图时,然后用BitBlt将pdc的内容copy到可以显示的DC上面,但是BitBlt好像不能正常执行,执行了以后没有任何显示。但是用下面的代码就没问题了。我有点看不太懂。 HDC tmphdc = GetDC(GetDesktopWindow()); HDC hComDC = CreateCompatibleDC(tmphdc);//hComDC做为全局变量,用来保存画图结果 //显示时调用BitBlt HBITMAP hbmp = CreateCompatibleBitmap(tmphdc,rc.right,rc.bottom); SelectObject(hComDC,hbmp); TextOut(hComDC,10,10,\"test\",4);//在兼容DC里面画图 ReleaseDC(GetDesktopWindow(),tmphdc); DeleteObject(hbmp); CloseHandle(hbmp); //为什么需要CreateCompatibleBitmap,然后SelectObject以后才能让hComDC像正常的DC一样来操作? 4,SelectObject以后,hbmp里面的内容就和hComDC相关联了,以后操作hComDC就会改变hbmp的内容。 可以简单解释一下SelectObject的作用吗? |
|
沙发#
发布于:2004-05-20 14:17
1,HWND hwnd = FindWindow();
这样得到的窗口句柄好像不用CloseHandle来释放。如果直接使hwnd=NULL,会不会出现内存泄漏? A: hWnd is your applciaiton data which alloced in local stack and you can use \"hwnd=NULL\", it\'s safe. (难道hwnd指向的是系统的内存区域?) A: Yes 2,CDC * pdc = GetDC() ; 在处理完成以后,是不是一定要ReleaseDC(pdc)来释放? A: No, you don\'t need to do that. If you insist to release this DC, I guess it doesn nothing and it\'s still safe, for example, you try to relase the desktop DC. ReleaseDC()以后是否还需要调用 delete pdc? A: No, although you can call delete DC and it\'s safe, but it does nothing and just increase your binary size. (我看到一本关于windows图像编程的书,上面写的比较模糊,书上提供的代码从来都没调用ReleaseDC) 3,CDC * pdc = new CDC ; pdc->CreateCompatibleDC() pdc->CreateCompatibleDC()以后应该ReleaseDC()吧? A: I am not familir with MFC but I guess you should call delete pdc. CreateCompatibleDC()以后,我用pdc画图时,然后用BitBlt将pdc的内容copy到可以显示的DC上面,但是BitBlt好像不能正常执行,执行了以后没有任何显示。 但是用下面的代码就没问题了。我有点看不太懂。 HDC tmphdc = GetDC(GetDesktopWindow()); HDC hComDC = CreateCompatibleDC(tmphdc);//hComDC做为全局变量,用来保存画图结果 //显示时调用BitBlt HBITMAP hbmp = CreateCompatibleBitmap(tmphdc,rc.right,rc.bottom); SelectObject(hComDC,hbmp); TextOut(hComDC,10,10,\"test\",4);//在兼容DC里面画图 ReleaseDC(GetDesktopWindow(),tmphdc); DeleteObject(hbmp); CloseHandle(hbmp); //为什么需要CreateCompatibleBitmap,然后SelectObject以后才能让hComDC像正常的DC一样来操作? A: DC essentially is a pointer point to system mainatined global table element which is a data strucure to describe the device attributes, and drawing object including brush, pen, region, clip, bitmap and so on, all of which are NOT initialized ( = NULL), for example, of course you can not perform BitBlt command to a NULL bitmap, although it\'s safe but the bitmap render nothing for you. So you need to create a bitmap and SELECT it to DC, essentially, SelectObject fills the bimtap element thus you can perform bitmap relative GDI calls. 4,SelectObject以后,hbmp里面的内容就和hComDC相关联了,以后操作hComDC就会改变hbmp的内容。 可以简单解释一下SelectObject的作用吗? Hope it helps. |
|
板凳#
发布于:2004-05-20 15:30
It does helps very much .
Thanks a lot! |
|
地板#
发布于:2004-05-21 14:24
Remarks 在msdn找到了这样的资料,每次调用GetDC,GetWindowDC的时候都需要ReleaseDC,每次CreateDC,CreateCompitableDC以后需要DeleteDC |
|