gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:21:36 26 4
gpt4 key购买 nike

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

我希望对象的指针看到类...所以我将其声明到 header :

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

案例A:

我每次都必须初始化椭圆对象CD2DEllipse我调整 View 的大小...WM_PAINT -> OnDraw2D ...但我把椭圆由于"new"而在堆上......以及之前的椭圆在哪里......

如果我关闭应用程序,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;
}

最佳答案

只在需要时在堆栈上创建对象:

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

关于c++ - 如何使用 D2D 和类 CD2DEllipse 在 C++ MFC 上绘制椭圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52028705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com