首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在C++ MFC上绘制椭圆可以使用D2D(Direct2D)和CD2DEllipse类。下面是使用这两个类绘制椭圆的步骤:

  1. 首先,确保你的项目已经启用了Direct2D。在Visual Studio中,可以在项目属性的“配置属性”->“链接器”->“输入”->“附加依赖项”中添加"d2d1.lib"。
  2. 在你的MFC窗口类中,添加以下成员变量和方法:
代码语言:txt
复制
#include <d2d1.h>

class CMyMFCWindow : public CWnd
{
private:
    ID2D1Factory* m_pD2DFactory;
    ID2D1HwndRenderTarget* m_pRenderTarget;

    void CreateD2DResources();
    void ReleaseD2DResources();
    void DrawEllipse();
    
protected:
    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
};
  1. 在窗口类的构造函数中,初始化成员变量:
代码语言:txt
复制
CMyMFCWindow::CMyMFCWindow()
{
    m_pD2DFactory = nullptr;
    m_pRenderTarget = nullptr;
}
  1. 在窗口类的析构函数中,释放资源:
代码语言:txt
复制
CMyMFCWindow::~CMyMFCWindow()
{
    ReleaseD2DResources();
}
  1. 实现创建和释放D2D资源的方法:
代码语言:txt
复制
void CMyMFCWindow::CreateD2DResources()
{
    if (m_pRenderTarget == nullptr)
    {
        // 创建D2D工厂
        D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory);

        // 获取窗口的设备上下文
        CClientDC dc(this);
        CDC* pDC = CDC::FromHandle(dc.m_hDC);
        HDC hDC = pDC->GetSafeHdc();

        // 创建D2D渲染目标
        D2D1_RENDER_TARGET_PROPERTIES renderTargetProperties = D2D1::RenderTargetProperties(
            D2D1_RENDER_TARGET_TYPE_DEFAULT,
            D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED),
            0,
            0,
            D2D1_RENDER_TARGET_USAGE_NONE,
            D2D1_FEATURE_LEVEL_DEFAULT
        );
        m_pD2DFactory->CreateHwndRenderTarget(
            renderTargetProperties,
            D2D1::HwndRenderTargetProperties(hDC, D2D1::SizeU(0, 0)),
            &m_pRenderTarget
        );
    }
}

void CMyMFCWindow::ReleaseD2DResources()
{
    if (m_pRenderTarget != nullptr)
    {
        m_pRenderTarget->Release();
        m_pRenderTarget = nullptr;
    }

    if (m_pD2DFactory != nullptr)
    {
        m_pD2DFactory->Release();
        m_pD2DFactory = nullptr;
    }
}
  1. 实现绘制椭圆的方法:
代码语言:txt
复制
void CMyMFCWindow::DrawEllipse()
{
    if (m_pRenderTarget != nullptr)
    {
        // 清空渲染目标
        m_pRenderTarget->BeginDraw();
        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        // 创建椭圆
        CD2DEllipse ellipse(D2D1::Ellipse(D2D1::Point2F(100, 100), 50, 30));

        // 绘制椭圆
        m_pRenderTarget->DrawEllipse(ellipse, m_pD2DFactory->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red)));

        // 结束绘制
        m_pRenderTarget->EndDraw();
    }
}
  1. 实现窗口的绘制方法:
代码语言:txt
复制
void CMyMFCWindow::OnPaint()
{
    CPaintDC dc(this);
    CreateD2DResources();
    DrawEllipse();
}
  1. 在窗口类的消息映射中添加对WM_PAINT消息的处理:
代码语言:txt
复制
BEGIN_MESSAGE_MAP(CMyMFCWindow, CWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

现在,当窗口需要绘制椭圆时,会自动调用OnPaint方法,在其中创建D2D资源并绘制椭圆。

请注意,以上代码只是一个简单的示例,仅涵盖了使用D2D和CD2DEllipse类绘制椭圆的基本步骤。在实际应用中,你可能需要更多的代码来处理窗口的创建和销毁、错误处理、坐标转换等问题。此外,还可以根据需要调整椭圆的位置、大小、颜色等属性。

关于D2D和CD2DEllipse类的更详细信息,你可以参考腾讯云的相关文档和示例代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大学课程 | 计算机图形学,基于MFC二维变换的画图软件

直线的绘制则根据矩形起始点使用MoveTo()LineTo()函数绘制。 2.2.3 等腰直角三角形 使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。三角形包括3个顶点。...,使用绘制椭圆弧线函数进行绘制 pdc->Arc(pStart.x,pStart.y,pEnd.x,pEnd.y,int((pStart.x+pEnd.x)/2),pStart.y,pEnd.x,int...图3.3 组合复杂图形及变换 4 结论 通过这次的计算机图形学实践,我们熟悉了计算机是如何利用算法来生成,处理显示图形的,学习了如何通过使用Visual C++ 6.0编程环境的MFC框架进行计算机图形学的编程...程序编写的过程中,我们掌握了很多MFC库所提供的及其功能函数的使用方法,也根据项目的需要编写了很多自定义的结构体功能函数。...实验的过程中,我们逐渐了解了MFC框架中,不同类的功能定义方法,明白了双缓冲机制的原理,熟悉了基本的消息映射功能对话框的设计,以及如何在不同类间传递数据的方法。

2.4K40

MFC ActiveX (ocx)控件的开发

ActiveX控件是一种实现了一系列特定接口而使其使用外观更象一个控件的COM组件。...ActiveX控件提供的这些功能使得对其的使用将是非常方便的。本文下面即以MFC为工 具对ActiveX控件的开发进行介绍。 一、创建项目 1.打开VS2008新建MFC项目。...CActiveXDemoCtrl 是控件,我们要做的控件功能基本就是要在这个中实现。...(WHITE_BRUSH))); pdc->Ellipse(rcBounds); 也就是控件上画了一个椭圆, 实际控件开发中可以根据功能需要修改重写这个函数来 绘制控件界面。...2.方法 方法就是控件开放给用户使用的一些功能函数,类似于C++函数。开发人员可以提供自定义功能。 如下图所示我们添加一个方法Start(),其他默认。 ? ?

5.9K80
  • 【答疑解惑第十二讲】windows编程学习框架图

    另外,很多朋友学了C语言,发现编写的都是黑洞洞的命令行程序,现在的电脑里,窗口程序已经成为“高大”的一个标准之一了,只有一些系统服务,系统命令工具还保持控制台风格,那要编写下的窗口程序怎么学习呢?...因此在下要学习窗口程序编写,一定离不开 API的使用,由于C#、VB已经把窗口程序作为其必备的部分,也就不再考虑这个问题,我们今天的目标就是带领广大初学者如何用C/C++来学习编写下的窗口程序,已经熟悉的或者高手们直接略过...MFC全称是微软基础库( ),它是微软公司将的那些常用的API函数封装成了相关的,比如典型的窗口就封装了窗口的管理的各种方法熟悉,各种控件都有窗口派生出来。...MFC模式编程基本都是使用C++,这个要求你有一定的C++基础。...控件——这个部分包括窗口上的各种控件的使用管理。GDI——这个部分包括用于绘制的各种GDI对象,比如字体、位图、画刷、画笔、区域、路径等。外设——这个部分包括鼠标、键盘、打印机等、串/并口。

    48220

    【答疑解惑第十二讲】windows编程学习框架图

    Applications两家机构的最新统计,Windows系统仍然占据90%以上,因此Windows或者Windows环境下开发应用程序还是非常普遍的。...因此Windows下要学习窗口程序编写,一定离不开Windows API的使用,由于C#、VB已经把窗口程序作为其必备的部分,也就不再考虑这个问题,我们今天的目标就是带领广大初学者如何用C/C++来学习编写...MFC全称是微软基础库(Microsoft Foundation Classes),它是微软公司将Windows的那些常用的API函数封装成了相关的,比如典型的窗口就封装了窗口的管理的各种方法熟悉...MFC模式编程基本都是使用C++,这个要求你有一定的C++基础。...控件——这个部分包括Windows窗口上的各种控件的使用管理。 GDI——这个部分包括用于绘制的各种GDI对象,比如字体、位图、画刷、画笔、区域、路径等。

    1.6K71

    图像处理程序框架—MFC相关知识点

    CDC:Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。 MFC基础库定义了设备环境对象----CDC。...用画笔画布绘画,不同的画笔将画出不同的画来。选择合适的图形对象绘图对象,才能按照要求完成绘图任务。 有关CDC的继承 父:从 CObject 直接继承而来。...CDC对象使用的属性设备上下文 二者CDC对象创建时指向相同的设备上下文。...这就是为什么你用VC成的程序代码时,视图只有OnDraw没有OnPaint的原因。而在基于对话框的程序中,只有OnPaint。  其次:我们第《每天跟我学MFC》3的开始部分已经说到了。...所以OnDraw()里你可以区别对待打印屏幕绘制。  其实,MFC进行打印前后还做了很多工作,调用了很多虚函数,比如OnPreparePrint()等。

    1.5K20

    dotnet DirectX 通过 Vortice 控制台使用 ID2D1DeviceContext 绘制画面

    在上一篇博客里面告诉大家,如何使用 Vortice 从零开始控制台创建 Direct2D1 窗口。...一篇博客采用的是 CreateDxgiSurfaceRenderTarget 的方式拿到了 ID2D1RenderTarget 进行绘制,本文将大家介绍另一个方式,通过 ID2D1DeviceContext...ID2D1RenderTarget 其实本文所拿到的 ID2D1DeviceContext 是相同的东西,至少从底层是相同的,也就是在上一篇博客的基础,通过 QueryInterface 即可从...尽管使用 Silk.NET 的性能从理论分析能够比 Vortice SharpDx 更好,但从定量上说,其实好不了多少。...而且有趣的是,可以混合着 Vortice Silk.NET 一起用,只有某些模块才使用 Silk.NET 编写

    48930

    OCX 入门

    ActiveX控件是一种实现了一系列特定接口而使其使用外观更象一个控件的COM组件。...(WHITE_BRUSH))); pdc->Ellipse(rcBounds); 也就是控件上画了一个椭圆, 实际控件开发中可以根据功能需要修改重写这个函数来 绘制控件界面。...2.方法 方法就是控件开放给用户使用的一些功能函数,类似于C++函数。开发人员可以提供自定义功能。 如下图所示我们添加一个方法Start(),其他默认。 ? ?...⑥相应事件中添加代码以创建并绘制对话框控件 1)为CMyActiveXCtrl处理WM_CREATE事件,以初始化对话框对象: 左侧选中CMyActiveXCtrl,右侧属性栏选择”消息”那个小图标...”,把这个文件解压缩以后,在下面的目录可以找到TSTCON32.exe的源代码:“C++\MFC\ole\TstCon”,自己编译就可以了。

    3.1K60

    CC+的角角落落 第二辑 002

    MFC的第一个公开版本发布于1992年3月,使用C语言开发窗体应用的程序员们转而开始使用MFC来代替使用API直接开发窗体应用程序。...Windows平台使用API绘制窗体的基本流程是: *第一步按照Windows平台的标准,定义并设计一个窗体(定义并设置一个包含窗体属性的结构体WNDCLASSEX,这个结构体的结构是有官方文档的)...; *第二步使用RegisterClassEx函数注册窗体,所有窗体创建前都必须注册窗体,只有注册的窗体才被系统认知并允许实例化,窗体的控件API的命名中也同属于Window,但是当你要在窗体绘制控件就不需要对控件...必要时还需要使用UpdateWindow更新显存重绘窗体。 完成绘制之后我们的程序应该进入一个循环,用来处理各种消息,如窗体大小调整或关闭,按键鼠标输入等等。...现在我们有如此多的语言(Java、Python等)相应的编译器,他们大多是基于API函数才能在Windows平台上施展拳脚(各类编译器在当前平台上使用C++加上Windows SDK编写编译),对底层有一定的了解可以让我们注意到那些语言和语法中更本质的内容

    87350

    dotnet C# 使用 Vortice 支持 Direct2D1 离屏渲染

    本文告诉大家如何使用 Vortice 进行 D2D 的离屏渲染功能,本文将在一个纯控制台无窗口的应用下,使用 Direct2D1 进行离屏绘制,将绘制结果保存为本地图片文件 本文属于使用 Vortice...使用 Vortice 底层库,能让 C# 代码比较方便的 DirectX 对接。...= Vortice.DCommon.PixelFormat; 大家都知道,使用 D2D 时,最重要的就是获取到 ID2D1RenderTarget 用来作为绘制的画布。...IWICBitmap 接下来是将 IWICBitmap 的内容保存到本地的图片,保存 IWICBitmap 需要先对 IWICBitmap 进行编码,编码时需要使用 WIC 工厂创建编码器,接着传入编码的格式编码的输出...gitee 欢迎访问 可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,命令行里面输入以下代码,即可获取到本文的代码 git init git remote

    55930

    dotnet C# 通过 Vortice 使用 Direct2D 的 ID2D1CommandList 入门

    本文将告诉大家如何通过 Vortice 使用 D2D 的 CommandList 功能 Direct2D 里面的一个很基础也很重要的功能组件是 D2D 的 CommandList 功能。...通过 D2D 的 CommandList 功能,可以用来存放记录一系列的绘制命令,从而将绘制内容作为 ID2D1Image 参与其他功能。...比如作为特效的输入等等 更多关于 Direct2D 的 ID2D1CommandList 的优势还请自行了解,本文着重在于如何在 Vortice 创建 ID2D1CommandList 对象,以及将绘制内容输入到...ID2D1DeviceContext 使用 DrawImage 进行绘制,代码如下 // 开始绘制逻辑 renderTarget.BeginDraw...本文所有代码放在 github gitee ,可以通过以下方式获取整个项目的代码 先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,命令行里面输入以下代码,即可获取到本文的代码 git

    20920

    WPF 使用 Direct2D1 画图入门

    本文来告诉大家如何在 WPF 使用 D2D 画图。...本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WPF 使用 SharpDX D3DImage...显示 WPF 使用封装的 SharpDx 控件 WPF 使用 SharpDx 异步渲染 什么是 D2D 实际现在很多小伙伴对于渲染性能就是听到 DirectX 才会去搜索这个博客。...我博客园看到很少的博客讲到这个。即使有也很少会说如何使用 WPF 的。 那么 D2D 是一个提高性能的方法,具体是怎么做?...现在的 WPF 底层使用的渲染是 Dx9 渲染 或使用 Dx11 Dx12 优化 fl9 渲染,所以性能实际直接使用 D2D 是差不多,但是 WPF 没有充分使用DX,所以如果自己写的性能会比较高

    88110

    WPF 使用 Direct2D1 画图入门

    本文来告诉大家如何在 WPF 使用 D2D 画图。...本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WPF 使用 SharpDX D3DImage...显示 WPF 使用封装的 SharpDx 控件 WPF 使用 SharpDx 异步渲染 什么是 D2D 实际现在很多小伙伴对于渲染性能就是听到 DirectX 才会去搜索这个博客。...我博客园看到很少的博客讲到这个。即使有也很少会说如何使用 WPF 的。 那么 D2D 是一个提高性能的方法,具体是怎么做?...现在的 WPF 底层使用的渲染是 Dx9 渲染 或使用 Dx11 Dx12 优化 fl9 渲染,所以性能实际直接使用 D2D 是差不多,但是 WPF 没有充分使用DX,所以如果自己写的性能会比较高

    61210

    ATL CLR MFC Win32 常规 的区别

    ---- 文章1 ATL用于编写COM程序,CLR是.NET的公共语言运行库,MFC是指MFC库,MFC程序是用这些库做出的程序,WIN32常规就是不用 MFC使用API函数编的程序。...MFC、ATLCLR是VC2005内置的3大库,涵盖了windows的各种开发方法开发应用。当然关于C++开发的库不止这3个,不过这3个是微 软推荐。...事实很多人用MFC只是利用其GUI部分的封装。这个库GUI处理的效率也并不是很高,有时候与UI处理相关的代码会占到整个项 目的一半甚至更多。...使用Visual Studio 2005 可以很方便地创建一个CLR与MFC混合编程的工程,工程中,我们即可以使用MFC中的,也可以使用CLR中的。...3)为了使用CLR库中的Console程序的开始包含如下两行: #using using namespace System; //下列代码演示了如何使用CLR与MFC

    1.5K30

    DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    使用 Vortice 底层库,能让 C# 代码比较方便的 DirectX 对接 从设计,此 Vortice 库 SharpDx 是对 DirectX 的低级封装,低级封装意味着将会让咱开发时,必须了解非常的细节...尽管本文属于入门级博客,但不会涉及到过于基础的知识 想要开始使用 D2D 绘制内容,就需要有一个用来承载绘制内容的 “画布” 对象, D2D 里面,对应的就是一个 ID2D1RenderTarget...D3D11 创建 D2D 的 ID2D1RenderTarget 进行绘制修改颜色 创建项目 本文将使用 VisualStudio 2022 作为 IDE 工具,理论还在使用低于 VisualStudio...本文只是告诉大家如何进行初始化,不会涉及到如何使用 D2D 绘制的内容 开始调用 Clear 方法之前,需要先调用 BeginDraw 方法,告诉 DX 开始绘制。...,窗口的设置了一个诡异的颜色 这就是入门级的使用 Vortice 从零开始控制台创建窗口,在窗口上使用 D2D 绘制的方法 完成初始化的逻辑之后,就可以使用 D2D 绘制复杂的界面了。

    1.2K30

    1.设计模式-什么是设计模式

    . 4.使用C语言常用的分解方式实现一个Qt画板 分解: 将大问题分解成多个小问题.每个表示一个模块,分开处理 如下图所示: 假如客户需求,让我们在这个绘画板项目中添加一个绘制椭圆图形的功能,那么我们需要改动...: 1.添加一个ellipse 2.PainterWindow中添加一个list3成员,用来存储要绘制椭圆的表. 3.修改mouseUp()函数,判断如果绘制的是椭圆,则往list3中添加椭圆图形.... 4.修改paintEvent()函数,添加椭圆绘制操作 5.使用多台方式实现一个Qt画板 多态: 把不同的子类对象都当作父来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化...如下图所示: 假如客户需求,让我们在这个绘画板项目中添加一个绘制椭圆图形的功能,那么我们只需要改动两处: 1.子类化一个ellipse,继承于Shape接口 2.修改mouseUp()函数,判断如果绘制的是椭圆...注意: 这里我们之所以使用指针,就是为了实现多态效果,但是使用指针的时候,切记记住不需要的时候,一定要进行内存释放 总结 通过分解多态之间的对比,可以看出,使用多态可以减少代码修改量,减少耦合度

    58710

    MFC进度条同步问题

    读者朋友们可能天天使用Visual C++这个强大的工具来开发应用程序,不知道注意到没有,Visual C++每次装载一个项目的时候,为了使项目加载过程不至于太单调,会在状态栏的左半部分会出现一个装载进度条...那么这个功能是如何实现的呢?...一、实现方法   虽然Visual C++中的MFC提供了标准的进度指示器控件(progress control),但是我们不能在状态栏里直接使用这个控件,要解决这个问题,可以创建一个可重用C++CProgStatusBar...隐藏/显示进度控制时尤其如此,这时候会出现两个问题:第一,因为进度指示器显示状态栏的第一个窗格位置,所以如果进度条指示器显示时已经显示有状态信息,那么进度指示器状态信息文本就会有冲突,相互干扰。...当应用程序不做任何事情时,MFC程序总是在这个位置显示资源串AFX_IDS_IDLEMESSAGE表示的文本,其缺省值为”就绪”,当然读者朋友们可以在当前项目的RC文件中任意修改这个值,不管怎样,MFC

    1.1K10

    WPF 对接 Vortice 调用 D2D 使用 IWICBitmap 离屏渲染

    通过 Vortice 库可以使用非常底层的方式调用到 Direct2D1 进行渲染,本文将使用 D2D 离屏渲染到 IWICBitmap ,再使用一点点反射黑科技,直接将此 IWICBitmap 对接到...执行绘制指导命令,从而实现将画面绘制到 IWICBitmap 于是新建出一个 IWICBitmap 对象,接着挂上 D2D 的 ID2D1RenderTarget 进行绘制。...完成之后,将 IWICBitmap 封装为一个 BitmapSource 对象,扔给 WPF 层,当成图片接入 WPF 的渲染框架 创建 IWICBitmap 对象挂上 D2D 以及绘制逻辑的细节,请参阅...此方法 D3DImage 对比如何?从代码分析上来说,如果不是静态画面绘制,那是比不过 D3DImage 的。静态画面绘制就是绘制一张静态画面,后续也不需要去更新,去修改画面的内容。...绘制静态画面的时候,性能预计 D3DImage 持平。

    49610

    MFC拓展库】上海道宁与BCGSOFT合作为您带来专业的Micrisoft Windows开发业务组件

    大型停靠窗格应用程序框架标题。状态栏、应用程序按钮、后台视图突出显示的GUI元5、素中使用强调色。...复制/粘贴操作完全拖放支持(您可以一天内拖动约会或将它们放在日期选择器控件)。打印支持07、网格报告控件Grid 控件支持大多数标准网格功能。...自动生成的行列(对于 .NET)导出为 HTML RTF单元格边框 - 具有不同线条样式的粗细边框(适用于 .NET)浮动文本 - 如果相邻单元格为空,则在相邻单元格绘制文本文本环绕修剪。.../粘贴支持拖放支持查找替换扩展(可定制)撤消/重做支持UNICODE支持CView派生,可轻松与MFC文档视图体系结构集成。...12、皮肤对话框表单有一种简单而有效的方法来自定义对话框表单外观:只需调用 EnableVisualManagerStyle,所有对话框/表单控件背景都将使用当前选择的可视化管理器进行绘制

    5.6K20

    MFC实现快乐连连看

    第一部分:实验分析与设计(可加页) 一、实验目的具体内容 1.实验目的 本实验旨在通过使用C++中的MFC框架相关技术,设计实现一个基于GUI的欢乐连连看游戏应用程序。...通过完成本实验,学生将会: 1.了解MFC框架的基本概念架构,包括应用程序、文档视图模型、窗口、消息处理等内容; 2.掌握MFC中常用的控件组件的使用方法,如按钮、文本框、列表框、菜单、对话框等,...并学习如何将这些控件组件集成到应用程序中; 3.学习MFC中的绘图技术,了解如何使用GDI+绘制基本图形、图片、文本等,以及如何实现游戏界面的绘制更新; 4.通过设计实现欢乐连连看游戏,提高学生的逻辑思维能力程序设计能力...例如,如何显示图案、计时、计分等。还可以为游戏添加音效背景音乐,以提高玩家的体验。 本次实验的目标是通过实现这个小游戏来练习使用C++语言和MFC库,以及设计实现基本的数据结构算法。...第三部分:实验小结、收获与体会 本次实验我学习了如何使用C++MFC控件来完成一个简单的游戏。在此过程中,我深刻认识到了软件开发的重要性团队协作的必要性。

    10010
    领券