作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 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/
我是一名优秀的程序员,十分优秀!