关于CDC::SelectObject()的一系列问题。
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()?