Как нарисовать 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
автоматически.