Как нарисовать ELLIPSE на C++ MFC, используя D2D и класс CD2DEllipse

Мне нужно нарисовать ELLIPSE на C++ MFC, используя D2D и класс CD2DEllipse, я хочу, чтобы, если я изменил размер окна, размер эллипса тоже изменился.

Я хочу, чтобы указатель объекта видел класс... и поэтому я объявляю его заголовку:

//hpp
class CmyclassView : public CView
{
...
CD2DEllipse* pE;
...
}

дело А:

Я должен инициализировать объект эллипса 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 ответ

Просто создайте объект в стеке, когда вам это нужно:

C_pRT->DrawEllipse( CD2DEllipse(D2D1::Ellipse(xyC, r, r)), someBrush, lineWidth );

Вы можете разбить это утверждение для лучшей читабельности:

CD2DEllipse ellipse( D2D1::Ellipse(xyC, r, r) ); 
C_pRT->DrawEllipse( ellipse, someBrush, lineWidth );

В общем, редко возникает необходимость new в современном C++. В большинстве случаев вы просто создаете объекты в стеке и позволяете их деструкторам выполнять очистку автоматически. Если вам действительно нужно что-то выделить в куче, используйте один из умных указателей, предоставляемых стандартной библиотекой. Они заботятся о звонках delete автоматически.

Другие вопросы по тегам