我需要使用D2D和类CD2DEllipse在C++ MFC上绘制一个ELLIPSE,
我希望如果我更改窗口的大小,椭圆也要更改大小。
我希望对象的指针可以看到类...所以我将其声明为标题:
//hpp
class CmyclassView : public CView
{
...
CD2DEllipse* pE;
...
}
情况A:
我每次都要初始化椭圆对象CD2DEllipse
我调整 View 的大小... WM_PAINT-> OnDraw2D ...但是我把椭圆
由于"new"而在堆上...以及先前的椭圆在哪里...
如果我关闭应用程序,则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;
}
最佳答案
只需在需要时在堆栈上创建对象:
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
。