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

How to draw an ELLIPSE on C++ MFC using D2D and the class CD2DEllipse

本文关键字:绘制 C++ MFC 何使用 D2D 和类 CD2DEllipse      更新时间:2023-10-16

我需要使用 D2D 和类 CD2DEllipse 在 MFC C++上绘制一个椭圆, 我希望如果我更改窗口的大小,椭圆也会更改大小。

我希望对象的指针看到类...所以我把它声明到标题:

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

案例 A:

我每次都必须初始化椭圆对象 CD2DEllipse 我调整了视图的大小...WM_PAINT -> OnDraw2D ...但我把椭圆 在堆上,因为"新"...以及上一个椭圆的去向...

如果我关闭应用程序,d_str必须调用"删除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。大多数情况下,您只需在堆栈上创建对象,并让它们的析构函数自动执行清理。如果实际上必须在堆上分配某些内容,请使用标准库提供的智能指针之一。这些负责自动呼叫delete