使用 Direct2D & DirectWrite 的文本渲染
资 源 简 介
翻译maninwest@Codeforge 作者 Espen Harlinn @ Codeproject
这是描述在基于 Windows C 和 COM的 API 上直接构建代码时,如何通过 C++11 标准更加安全地进行C++开发的系列文章的第一篇。
本文章的重点是如何使用 std::shared_ptr<> 的可能程序设计风格和其他指针,而不是 Direct2D 和 DirectWrite。库包含一组包装 Direct2D 和 DirectWrite 的功能的类,并添加了几个重要特性:
错误转化成了例外
对 COM 接口的终身透明管理
演示应用实现了跟一个 DirectWrite SDK 例子相同的功能,且代码的大小大大减小 。
像我看这样的开发显示 3D 内容的应用的人通常习惯于可以随意处理 GPU。虽然使用 Direct3D 可以显示 2D 内容,但是我们在渲染几行文本,或者其他可以通过 GDI 或 GDI+ 轻松实现的东西时,通常不用它。
通过 Windows Vista Service Pack 2 和 Windows 7, 我们有了新的 API 可以使用名为 Direct2D 的 GPU 帮助实现 2D 渲染。 同时Microsoft 也引入了一个新的 API - DirectWrite, 支持文本渲染、跟分辨率无关的轮廓字体以及提供全部 Unicode文本和版式支持。
虽然 Direct2D 的DRK和 DirectWrite 提供了使用新 API 的基本所需,但是比较繁琐,我希望使用我的方法可以让你轻松了解。
文 件 列 表
Examples
Windows
HarlinnDiagramLib
dllmain.cpp
HarlinnDiagramLib.cpp
HarlinnDiagramLib.vcxproj
HarlinnDiagramLib.vcxproj.filters
HarlinnDiagramLib.vcxproj.vspscc
ReadMe.txt
stdafx.cpp
stdafx.h
targetver.h
x64
HarlinnGraph
dllmain.cpp
HarlinnGraph.cpp
HarlinnGraph.vcxproj
HarlinnGraph.vcxproj.filters
HarlinnGraph.vcxproj.vspscc
hgraphdef.h
ReadMe.txt
stdafx.cpp
stdafx.h
targetver.h
x64
HarlinnNumericsLib
cblas
HarlinnNumericsLib.cpp
HarlinnNumericsLib.vcxproj
HarlinnNumericsLib.vcxproj.filters
HarlinnNumericsLib.vcxproj.user
HarlinnNumericsLib.vcxproj.vspscc
hnumcolamd.h
hnumdef.h
hnummatrix.cpp
hnummatrix.h
hnum_await.cpp
hnum_cblas.h
hnum_cgscon.cpp
hnum_cgsequ.cpp
hnum_cgsrfs.cpp
hnum_cgstrs.cpp
hnum_clacon.cpp
hnum_clangs.cpp
hnum_claqgs.cpp
hnum_cmatgen.cpp
hnum_cmyblas2.cpp
hnum_colamd.cpp
hnum_colamd.h
hnum_cpivotgrowth.cpp
hnum_creadhb.cpp
hnum_creadmt.cpp
hnum_creadrb.cpp
hnum_csp_blas2.cpp
hnum_csp_blas3.cpp
hnum_dcomplex.cpp
hnum_dgscon.cpp
hnum_dgsequ.cpp
hnum_dgsrfs.cpp
hnum_dgstrs.cpp
hnum_dlacon.cpp
hnum_dlamch.cpp
hnum_dlangs.cpp
hnum_dlaqgs.cpp
hnum_dlaran.cpp
hnum_dllmain.cpp
hnum_dmatgen.cpp
hnum_dmyblas2.cpp
hnum_dpivotgrowth.cpp
hnum_dreadhb.cpp
hnum_dreadmt.cpp
hnum_dreadrb.cpp
hnum_dsp_blas2.cpp
hnum_dsp_blas3.cpp
hnum_dzsum1.cpp
hnum_get_perm_c.cpp
hnum_heap_relax_snode.cpp
hnum_icmax1.cpp
hnum_izmax1.cpp
hnum_lsame.cpp
hnum_mmd.cpp
hnum_pcgssv.cpp
hnum_pcgssvx.cpp
hnum_pcgstrf.cpp
hnum_pcgstrf_bmod1D.cpp
hnum_pcgstrf_bmod1D_mv2.cpp
hnum_pcgstrf_bmod2D.cpp
hnum_pcgstrf_bmod2D_mv2.cpp
hnum_pcgstrf_column_bmod.cpp
hnum_pcgstrf_column_dfs.cpp
hnum_pcgstrf_copy_to_ucol.cpp
hnum_pcgstrf_factor_snode.cpp
hnum_pcgstrf_init.cpp
hnum_pcgstrf_mark_busy_descends.cpp
hnum_pcgstrf_panel_bmod.cpp
hnum_pcgstrf_panel_dfs.cpp
hnum_pcgstrf_pivotL.cpp
hnum_pcgstrf_pruneL.cpp
hnum_pcgstrf_snode_bmod.cpp
hnum_pcgstrf_snode_dfs.cpp
hnum_pcgstrf_thread.cpp
hnum_pcgstrf_thread_finalize.cpp
hnum_pcgstrf_thread_init.cpp
hnum_pcmemory.cpp
hnum_pcsp_defs.h
hnum_pcutil.cpp
hnum_pdgssv.cpp
hnum_pdgssvx.cpp
hnum_pdgstrf.cpp
hnum_pdgstrf_bmod1D.cpp
hnum_pdgstrf_bmod1D_mv2.cpp
hnum_pdgstrf_bmod2D.cpp
hnum_pdgstrf_bmod2D_mv2.cpp
hnum_pdgstrf_column_bmod.cpp
hnum_pdgstrf_column_dfs.cpp
hnum_pdgstrf_copy_to_ucol.cpp
hnum_pdgstrf_factor_snode.cpp
hnum_pdgstrf_init.cpp
hnum_pdgstrf_mark_busy_descends.cpp
hnum_pdgstrf_panel_bmod.cpp
hnum_pdgstrf_panel_dfs.cpp
hnum_pdgstrf_pivotL.cpp
hnum_pdgstrf_pruneL.cpp
hnum_pdgstrf_snode_bmod.cpp
hnum_pdgstrf_snode_dfs.cpp
hnum_pdgstrf_thread.cpp
hnum_pdgstrf_thread_finalize.cpp
hnum_pdgstrf_thread_init.cpp
hnum_pdmemory.cpp
hnum_pdsp_defs.h
hnum_pdutil.cpp
hnum_pmemory.cpp
hnum_psgssv.cpp
hnum_psgssvx.cpp
hnum_psgstrf.cpp
hnum_psgstrf_bmod1D.cpp
hnum_psgstrf_bmod1D_mv2.cpp
hnum_psgstrf_bmod2D.cpp
hnum_psgstrf_bmod2D_mv2.cpp
hnum_psgstrf_column_bmod.cpp
hnum_psgstrf_column_dfs.cpp
hnum_psgstrf_copy_to_ucol.cpp
hnum_psgstrf_factor_snode.cpp
hnum_psgstrf_init.cpp
hnum_psgstrf_mark_busy_descends.cpp
hnum_psgstrf_panel_bmod.cpp
hnum_psgstrf_panel_dfs.cpp
hnum_psgstrf_pivotL.cpp
hnum_psgstrf_pruneL.cpp
hnum_psgstrf_snode_bmod.cpp
hnum_psgstrf_snode_dfs.cpp
hnum_psgstrf_thread.cpp
hnum_psgstrf_thread_finalize.cpp
hnum_psgstrf_thread_init.cpp
hnum_psmemory.cpp
hnum_pssp_defs.h
hnum_psutil.cpp
hnum_pxgstrf_finalize.cpp
hnum_pxgstrf_relax_snode.cpp
hnum_pxgstrf_scheduler.cpp
hnum_pxgstrf_super_bnd_dfs.cpp
hnum_pxgstrf_synch.cpp
hnum_pxgstrf_synch.h
hnum_pzgssv.cpp
hnum_pzgssvx.cpp
hnum_pzgstrf.cpp
hnum_pzgstrf_bmod1D.cpp
hnum_pzgstrf_bmod1D_mv2.cpp
hnum_pzgstrf_bmod2D.cpp
hnum_pzgstrf_bmod2D_mv2.cpp
hnum_pzgstrf_column_bmod.cpp
hnum_pzgstrf_column_dfs.cpp
hnum_pzgstrf_copy_to_ucol.cpp
hnum_pzgstrf_factor_snode.cpp
hnum_pzgstrf_init.cpp
hnum_pzgstrf_mark_busy_descends.cpp
hnum_pzgstrf_panel_bmod.cpp
hnum_pzgstrf_panel_dfs.cpp
hnum_pzgstrf_pivotL.cpp
hnum_pzgstrf_pruneL.cpp
hnum_pzgstrf_snode_bmod.cpp
hnum_pzgstrf_snode_dfs.cpp
hnum_pzgstrf_thread.cpp
hnum_pzgstrf_thread_finalize.cpp
hnum_pzgstrf_thread_init.cpp
hnum_pzmemory.cpp
hnum_pzsp_defs.h
hnum_pzutil.cpp
hnum_qrnzcnt.cpp
hnum_scomplex.cpp
hnum_scsum1.cpp
hnum_sgscon.cpp
hnum_sgsequ.cpp
hnum_sgsrfs.cpp
hnum_sgstrs.cpp
hnum_slacon.cpp
hnum_slamch.cpp
hnum_slangs.cpp
hnum_slaqgs.cpp
hnum_slucmn.h
hnum_slu_dcomplex.h
hnum_slu_mt_Cnames.h
hnum_slu_mt_machines.h
hnum_slu_mt_util.h
hnum_slu_scomplex.h
hnum_slu_solver.h
hnum_slu_util.cpp
hnum_smatgen.cpp
hnum_smyblas2.cpp
hnum_spivotgrowth.cpp
hnum_sp_coletree.cpp
hnum_sp_colorder.cpp
hnum_sp_ienv.cpp
hnum_sreadhb.cpp
hnum_sreadmt.cpp
hnum_sreadrb.cpp
hnum_ssp_blas2.cpp
hnum_ssp_blas3.cpp
hnum_superlu_timer.cpp
hnum_supermatrix.h
hnum_xerbla.cpp
hnum_zgscon.cpp
hnum_zgsequ.cpp
hnum_zgsrfs.cpp
hnum_zgstrs.cpp
hnum_zlacon.cpp
hnum_zlangs.cpp
hnum_zlaqgs.cpp
hnum_zmatgen.cpp
hnum_zmyblas2.cpp
hnum_zpivotgrowth.cpp
hnum_zreadhb.cpp
hnum_zreadmt.cpp
hnum_zreadrb.cpp
hnum_zsp_blas2.cpp
hnum_zsp_blas3.cpp
memory_leak.cpp
ReadMe.txt
stdafx.cpp
stdafx.h
targetver.h
x64
HarlinnPowerLib
dllmain.cpp
HarlinnPowerLib.cpp
HarlinnPowerLib.vcxproj
HarlinnPowerLib.vcxproj.filters
HarlinnPowerLib.vcxproj.vspscc
hpowerdef.h
hpowernetsolver.cpp
hpowernetsolver.h
ReadMe.txt
stdafx.cpp
stdafx.h
targetver.h
x64
HarlinnWindows
dllmain.cpp
HandleClassDiagram.cd
HarlinnWindows.cpp
HarlinnWindows.vcxproj
HarlinnWindows.vcxproj.filters
HarlinnWindows.vcxproj.vspscc
hwinapplication.cpp
hwinapplication.h
hwinbinaryreader.cpp
hwinbinaryreader.h
hwinbinarywriter.cpp
hwinbinarywriter.h
hwincalendar.cpp
hwincalendar.h
hwinclass.cpp
hwinclass.h
hwincom.cpp
hwincom.h
hwincomcontrol.cpp
hwincomcontrol.h
hwincomcontrolsite.cpp
hwincomcontrolsite.h
hwincommandline.cpp
hwincommandline.h
hwincomobject.cpp
hwincomobject.h
hwincomponent.cpp
hwincomponent.h
hwincontainercontrol.cpp
hwincontainercontrol.h
hwincontrol.cpp
hwincontrol.h
hwindatetime.cpp
hwindatetime.h
hwindef.h
hwinenvironment.cpp
hwinenvironment.h
hwinexception.cpp
hwinexception.h
hwinfiledialog.cpp
hwinfiledialog.h
hwinform.cpp
hwinform.h
hwingraphics.cpp
hwingraphics.h
hwinguid.cpp
hwinguid.h
hwinhandle.cpp
hwinhandle.h
hwinhtml.h
hwinimaging.cpp
hwinimaging.h
hwinio.cpp
hwinio.h
hwinkeys.h
hwinlocale.cpp
hwinlocale.h
hwinlog.cpp
hwinlog.h
hwinmenu.cpp
hwinmenu.h
hwinmessage.h
hwinNullable.h
hwinobj.h
hwinobjbase.h
hwinobject.cpp
hwinobject.h
hwinobjimpl.h
hwinperlinnoice.cpp
hwinperlinnoice.h
hwinpropsys.h
hwinresources.cpp
hwinresources.h
hwinscrollablecontrol.cpp
hwinscrollablecontrol.h
hwinsecurity.h
hwinshell.h
hwinstdctrls.cpp
hwinstdctrls.h
hwinstring.cpp
hwinstring.h
hwinstrutil.cpp
hwinsynch.cpp
hwinsynch.h
hwintext.cpp
hwintext.h
hwinthread.cpp
hwinthread.h
hwinvariant.h
hwinxml.h
ReadMe.txt
stdafx.cpp
stdafx.h
targetver.h
x64
HarlinnWindows.sln
HarlinnWindowsTest
AnimatedPoint.h
HarlinnWindowsTest.cpp
HarlinnWindowsTest.h
HarlinnWindowsTest.ico
HarlinnWindowsTest.rc
HarlinnWindowsTest.vcxproj
HarlinnWindowsTest.vcxproj.filters
HarlinnWindowsTest.vcxproj.vspscc
ReadMe.txt
Resource.h
small.ico
stdafx.cpp
stdafx.h
targetver.h
x64