关于CDC::SelectObject()的一系列问题。

darkread 2005-06-13 07:07:37
1。CView::GetDC()
比如在一个视图文当结构中,
class CMyView : public CView{
.........................
private:
CDC m_DC
}
然后再一个过程中
CMyView::OnXXXXXXX(){
CDC *pDC = this->GetDC();
m_DC->CreateCompatibleDC(pDC);
...........

}
在这个过程的结尾我是不是要ReleaseDC(pDC)??
2.同时是上面那个程序。
其中有这样一个段
CMyView::OnYYYYY(){
CFont myFont;
myFont.CreateFontIndirect(。。。。。。);
m_DC.SelectObject(&myFont);
}
安msdn上说是在这结尾的地方要有一个myFont.DeleteObject();
但是在以后的程序中,就一直是用这个Font进行绘图,那么老是一次次的CreateFontIndirect()显然欠缺效率,那么我在这里不DelectObejct()行吗?我又想:myFont是一个局部变量出了这个区域,他会自动析构,析构的时候会不会自动调用DelectObejct()。如果是这样,那么我的这段代码是非常危险的了。
3。把CFont myFont改为CFont *pFont = new CFont;这样是否可行?就像这样:
CMyView::OnYYYYY(){
CFont *pFont = new CFont;
myFont->CreateFontIndirect(。。。。。。);
m_DC.SelectObject(myFont);
}
如果是这样显然在堆上有一个CFont类产生了,但是除了这个区域我再也不能操作它了。甚至不能delete pFont.因为pFont是局部变量,出了这个区域它就失效了。
4。还是上面的那个例子:我把它改成这个样子
HFONT hFont = CreateFontIndirect(。。。。。。)
CMyView::OnYYYYY(){
HFONT hFont = CreateFontIndirect(。。。。。。)
m_DC.SelectObject(myFont);
}
这样就不存在3。中提到的问题了,因为这里Create的是一个GraphicObejct的句炳。
但是我担心的是在我的m_DC.DeleteDC的时候,这里OnYYYYY()中Create的Font对象会不会自动DeleteObject()?
...全文
544 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodboyws 2005-06-14
  • 打赏
  • 举报
回复
1.绝对需要
2.定义为成员变量
3, 4其实和2是一回事儿怎么用都是一样
xqk 2005-06-14
  • 打赏
  • 举报
回复
1.必须要用ReleaseDC来释放DC,因为CDC类的构造函数及析构函数并不对DC设备初始及删除,而CDC的派生类CClientDC,CWindowDC 则会自动对DC设备初始化,推荐使用
2.如果是OnDraw函数传进来的参数pDC,就不用释放,系统会自动管理,而对于你这个m_DC,当然你局部的CFont析构以后,m_DC就会指向一个未知指针,好的方法是在堆中建立一个CFont,将CFont的句柄保存到类成员变量中,使用的时候通过句柄得到对象
3.正如上面所说,你定义的指针是局部的当然没有了,但是你将这个对象的句柄保存起来,以后就可以通过这个句柄得到对象及指针了。
4.当然不会了,看参数原型,它传进去的是一个指针,不对显然不会对原对象进行修改,如果非const的引用就不一定了,C++语言没学好吗?

再强调两句:CDC如果在局部建立,并用GetDC,用完之后必须ReleaseDC,如果没有ReleaseDC,出了局部,就会造成内存泄漏,CDC的派生类则不会有此问题,MSDN上面写的很清楚
darkread 2005-06-14
  • 打赏
  • 举报
回复
大家都来帮我看看吧.
Zhymax 2005-06-13
  • 打赏
  • 举报
回复
GetDC() 和 ReleaseDC()是成对出现的;

font使用完后需要调用DeleteObject
cnwolf 2005-06-13
  • 打赏
  • 举报
回复
1.应该需要吧

我没有释放,结果造成了内存泄露

我获取的不是本窗体的dc,而是它的一个控件的dc
Kudeet 2005-06-13
  • 打赏
  • 举报
回复
DeleteObject在哪里都不会自己调用的。你需要在多个地方用就要定义为成员变量。
truewill 2005-06-13
  • 打赏
  • 举报
回复
1. 应该不用
2. Cfont pOldFont = m_DC.SelectObject(&myFont);
...
m_DC.SelectObject(poldfont);
//不需要cfont.delete
3 4 都不好

ps: 传进来的dc似乎也只是系统dc的一个副本, 无论怎么改对系统似乎都没什么影响
所以还是每次老老实实的select吧

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧