Как нарисовать ELLIPSE на C ++ MFC, используя D2D и класс CD2DEllipse - PullRequest
0 голосов
/ 26 августа 2018

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

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

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

case 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;
}

case 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 голосов
/ 26 августа 2018

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

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.

...