我需要使用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

10-07 15:34