"Hello World" Sample
这个例子就是在Dx11的屏幕上输出一句话。 在Dx11上写文字,估计微软下了不少功夫,生成了一堆乱七八糟的接口,因为资料不全,这里就不臆想它们的功能了,先向Dx11世界说一声"Hello~"吧~~
这个例题中需要很多的新接口,所以加载的头文件有所增加,又增加了一个新的库 dwrite.lib
// Windows 头文件: #include <windows.h> #include <tchar.h> #include <d2d1.h> #include <dwrite.h> #include <wincodec.h>在这里声明了很多的全局变量,其中有一个DirectWrite是在win7上提供的高质量的文字描绘DirectX API,提供了高质量ClearType文本渲染,支持多种格式的字体,和GDI兼容的文本渲染。
// 全局变量: HINSTANCE hInst; // 当前实例 ID2D1Factory* pD2DFactory = NULL; ID2D1SolidColorBrush * p_pBlackBrush = NULL; // 实例笔刷 ID2D1HwndRenderTarget* p_pRenderTarget = NULL; //渲染面 IDWriteFactory * p_pDWriteFactory = NULL; IDWriteTextFormat * m_pText = NULL;
DirectWrite独立于任何特定的渲染技术。应用程序可以选择适合他们自己的渲染技术,这就给应用程序的开发提供了很大的灵活性去用GDI或者Direct3D或Direct2D去渲染程序的某些部分。事实上,应用程序可以用一个专用的渲染栈去渲染DirectWrite。
LRESULT InItD2D(HWND hWnd) { //创建一个Direct2D资源指针 HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&pD2DFactory); if(SUCCEEDED(hr)) { // Create a DirectWrite factory. hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(p_pDWriteFactory), reinterpret_cast<IUnknown **>(&p_pDWriteFactory)); } if (SUCCEEDED(hr)) { // Create a DirectWrite text format object. hr = p_pDWriteFactory->CreateTextFormat( L"微软雅黑", NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 12, L"", //locale &m_pText); } if (SUCCEEDED(hr)) { // Center the text horizontally and vertically. m_pText->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER); m_pText->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER); } // Obtain the size of the drawing area. GetClientRect(hWnd, &rc); // Create a Direct2D render target hr = pD2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd,D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)), &p_pRenderTarget); // 设置笔刷 if (SUCCEEDED(hr)) { hr = p_pRenderTarget->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::Black), &p_pBlackBrush ); } return hr; }
设定完成
VOID Render() { static const WCHAR sc_helloWorld[] = L"看不懂中文吧!笨蛋!"; if(!p_pRenderTarget) return ; p_pRenderTarget->BeginDraw(); p_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); p_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); p_pRenderTarget->DrawText( sc_helloWorld, ARRAYSIZE(sc_helloWorld) - 1, m_pText, D2D1::RectF(0, 0, 800, 800), p_pBlackBrush ); p_pRenderTarget->EndDraw(); }