演练:向 MFC 项目添加 D2D 对象

本演练介绍如何将基本 Direct2D (D2D) 对象添加到 Visual C++、Microsoft 基础类库 (MFC) 项目,然后将项目生成到在渐变背景上打印“Hello, World!”的应用程序中。

演练演示了如何完成这些任务:

  • 创建 MFC 应用程序。

  • 创建纯色画笔和线性渐变画笔。

  • 修改渐变画笔,使其在调整窗口大小时进行相应更改。

  • 实现 D2D 绘制处理程序。

  • 验证结果。

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

先决条件

若要完成本演练,必须在 Visual Studio 中安装使用 C++ 的桌面开发工作负载以及可选的 Visual C++MFC for x86 和 x64 组件

创建 MFC 应用程序

  1. 使用 MFC 应用程序向导创建 MFC 应用程序。 有关如何为 Visual Studio 版本打开向导的说明,请参阅演练:使用新的 MFC Shell 控件

  2. 在“名称”框中,键入“MFCD2DWalkthrough”。 选择确定

  3. 在“MFC 应用程序向导”中,在不更改任何设置的情况下选择“完成”

创建纯色画笔和线性渐变画笔

  1. 在解决方案资源管理器中,在 MFCD2DWalkthrough 项目的“头文件”文件夹中,打开 MFCD2DWalkthroughView.h。 将此代码添加到 CMFCD2DWalkthroughView 类以创建三个数据变量:

    CD2DTextFormat* m_pTextFormat;
    CD2DSolidColorBrush* m_pBlackBrush;
    CD2DLinearGradientBrush* m_pLinearGradientBrush;
    

    保存文件并将其关闭。

  2. 在“源文件”文件夹中,打开 MFCD2DWalkthroughView.cpp。 在 CMFCD2DWalkthroughView 类的构造函数中,添加以下代码:

    // Enable D2D support for this window:
    EnableD2DSupport();
    
    // Initialize D2D resources:
    m_pBlackBrush = new CD2DSolidColorBrush(
        GetRenderTarget(),
        D2D1::ColorF(D2D1::ColorF::Black));
    
    m_pTextFormat = new CD2DTextFormat(
        GetRenderTarget(),
        _T("Verdana"),
        50);
    
    m_pTextFormat->Get()->SetTextAlignment(
        DWRITE_TEXT_ALIGNMENT_CENTER);
    
    m_pTextFormat->Get()->SetParagraphAlignment(
        DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
    
    D2D1_GRADIENT_STOP gradientStops[2];
    
    gradientStops[0].color =
        D2D1::ColorF(D2D1::ColorF::White);
    
    gradientStops[0].position = 0.f;
    gradientStops[1].color =
        D2D1::ColorF(D2D1::ColorF::Indigo);
    
    gradientStops[1].position = 1.f;
    
    m_pLinearGradientBrush = new CD2DLinearGradientBrush(
        GetRenderTarget(),
        gradientStops,
        ARRAYSIZE(gradientStops),
        D2D1::LinearGradientBrushProperties(
            D2D1::Point2F(0,0),
            D2D1::Point2F(0,0)));
    

    保存文件并将其关闭。

修改渐变画笔,使其在调整窗口大小时进行相应更改

  1. 在“项目”菜单上,选择“类向导”

  2. 在“MFC 类向导”的“类名称”下,选择 CMFCD2DWalkthroughView

  3. 在“消息”选项卡上的“消息”框中,选择 WM_SIZE,然后选择“添加处理程序”。 此操作将 OnSize 消息处理程序添加到 CMFCD2DWalkthroughView 类。

  4. 在“现有处理程序”框中,选择 OnSize。 选择“编辑代码”以显示 CMFCD2DWalkthroughView::OnSize 方法。 在该方法的末尾,添加以下代码。

    m_pLinearGradientBrush->SetEndPoint(CPoint(cx, cy));
    

    保存文件并将其关闭。

实现 D2D 绘制处理程序

  1. 在“项目”菜单上,选择“类向导”

  2. 在“MFC 类向导”的“类名称”下,选择 CMFCD2DWalkthroughView

  3. 在“消息”选项卡上,选择“添加自定义消息”

  4. 在“添加自定义消息”对话框中的“自定义 Windows 消息”框中,键入“AFX_WM_DRAW2D”。 在“消息处理程序名称”框中,键入“OnDraw2D”。 选择“已注册的消息”选项,然后选择“确定”。 此操作将 AFX_WM_DRAW2D 消息的消息处理程序添加到 CMFCD2DWalkthroughView 类。

  5. 在“现有处理程序”框中,选择 OnDraw2D。 选择“编辑代码”以显示 CMFCD2DWalkthroughView::OnDraw2D 方法。 将此代码用于 CMFCD2DWalkthroughView::OnDrawD2D 方法:

    afx_msg LRESULT CMFCD2DWalkthroughView::OnDraw2D(
        WPARAM wParam,
        LPARAM lParam)
    {
        CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*)lParam;
        ASSERT_VALID(pRenderTarget);
    
        CRect rect;
        GetClientRect(rect);
    
        pRenderTarget->FillRectangle(rect, m_pLinearGradientBrush);
    
        pRenderTarget->DrawText(
            _T("Hello, World!"),
            rect,
            m_pBlackBrush,
            m_pTextFormat);
    
        return TRUE;
    }
    

    保存文件并将其关闭。

验证结果

生成并运行应用程序。 其中应该有一个渐变矩形,调整窗口大小时会发生变化。 “Hello World!”应显示在矩形的中心。

另请参阅

演练