【问题标题】:How to draw an ELLIPSE on C++ MFC using D2D and the class CD2DEllipse如何使用 D2D 和 CD2DEllipse 类在 C++ MFC 上绘制 ELLIPSE
【发布时间】:2019-02-01 08:46:43
【问题描述】:

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

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

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

案例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;
}

案例 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++ mfc direct2d


    【解决方案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 );
    

    一般来说,现代 C++ 中很少需要 new。大多数时候,您只需在堆栈上创建对象并让它们的析构函数自动进行清理。如果您实际上必须在堆上分配一些东西,请使用标准库提供的smart pointers 之一。这些会自动调用delete

    【讨论】:

    • 我有很多Ellipse,Rectangle之类的……所以我觉得最好把指针保存在class上……所以每次改大小win的时候。 ..我只能修改维度...或者您认为每次创建都更便宜?其他...我经常从 LAN 收到大量数据,因此我只需要重绘胜利的一部分...如果我有类指针,这很容易...我认为...或没有?
    • 其他问题是文本格式...为了更改字符大小,我每次看起来都必须创建格式...正确吗?有更好的方法来改变字符的大小......?非常感谢您的回答
    • @GiPag 这些只是包装类,在堆栈上创建非常便宜。当你有一个指针时,会有一个间接的,它更昂贵。我不知道文本格式,最好你发布一个新问题。
    • @GiPag:堆分配非常昂贵。在堆上分配单个对象所花费的时间中,您可能会在堆栈上实例化数百个对象。另外,指针也很昂贵。他们垃圾缓存位置。如果你想提高性能,你需要先衡量性能。
    猜你喜欢
    • 2012-11-04
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多