如何使用D2D和类CD2DEllipse在C ++ MFC上绘制ELLIPSE

时间:2018-08-26 17:32:18

标签: c++ mfc direct2d

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

1 个答案:

答案 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