精华内容
下载资源
问答
  • Direct2D 五子棋

    2017-09-22 12:27:29
    Direct2D 五子棋Direct2D 五子棋Direct2D 五子棋Direct2D 五子棋Direct2D 五子棋Direct2D 五子棋Direct2D 五子棋 Direct2D 五子棋
  • Direct2D

    2015-09-11 15:02:27
    请问ID2D1Factory::CreateTransformedGeometry对应的MFC中是什么方法?
  • Direct2D教程

    2015-10-14 11:43:31
    本文详细介绍了Direct2D编程的方方面面,尤其适合direct2d初学者使用;作者不仅文笔流畅,而且对于技术细节描述非常详尽,读者阅后不仅能够熟悉direct2d编程步骤,对于图形处理也会有一定的感知。
  • 有两种方法可以结合使用 Direct2D 和 GDI:您可以将 GDI 内容写入与 Direct2D GDI 兼容的呈现器目标,也可以将 Direct2D 内容写入 GDI 设备上下文 (DC) 0X01 将Direct2D内容绘制到GDI设备上下文:  要将 Direct2D ...

    本主题说明如何结合使用 Direct2D 和 GDI(可能为英文网页)。有两种方法可以结合使用 Direct2D 和 GDI:您可以将 GDI 内容写入与 Direct2D GDI 兼容的呈现器目标,也可以将 Direct2D 内容写入 GDI 设备上下文 (DC)

    0X01 将Direct2D内容绘制到GDI设备上下文:

      要将 Direct2D 内容绘制到 GDI DC,可以使用 ID2D1DCRenderTarget。要创建 DC 呈现器目标,可以使用ID2D1Factory::CreateDCRenderTarget 方法。此方法使用两个参数。

      第一个参数是 D2D1_RENDER_TARGET_PROPERTIES 结构,指定呈现、远程处理、DPI、像素格式和用法信息。要使 DC 呈现器目标能够使用 GDI,请将 DXGI 格式设置为DXGI_FORMAT_B8G8R8A8_UNORM,并将 Alpha 模式设置为 D2D1_ALPHA_MODE_PREMULTIPLIED 或D2D1_ALPHA_MODE_IGNORE

      第二个参数是接收 DC 呈现器目标引用的指针的地址。

      下面的代码创建一个 DC 呈现器目标。

    // Create a DC render target.
    D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
        D2D1_RENDER_TARGET_TYPE_DEFAULT,
        D2D1::PixelFormat(
            DXGI_FORMAT_B8G8R8A8_UNORM,
            D2D1_ALPHA_MODE_IGNORE),
        0,
        0,
        D2D1_RENDER_TARGET_USAGE_NONE,
        D2D1_FEATURE_LEVEL_DEFAULT
        );
    
    hr = m_pD2DFactory->CreateDCRenderTarget(&props, &m_pDCRT);

      在前面的代码中,m_pD2DFactory 是一个指向 ID2D1Factory 的指针,而 m_pDCRT 是一个指向 ID2D1DCRenderTarget 的指针。

      必须先使用 DC 呈现器目标的 BindDC 方法将该目标与 GDI DC 关联,然后才能使用该目标进行呈现。每次使用不同的 DC 时,或者所要绘制的区域大小发生变化时,都要执行此操作。

      BindDC 方法使用两个参数:hDC 和 pSubRecthDC 参数提供一个设备上下文的句柄,该设备上下文用于接收呈现器目标的输出。pSubRect 参数是一个矩形,描述了用来呈现内容的设备上下文区域。如果 pSubRect 所描述的设备上下文区域改变了大小,DC 呈现器目标也将更新大小,以便与设备上下文区域相匹配。

      下面的代码将 DC 绑定到 DC 呈现器目标。

    HRESULT DemoApp::OnRender(const PAINTSTRUCT &ps)
    {
    // Get the dimensions of the client drawing area.
    GetClientRect(m_hwnd, &rc);
    // Bind the DC to the DC render target.
    hr = m_pDCRT->BindDC(ps.hdc, &rc);

      将 DC 呈现器目标与 DC 关联后,就可以使用该 DC 进行绘制。下面的代码使用 DC 来绘制 Direct2D 和 GDI 内容。有关完整代码,请参见Direct2D/GDI 互操作性示例

    HRESULT DemoApp::OnRender(const PAINTSTRUCT &ps)
    {
    
        HRESULT hr;
        RECT rc;
    
        // Get the dimensions of the client drawing area.
        GetClientRect(m_hwnd, &rc);
    
        //
        // Draw the pie chart with Direct2D.
        //
    
        // Create the DC render target.
        hr = CreateDeviceResources();
    
        if (SUCCEEDED(hr))
        {
            // Bind the DC to the DC render target.
            hr = m_pDCRT->BindDC(ps.hdc, &rc);
    
            m_pDCRT->BeginDraw();
    
            m_pDCRT->SetTransform(D2D1::Matrix3x2F::Identity());
    
            m_pDCRT->Clear(D2D1::ColorF(D2D1::ColorF::White));
    
            m_pDCRT->DrawEllipse(
                D2D1::Ellipse(
                    D2D1::Point2F(150.0f, 150.0f),
                    100.0f,
                    100.0f),
                m_pBlackBrush,
                3.0
                );
    
            m_pDCRT->DrawLine(
                D2D1::Point2F(150.0f, 150.0f),
                D2D1::Point2F(
                    (150.0f + 100.0f * 0.15425f),
                    (150.0f - 100.0f * 0.988f)),
                m_pBlackBrush,
                3.0
                );
    
            m_pDCRT->DrawLine(
                D2D1::Point2F(150.0f, 150.0f),
                D2D1::Point2F(
                    (150.0f + 100.0f * 0.525f),
                    (150.0f + 100.0f * 0.8509f)),
                m_pBlackBrush,
                3.0
                );
    
            m_pDCRT->DrawLine(
                D2D1::Point2F(150.0f, 150.0f),
                D2D1::Point2F(
                    (150.0f - 100.0f * 0.988f),
                    (150.0f - 100.0f * 0.15425f)),
                m_pBlackBrush,
                3.0
                );
    
            hr = m_pDCRT->EndDraw();
            if (SUCCEEDED(hr))
            {
                //
                // Draw the pie chart with GDI.
                //
    
                // Save the original object.
                HGDIOBJ original = NULL;
                original = SelectObject(
                    ps.hdc,
                    GetStockObject(DC_PEN)
                    );
    
                HPEN blackPen = CreatePen(PS_SOLID, 3, 0);
                SelectObject(ps.hdc, blackPen);
    
                Ellipse(ps.hdc, 300, 50, 500, 250);
    
                POINT pntArray1[2];
                pntArray1[0].x = 400;
                pntArray1[0].y = 150;
                pntArray1[1].x = static_cast<LONG>(400 + 100 * 0.15425);
                pntArray1[1].y = static_cast<LONG>(150 - 100 * 0.9885);
    
                POINT pntArray2[2];
                pntArray2[0].x = 400;
                pntArray2[0].y = 150;
                pntArray2[1].x = static_cast<LONG>(400 + 100 * 0.525);
                pntArray2[1].y = static_cast<LONG>(150 + 100 * 0.8509);
    
    
                POINT pntArray3[2];
                pntArray3[0].x = 400;
                pntArray3[0].y = 150;
                pntArray3[1].x = static_cast<LONG>(400 - 100 * 0.988);
                pntArray3[1].y = static_cast<LONG>(150 - 100 * 0.15425);
    
                Polyline(ps.hdc, pntArray1, 2);
                Polyline(ps.hdc, pntArray2, 2);
                Polyline(ps.hdc, pntArray3, 2);
    
                DeleteObject(blackPen);
    
                // Restore the original object.
                SelectObject(ps.hdc, original);
            }
        }
    
        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    
        return hr;
    }

      此代码生成以下输出(添加的标注用于强调 Direct2D 和 GDI 呈现方式之间的差别。)

     

     

    0X02 ID2D1DCRenderTargets、GDI转换以及从右向左书写语言版本的Windows:

      在使用 ID2D1DCRenderTarget 时,它会将把 Direct2D 内容呈现到一个内部位图,然后通过 GDI 将该位图呈现到 DC。

      GDI 能够将 GDI 转换(通过 SetWorldTransform 方法)或其他效果应用于呈现器目标使用的同一 DC,在此情况下,GDI 将对 Direct2D 生成的位图进行转换。使用 GDI 转换来转换 Direct2D 内容可能会使输出的视觉质量下降,因为所转换的是已对抗锯齿和子像素定位进行计算的位图。

      例如,假设您使用呈现器目标来绘制一个包含抗锯齿几何图形和文本的场景。如果使用 GDI 转换来向 DC 应用缩放转换,并对场景进行缩放以使其放大 10 倍,那么您将看到像素化和参差不齐的边缘。(但是,如果使用 Direct2D 应用类似的转换,则不会降低场景的视觉质量。)

      在某些情况下,GDI 正在执行的其他处理可能会降低 Direct2D 内容的质量,但这种情况可能并不显而易见。例如,在从右向左书写语言 (RTL) 版本的 Windows 中,由 ID2D1DCRenderTarget 呈现的内容可能会在 GDI 将其复制到目标时发生水平反转。内容实际上是否反转取决于 DC 的当前设置。

      您可能需要防止发生这种反转,具体取决于正在呈现的内容的类型。如果 Direct2D 内容包含 ClearType 文本,则这种反转将会降低文本质量。

      您可使用 SetLayout GDI 函数来控制 RTL 呈现行为。若要防止这种镜像,请调用 SetLayout GDI 函数,并将 LAYOUT_BITMAPORIENTATIONPRESERVED 指定为第二个参数的唯一值(请勿将其与 LAYOUT_RTL 组合),如以下示例所示:

    SetLayout(m_hwnd, LAYOUT_BITMAPORIENTATIONPRESERVED);

     

    0X03 将GDI内容绘制到与Direct2D GDI兼容的呈现器目标:

      上一部分说明如何将 Direct2D 内容绘制到 GDI DC。也可以将 GDI 内容绘制到与 Direct2D GDI 兼容的呈现器目标。此方法对于主要使用 Direct2D 来呈现的应用程序很有用,但有一些扩展模型或其他旧内容需要使用 GDI 来呈现。

      要将 GDI 内容呈现到与 Direct2D GDI 兼容的呈现器目标,请使用 ID2D1GdiInteropRenderTarget,通过它可以访问可接受 GDI 绘制调用的设备上下文。与其他接口不同,此接口不会直接创建 ID2D1GdiInteropRenderTarget 对象。而是使用现有呈现器目标实例的 QueryInterface 方法。下面的代码演示如何执行此操作:

    D2D1_RENDER_TARGET_PROPERTIES rtProps = D2D1::RenderTargetProperties();
            rtProps.usage =  D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE;
    
            // Create a GDI compatible Hwnd render target.
            hr = m_pD2DFactory->CreateHwndRenderTarget(
                rtProps,
                D2D1::HwndRenderTargetProperties(m_hwnd, size),
                &m_pRenderTarget
                );
    
    
            if (SUCCEEDED(hr))
            {
                hr = m_pRenderTarget->QueryInterface(__uuidof(ID2D1GdiInteropRenderTarget), (void**)&m_pGDIRT); 
            }

      在前面的代码中,m_pD2DFactory 是一个指向 ID2D1Factory 的指针,而 m_pGDIRT 是一个指向 ID2D1GdiInteropRenderTarget 的指针。

      请注意,在创建与 Hwnd GDI 兼容的呈现器目标时,指定了 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 标志。如果需要像素格式,请使用 DXGI_FORMAT_B8G8R8A8_UNORM(可能为英文网页)。如果需要 Alpha 模式,请使用 D2D1_ALPHA_MODE_PREMULTIPLIED 或D2D1_ALPHA_MODE_IGNORE

      以下示例显示如何将饼图(GDI 内容)绘制到与 Hwnd GDI 兼容的呈现器目标。

    HDC hDC = NULL;
            hr = m_pGDIRT->GetDC(D2D1_DC_INITIALIZE_MODE_COPY, &hDC);
    
            if (SUCCEEDED(hr))
            {
                // Draw the pie chart to the GDI render target associated with the Hwnd render target.
                HGDIOBJ original = NULL;
                original = SelectObject(
                    hDC,
                    GetStockObject(DC_PEN)
                    );
    
                HPEN blackPen = CreatePen(PS_SOLID, 3, 0);
                SelectObject(hDC, blackPen);
    
                Ellipse(hDC, 300, 50, 500, 250);
    
                POINT pntArray1[2];
                pntArray1[0].x = 400;
                pntArray1[0].y = 150;
                pntArray1[1].x = static_cast<LONG>(400 + 100 * 0.15425);
                pntArray1[1].y = static_cast<LONG>(150 - 100 * 0.9885);
    
                POINT pntArray2[2];
                pntArray2[0].x = 400;
                pntArray2[0].y = 150;
                pntArray2[1].x = static_cast<LONG>(400 + 100 * 0.525);
                pntArray2[1].y = static_cast<LONG>(150 + 100 * 0.8509);
    
                POINT pntArray3[2];
                pntArray3[0].x = 400;
                pntArray3[0].y = 150;
                pntArray3[1].x = static_cast<LONG>(400 - 100 * 0.988);
                pntArray3[1].y = static_cast<LONG>(150 - 100 * 0.15425);
    
                Polyline(hDC, pntArray1, 2);
                Polyline(hDC, pntArray2, 2);
                Polyline(hDC, pntArray3, 2);
    
                DeleteObject(blackPen);
    
                // Restore the original object.
                SelectObject(hDC, original);
    
                m_pGDIRT->ReleaseDC(NULL);
            }

      该代码输出以下饼图(含标注,用于强调呈现质量上的差别)。右侧的饼图(GDI 内容)的呈现质量低于左侧的饼图(Direct2D 内容)。这是由于 Direct2D 使用 GPU,而 GDI 使用 CPU。

     

     

     

     

     

     

     

     

     

      

     

    展开全文
  • [Direct2D1.1教程] Direct2D特效概览

    千次阅读 2017-02-11 12:15:40
      一、概述 Direct2D是一个基于...但是使用过老版本Direct2D的朋友应该都会发现,如果你想使用它来实现2D图形效果很困难,只能用来做一些基本的绘制和变换。但是最近看了msdn上面Direct2D有了1.1和1.3版本,这些

    转载请注明出处:http://www.cnblogs.com/Ray1024

     

    一、概述

    Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染。但是使用过老版本Direct2D的朋友应该都会发现,如果你想使用它来实现2D图形效果很困难,只能用来做一些基本的绘制和变换。但是最近看了msdn上面Direct2D有了1.1和1.3版本,这些版本提供了更丰富的功能,但是只有英文文档,所以大家可能对这些功能不是很熟悉。在这一系列教程中,将详细介绍Direct2D新版本的内容,让大家更方便地使用Direct2D来进行2D渲染工作。

    在Direct2D1.1中,我们可以对图片应用高质量的特效,这些特效基于Direct3D11,可以发挥出GPU在图像处理方面的优势,比如着色器的使用等等。这些特效可以分为两种:内置特效和自定义特效。它们应用于任何位图,包括:Windows图像组件(WIC)加载的图像,Direct2D绘制的位图,DirectWrite中的文本或Direct3D渲染的场景。我们可以在实际应用中使用Direct2D特效来实现我们想要的一些效果。

     

    二、Direct2D1.1内置特效概览

    Direct2D1.1的内置特效有很多,大致可以分为以下几类:

      - Filtering滤镜

      - Composition and Blending组合和混合

      - Transparency透明度

      - Color颜色

      - Lighting and Stylizing光照

      - Transforming and Scaling平移和缩放

      - Sources来源

    在这里我们只挑出几个内置特效,把效果图展示给大家,让大家体验一下Direct2D可以实现的一些图片渲染效果,不做过多的介绍。

     

    (1)离散传递效果(Discrete transfer effect)

     

    (2)色调旋转效果(Hue rotatation effect)

     
    (3)线性传递效果(Linear transfer effect)
     
    (4)卷积矩阵效果(Convolve matrix effect)
     
    (5)高斯模糊效果(Gaussian blur effect)
     
    (6)形貌效果(Morphology effect)
     
    (7)波动效果(Displacement map effect)
     
    (8)阴影效果(Shadow effect)
     
    (9)浮雕效果(Emboss Effect)
     
     
    (10)边缘检测效果(Edge Detection Effect)
     
    (11)曝光效果(Exposure Effect)
     
    (12)灰度效果(Grayscale effect)
     
    (13)高亮和阴影效果(Highlights and Shadows Effect )
     
    (14)反转效果(Invert effect)
     
    (15)棕褐色调效果——怀旧风格(Sepia Effect)
     
    (16)锐化效果(Sharpen Effect)
     
    (17)晕印效果(Vignette Effect)
     

     

    三、结语

    看到这里是不是对Direct2D有些刮目相看了?是的,最初刚看到这些我也是眼前一亮,很让人兴奋是不是。在之后的教程中,我将为大家详细介绍这些Direct2D1.1中的内置特效。

     

    展开全文
  • 一、概述 ...但是使用过老版本Direct2D的朋友应该都会发现,如果你想使用它来实现2D图形效果很困难,只能用来做一些基本的绘制和变换。但是最近看了msdn上面Direct2D有了1.1和1.3版本,这些...

    转载请注明出处:http://www.cnblogs.com/Ray1024

     

    一、概述

    Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染。但是使用过老版本Direct2D的朋友应该都会发现,如果你想使用它来实现2D图形效果很困难,只能用来做一些基本的绘制和变换。但是最近看了msdn上面Direct2D有了1.1和1.3版本,这些版本提供了更丰富的功能,但是只有英文文档,所以大家可能对这些功能不是很熟悉。在这一系列教程中,将详细介绍Direct2D新版本的内容,让大家更方便地使用Direct2D来进行2D渲染工作。

    在Direct2D1.1中,我们可以对图片应用高质量的特效,这些特效基于Direct3D11,可以发挥出GPU在图像处理方面的优势,比如着色器的使用等等。这些特效可以分为两种:内置特效和自定义特效。它们应用于任何位图,包括:Windows图像组件(WIC)加载的图像,Direct2D绘制的位图,DirectWrite中的文本或Direct3D渲染的场景。我们可以在实际应用中使用Direct2D特效来实现我们想要的一些效果。

     

    二、Direct2D1.1内置特效概览

    Direct2D1.1的内置特效有很多,大致可以分为以下几类:

      - Filtering滤镜

      - Composition and Blending组合和混合

      - Transparency透明度

      - Color颜色

      - Lighting and Stylizing光照

      - Transforming and Scaling平移和缩放

      - Sources来源

    在这里我们只挑出几个内置特效,把效果图展示给大家,让大家体验一下Direct2D可以实现的一些图片渲染效果,不做过多的介绍。

     

    (1)离散传递效果(Discrete transfer effect)

     

    (2)色调旋转效果(Hue rotatation effect)

     
    (3)线性传递效果(Linear transfer effect)
     
    (4)卷积矩阵效果(Convolve matrix effect)
     
    (5)高斯模糊效果(Gaussian blur effect)
     
    (6)形貌效果(Morphology effect)
     
    (7)波动效果(Displacement map effect)
     
    (8)阴影效果(Shadow effect)
     
    (9)浮雕效果(Emboss Effect)
     
     
    (10)边缘检测效果(Edge Detection Effect)
     
    (11)曝光效果(Exposure Effect)
     
    (12)灰度效果(Grayscale effect)
     
    (13)高亮和阴影效果(Highlights and Shadows Effect )
     
    (14)反转效果(Invert effect)
     
    (15)棕褐色调效果——怀旧风格(Sepia Effect)
     
    (16)锐化效果(Sharpen Effect)
     
    (17)晕印效果(Vignette Effect)
     

     

    三、结语

    看到这里是不是对Direct2D有些刮目相看了?是的,最初刚看到这些我也是眼前一亮,很让人兴奋是不是。在之后的教程中,我将为大家详细介绍这些Direct2D1.1中的内置特效。

     

    转载于:https://www.cnblogs.com/Ray1024/p/6308915.html

    展开全文
  • Direct2D编程例子

    2016-06-29 10:44:06
    该例子是一个基于visual Stuido 2015的一个Direct2D的实际例子,该例子实现了Direct2D的图形绘制,文字显示,2D动画显示,图像显示,图形动画等内容,是学习Direct2D编程比较好的完整的程序,采用c/C++语言编写。...
  • 我在家无聊就学习了Direct2D,这篇笔记写了一些代码、注释、心得。由于时间关系,文章的更新看造化了。 有条件的可以去看视频学习:https://www.youtube.com/user/WhatsACreel/videos有关Direct2D的视频。 接下来...

    武汉加油!

    我在家无聊就学习了Direct2D,这篇笔记写了一些代码、注释、心得。由于时间关系,文章的更新看造化了。

    有条件的可以去看视频学习:https://www.youtube.com/user/WhatsACreel/videos有关Direct2D的视频。

    接下来开始正文。

     

    如果转载本文,请在第一行注明本文链接

     

    为了便于操作、自定义绘图,就先添加个类,叫 Graphics 。先向里面添加

    private:
    	ID2D1Factory *factory;
    	ID2D1HwndRenderTarget *renderTarget;
    	ID2D1SolidColorBrush *brush;

    factory里面主要包含Direct2D资源等内容,renderTarget包含了绘图的函数等,主要的绘图操作也是通过renderTarget实现的。

    然后在构造函数中赋值NULL

    Graphics::Graphics()
    {
    	factory = NULL;
    	renderTarget = NULL;
    	brush = NULL;
    }

    由于这些是调用的COM,所以需要释放资源。在析构函数中都用Release()释放

    Graphics::~Graphics()
    {
    	if (factory) factory->Release();
    	if (renderTarget) factory->Release();
    	if (brush) factory->Release();
    }

    做好了这些基础工作,就可以创建资源了,添加一个函数Init(HWND hWnd),hWnd是对话框的句柄,添加初始化代码

    bool Graphics::Init(HWND hWnd)
    {
    	// 创建单线程的factory
    	if (!(S_OK == D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory)))
    		return false; // 创建失败
    
    	CRect rect;
    	GetClientRect(hWnd, &rect); // 获取窗口大小
    	if (!(S_OK == factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
    		D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU(rect.right, rect.bottom)),
    		&renderTarget))) // 创建renderTarget
    		return false; // 创建失败
    
    	// 创建画刷,因为后面可以用SetColor设置颜色,所以先创建个黑画刷
    	if (!(S_OK == renderTarget->CreateSolidColorBrush(D2D1::ColorF(0, 0, 0), &brush)))
    		return false; // 创建失败
    
    	return true; // 创建成功
    }

    然后添加BeginDraw()和EndDraw(),因为就一行代码,我就直接放在Graphics.h中了

    	void BeginDraw() { renderTarget->BeginDraw(); } // 开始绘画
    	void EndDraw() { renderTarget->EndDraw(); } // 结束绘画

    绘画后需要清理,就添加一个函数ClearScreen(float r, float g, float b),r g b是填充的颜色的三基色

    void Graphics::ClearScreen(float r, float g, float b)
    {
    	renderTarget->Clear(D2D1::ColorF(r, g, b));
    }

    现在就可以绘画了,比如画个圆,添加一个函数DrawCircle(float x, float y, float radius, float r, float g, float b, float a),x y是圆的坐标,radius是半径,r g b a 是颜色和透明度。

    void Graphics::DrawCircle(float x, float y, float radius, float r, float g, float b, float a)
    {
    	brush->SetColor(D2D1::ColorF(r,g,b,a)); // RGBA
    	renderTarget->DrawEllipse(D2D1::Ellipse(D2D1::Point2F(x, y), radius, radius), brush, 3.0f); // 两个radius画正圆,3.0f是画刷粗细
    }

     

    类做的差不多了,现在只要在主对话框类中调用就行了

    我用的是动态创建Graphics类,现在.h中添加

    	Graphics *graphics;

    然后在.cpp的OnInitDialog()中添加

    	graphics = new Graphics;
    	if (!graphics->Init(m_hWnd))
    	{
    		AfxMessageBox(_T("创建Graphics失败"));
    		delete graphics;
    		EndDialog(-1);
    	}

    为了画图方便,我在主对话框类中添加函数Draw()

    void CMFCD2D2Dlg::Draw()
    {
    	if (graphics)
    	{
    		graphics->BeginDraw(); // 开始绘画
    
    		graphics->ClearScreen(0.0f, 0.0f, 0.0f); // 清除
    		
    		CRect rect;
    		GetClientRect(&rect);
    		int i = 0;
    		// 画1000个随机位置、随机大小、随机颜色、随机透明度的圆
    		for (; i < 1000; i++)
    			graphics->DrawCircle(rand() % rect.Width() * 1.0f, // 随机x坐标
    				rand() % rect.Height() * 1.0f, // 随机y坐标
    				rand() % 100, // 随机半径(0-100)
    				rand() % 100 / 100.0f, // 随机red
    				rand() % 100 / 100.0f, // 随机green
    				rand() % 100 / 100.0f, // 随机blue
    				rand() % 100 / 100.0f); // 随机alpha
    		
    		graphics->EndDraw(); // 结束绘画
    	}
    }

    然后在OnPaint()中调用 Draw();

    如果需要做到改变窗口大小时自动适应,需要添加消息函数 WM_SIZE 和 WM_SIZING ,但是这里出现了个问题,就是在这两个消息对应函数调用 Draw(); 时画的是椭圆,而且绘画范围会和窗口大小有点出入。所以要重新设置窗口大小。就在Graphics中添加个用来设置窗口大小的函数Resize(HWND hWnd)

    void Graphics::Resize(HWND hWnd)
    {
    	CRect rect;
    	GetClientRect(hWnd, &rect);
    	renderTarget->Resize(D2D1::SizeU(rect.right, rect.bottom));
    }

    然后在OnSize和OnSizing中添加 graphics->Resize(m_hWnd); 就行了

    那么如果想做个游戏,想要动态的画面,怎么弄呢?总不能被动地调用绘画了吧?也就是要主动绘画了,所以我就用 WM_TIMER 实现了主动绘画,我做的是60fps的绘画(一般60fps就够了,如果要更好,也可以120fps,看自己需要)。就在OnInitDialog()中

    	SetTimer(0, 1000 / 60, NULL);

    这里就不解释了。然后添加消息映射函数,执行 Draw(); 就行了

    void CMFCD2D2Dlg::OnTimer(UINT_PTR nIDEvent)
    {
    	switch (nIDEvent)
    	{
    	case 0:
    	{
    		Draw();
    		break;
    	}
    	default:
    		break;
    	}
    
    	CDialogEx::OnTimer(nIDEvent);
    }

    当然你也可以新建一个专门用于绘画的线程来 Draw(); 这里就不多说了

     

    这里写下全部代码:

    Graphics.h:

    #pragma once
    class Graphics
    {
    private:
    	ID2D1Factory *factory;
    	ID2D1HwndRenderTarget *renderTarget;
    	ID2D1SolidColorBrush *brush;
    public:
    	Graphics();
    	~Graphics();
    	void BeginDraw() { renderTarget->BeginDraw(); }
    	void EndDraw() { renderTarget->EndDraw(); }
    	bool Init(HWND hWnd);
    	void ClearScreen(float r, float g, float b);
    	void DrawCircle(float x, float y, float radius, float r, float g, float b, float a = 1.0f);
    	void Resize(HWND hWnd);
    };

    Graphics.cpp:

    #include "stdafx.h"
    #include "Graphics.h"
    
    
    Graphics::Graphics()
    {
    	factory = NULL;
    	renderTarget = NULL;
    	brush = NULL;
    }
    
    
    Graphics::~Graphics()
    {
    	if (factory) factory->Release();
    	if (renderTarget) factory->Release();
    	if (brush) factory->Release();
    }
    
    bool Graphics::Init(HWND hWnd)
    {
    	if (!(S_OK == D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory)))
    		return false;
    
    	CRect rect;
    	GetClientRect(hWnd, &rect);
    	if (!(S_OK == factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
    		D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU(rect.right, rect.bottom)),
    		&renderTarget)))
    		return false;
    
    	if (!(S_OK == renderTarget->CreateSolidColorBrush(D2D1::ColorF(0, 0, 0), &brush)))
    		return false;
    
    	return true;
    }
    
    void Graphics::ClearScreen(float r, float g, float b)
    {
    	renderTarget->Clear(D2D1::ColorF(r, g, b));
    }
    
    void Graphics::DrawCircle(float x, float y, float radius, float r, float g, float b, float a)
    {
    	brush->SetColor(D2D1::ColorF(r,g,b,a));
    	renderTarget->DrawEllipse(D2D1::Ellipse(D2D1::Point2F(x, y), radius, radius), brush, 3.0f);
    }
    
    
    void Graphics::Resize(HWND hWnd)
    {
    	CRect rect;
    	GetClientRect(hWnd, &rect);
    	renderTarget->Resize(D2D1::SizeU(rect.right, rect.bottom));
    }
    

    MFCD2D2Dlg.h

    
    // MFCD2D2Dlg.h: 头文件
    //
    
    #include "Graphics.h"
    
    #pragma once
    
    
    // CMFCD2D2Dlg 对话框
    class CMFCD2D2Dlg : public CDialogEx
    {
    // 构造
    public:
    	CMFCD2D2Dlg(CWnd* pParent = nullptr);	// 标准构造函数
    
    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    	enum { IDD = IDD_MFCD2D2_DIALOG };
    #endif
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
    
    
    // 实现
    protected:
    	HICON m_hIcon;
    	Graphics *graphics;
    
    	// 生成的消息映射函数
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnDestroy();
    	void Draw();
    	afx_msg void OnSize(UINT nType, int cx, int cy);
    	afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
    	afx_msg void OnTimer(UINT_PTR nIDEvent);
    };
    

    MFCD2D2Dlg.cpp

    
    // MFCD2D2Dlg.cpp: 实现文件
    //
    
    #include "stdafx.h"
    #include "MFCD2D2.h"
    #include "MFCD2D2Dlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    
    class CAboutDlg : public CDialogEx
    {
    public:
    	CAboutDlg();
    
    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    	enum { IDD = IDD_ABOUTBOX };
    #endif
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    // 实现
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CMFCD2D2Dlg 对话框
    
    
    
    CMFCD2D2Dlg::CMFCD2D2Dlg(CWnd* pParent /*=nullptr*/)
    	: CDialogEx(IDD_MFCD2D2_DIALOG, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CMFCD2D2Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CMFCD2D2Dlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_WM_DESTROY()
    	ON_WM_SIZE()
    	ON_WM_SIZING()
    	ON_WM_TIMER()
    END_MESSAGE_MAP()
    
    
    // CMFCD2D2Dlg 消息处理程序
    
    BOOL CMFCD2D2Dlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != nullptr)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	SetTimer(0, 1000 / 60, NULL);
    
    	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	graphics = new Graphics;
    	if (!graphics->Init(m_hWnd))
    	{
    		AfxMessageBox(_T("创建Graphics失败"));
    		delete graphics;
    		EndDialog(-1);
    	}
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CMFCD2D2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CMFCD2D2Dlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作区矩形中居中
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    	//	CDialogEx::OnPaint();
    		Draw();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CMFCD2D2Dlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CMFCD2D2Dlg::OnDestroy()
    {
    	CDialogEx::OnDestroy();
    
    	delete graphics;
    }
    
    
    void CMFCD2D2Dlg::Draw()
    {
    	if (graphics)
    	{
    		graphics->BeginDraw();
    
    		graphics->ClearScreen(0.0f, 0.0f, 0.0f);
    
    		// 随机画1000个随机圆
    		CRect rect;
    		GetClientRect(&rect);
    		int i = 0;
    		for (; i < 1000; i++)
    			graphics->DrawCircle(rand() % rect.Width() * 1.0f, rand() % rect.Height() * 1.0f, rand() % 100, rand() % 100 / 100.0f, rand() % 100 / 100.0f, rand() % 100 / 100.0f, rand() % 100 / 100.0f);
    
    		graphics->EndDraw();
    	}
    }
    
    
    void CMFCD2D2Dlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialogEx::OnSize(nType, cx, cy);
    
    	if(graphics)
    		graphics->Resize(m_hWnd);
    	Draw();
    }
    
    
    void CMFCD2D2Dlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
    	CDialogEx::OnSizing(fwSide, pRect);
    
    	if (graphics)
    		graphics->Resize(m_hWnd);
    	Draw();
    }
    
    
    void CMFCD2D2Dlg::OnTimer(UINT_PTR nIDEvent)
    {
    	switch (nIDEvent)
    	{
    	case 0:
    	{
    		Draw();
    		break;
    	}
    	default:
    		break;
    	}
    
    	CDialogEx::OnTimer(nIDEvent);
    }
    

     

    其他的内容就等以后更新了,也不知道是什么时候了。

     

    由于我只是个业余的,笔记可能有表述错误、代码不优化等问题,欢迎评论指正!

    展开全文
  • Direct2D烟花程序

    2019-08-07 16:04:10
    使用Direct2D写的一个烟花小程序,可以手动设置参数 如炮弹速度、爆炸粒子数量、粒子颜色范围等
  • Direct2D 简介

    2019-09-17 21:15:06
    Direct2D是什么? Direct2D是一套高性能的硬件加速API(代码运行在GPU),用于渲染几何图形,图片和文本,并且可以与Direct3D,GDI,GDI+交互。 什么程序员应该使用Direct2D? 开发企业级大型native应用...
  • MFC direct2d 混编

    2019-12-08 16:12:06
    MFC direct2d 混编,演示创建一个绘制文本的static控件。传统的Static控件文本绘制容易闪烁,解决此类问题需要用双缓冲,而direct2d技术则默认是双缓冲,并且异常高效。
  • direct2d-lg32-源码

    2021-03-25 19:49:01
    direct2d-lg32
  • Direct2d / DirectWrite

    2020-12-05 16:44:33
    Does it support Direct2d? Or, rather, is Direct2d the recommended API to use for immediate mode graphics? <p>Thanks!</p><p>该提问来源于开源项目:microsoft/cppwinrt</p></div>
  • Direct2D1.1.rar 易语言源码
  • Direct2D Demo

    2013-10-23 11:17:20
    Direct2D 开发的例程,原始代码使用vs2012开发,所以编译环境需要是Vs2012及以上
  • Direct2D编程介绍

    2016-06-29 10:21:15
    该文档介绍了如何使用Direct2D编写2D动画,绘制图形及实现图形动画以及如何使用DirectWrite显示文字等,具有很强的针对性和实用性。
  • Direct2D based rendering

    2021-01-04 12:10:07
    <div><p>Use Direct2D (SharpDX) to speed up rendering for WPF. <p><strong><a href="http://www.codeplex.com/site/users/view/objo">objo</a></strong> 2014-03-17 09:33 See see ...
  • Direct2D Dwrite 绘制文本

    2018-03-30 15:43:38
    Direct2D Dwrite 绘制文本,线性画刷绘制文本内容,可以设置文字透明度等。
  • 关于Direct2D

    2017-09-13 10:54:13
    ㈠ 关于Direct2D  Direct2D是一个硬件加速的,提供立即模式的二维图形API。它提供了二维的几何体,位图,文本的高性能,高质量的渲染。十分方便的是,Direct2D与GDI,GDI+和D3D都是可以交互的。一项技术总是有其...
  • Direct2d effects

    千次阅读 2013-06-07 22:54:15
    Direct2d effectsThe Direct2D effects API is an addition to Direct2D that provides image effect processing. Direct2D effects is GPU accelerated, immediate-mode, and is integrated with Direct2D.With ...
  • Migrate to newer direct2d

    2020-12-28 11:14:58
    re using <a href="https://crates.io/crates/direct2d">direct2d 0.2.0</a>. There are a number of problems with this, including excess debug logging on paths, not being able to set the closed/open status...
  • Direct2D简介

    2019-09-29 20:36:23
    Direct2D是一套高性能、高质量的2D图形渲染接口,它的出现主要是为了满足以下的开发: 1 大型的企业级本地应用开发 2 控件库或者是控件工具包开发人员 3 服务端2D图形渲染 4 在D3D中进行2D绘制,主要是为了实现...
  • Direct2D相关

    2020-12-11 18:57:15
    PaintToHDC: ...https://docs.microsoft.com/zh-cn/windows/win32/direct2d/devices-and-device-contexts About MFC: https://docs.microsoft.com/zh-cn/cpp/mfc/w
  • Direct 2d 应用

    2010-10-12 11:20:25
    一个使用direct2d 应用的demo。
  • Direct2D1.1模板

    2014-08-27 19:34:45
    Direct2D 1.1 开发笔记 准备篇(一) 初始化》附带资源
  • 关于 Direct2D

    2015-01-05 16:28:00
    本主题介绍 Direct2D,这是 Windows 7 的全新二维图形 API。使用 Direct2D,Win32 开发人员可在执行二维图形呈现任务时获得出色的性能和视觉效果。 什么是 Direct2DDirect2D 是一种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,290
精华内容 916
关键字:

direct2d