我需要使用D2D和类CD2DEllipse在C ++ MFC上绘制一个ELLIPSE, 我希望如果我更改窗口的大小,椭圆也要更改大小。
我希望对象的指针看到类...,所以我将其声明为标题:
//hpp
class CmyclassView : public CView
{
...
CD2DEllipse* pE;
...
}
案例A:
我每次都要初始化椭圆对象CD2DEllipse 我调整视图大小... WM_PAINT-> OnDraw2D ...但是我把椭圆 由于“新”而在堆上...以及先前的椭圆在哪里...
如果我关闭应用程序,则d_str必须调用“ delete pE;”?
// cpp
afx_msg LRESULT CDXALGOView::OnDraw2D(WPARAM wParam, LPARAM lParam)
{
C_pRT = (CHwndRenderTarget*)lParam;
ASSERT_VALID(C_pRT);
pE = new CD2DEllipse(D2D1::Ellipse(xyC,r,r)); <<-------
return TRUE;
}
案例B: 或者最好只在构造函数中一次创建对象,更新 ondraw上的参数,并在我关闭该应用程序时删除 物体 c_str
{
pE = new CD2DEllipse(D2D1::Ellipse(xyC,r,r));
}
afx_msg LRESULT CDXALGOView::OnDraw2D(WPARAM wParam, LPARAM lParam)
{
C_pRT = (CHwndRenderTarget*)lParam;
ASSERT_VALID(C_pRT);
pE.point = xyC; <<-------
pE.radiusX = r;
pE.radiusY = r;
return TRUE;
}
答案 0 :(得分:2)
仅在需要时在堆栈上创建对象:
C_pRT->DrawEllipse( CD2DEllipse(D2D1::Ellipse(xyC, r, r)), someBrush, lineWidth );
为了更好的可读性,您可以分解该语句:
CD2DEllipse ellipse( D2D1::Ellipse(xyC, r, r) );
C_pRT->DrawEllipse( ellipse, someBrush, lineWidth );
通常,现代C ++中很少需要new
。在大多数情况下,您只是在堆栈上创建对象,然后让其析构函数自动进行清理。如果实际上必须在堆上分配某些内容,请使用标准库提供的smart pointers之一。这些负责自动调用delete
。