• 001:你好Direct 2D! 在对话框中初次使用D2D


    1、简介        

            对于如何提高2D的绘制效率,一直在进行着尝试。基于OpenGL的纹理贴出做过一些二维图像处理的工作,但相对麻烦些,需要由GDI/GDI+绘制后,在贴出去,麻烦,且由于OpenGL停止了更新,不支持多线程等原因,慢慢的继续做下去的动力就不足。无意间看到MSDN中关于Direct 2D的结论(现有 GDI 代码将继续在 Windows 7 下正常工作。 但是,编写新的图形呈现代码时,应考虑 Direct2D ,因为它更好地利用新式 GPU。),故而打算写一序列的博客,记录下学习和测试Direct2D编程和性能的内容。

    2、基于对话框的第一个 Direct 2D程序

            新建MFC对话框项目,项目名称自己写即可,本例子项目名称为:001D2DDialog,建好后,在解决方案中查看代码,如下所示

    “解决方案资源管理器”中的001_D2D_Dialog项目的“头文件”文件夹中,打开 001_D2D_DialogDlg.h。 将以下代码添加到 001_D2D_DialogDlg类以创建三个数据变量。

    1. CD2DTextFormat* m_pTextFormat;
    2. CD2DSolidColorBrush* m_pBlackBrush;
    3. CD2DLinearGradientBrush* m_pLinearGradientBrush;

    在001_D2D_DialogDlg.cpp中,在 001_D2D_DialogDlg类的构造函数中,添加以下代码:

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

    右键单击项目,在菜单上单击“类向导”,如下图:

     打开如下类向导窗口

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

    “现有处理程序”框中,选择 OnSize。 单击“编辑代码”以显示 001_D2D_DialogDlg::OnSize 方法。 在此方法的末尾,添加以下代码。

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

    在“消息”选项卡上,单击“添加自定义消息”。

    “添加自定义消息”对话框的“自定义 Windows 消息”框中,键入 AFX_WM_DRAW2D。 在“消息处理程序名称”框中,自动显示OnAfxWmDraw2d。 选择“已注册的消息”选项,然后单击“确定”。 此操作将 AFX_WM_DRAW2D 消息的消息处理程序添加到001_D2D_DialogDlg类。

     

    “现有处理程序”框中,选择 OnAfxWmDraw2d。 单击“编辑代码”以显示 001_D2D_DialogDlg::OnAfxWmDraw2d 方法。 对001_D2D_DialogDlg::OnAfxWmDraw2d 方法使用以下代码。

    1. afx_msg LRESULT CMy001D2DDialogDlg::OnAfxWmDraw2d(WPARAM wParam, LPARAM lParam)
    2. {
    3. CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*)lParam;
    4. ASSERT_VALID(pRenderTarget);
    5. CRect rect;
    6. GetClientRect(rect);
    7. pRenderTarget->FillRectangle(rect, m_pLinearGradientBrush);
    8. pRenderTarget->DrawText(_T("Hello, World!"), rect, m_pBlackBrush, m_pTextFormat);
    9. return 0;
    10. }

    3、显示效果

           生成并运行应用程序。 它应有一个在您调整窗口大小时更改的渐变矩形。“Hello World!”应显示在矩形中央。

    4、结束语 

             下一篇,将重点梳理下D2D的接口以及MFC对其的封装。

  • 相关阅读:
    openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw
    JUC并发编程系列详解篇十五(公平锁VS非公平锁)
    Lua中pair和ipair的区别
    前端开发需要会什么?先掌握这三大核心关键技术
    onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门
    陕西省助理评审申报,看这文章就够了
    474922-26-4,DSPE-PEG-NH2,DSPE-PEG-amine,磷脂-聚乙二醇-氨基饱和18C磷脂
    安全扫描项目
    历史性的时刻!OpenTiny 跨端、跨框架组件库正式升级 TypeScript,10 万行代码重获新生!
    Brooks曾经在UMLChina网站留过言-回忆和送别(1)
  • 原文地址:https://blog.csdn.net/yunzhaoqiang/article/details/126766307