Direct2D是美国微软公司用来取代 DirectDraw 以及GDI, GDI+等新技术[1],主要提供2D 动画的硬件加速,目前只支援 Windows Vista SP2以及Windows 7以上[2]。
Direct2D技术架构于Direct3D 10.1 API 之上,能够透过硬件加速功能来建立2D图形,而且完全支持透明和Alpha混合。Direct2D 亦支援软件实现(Software rasterizer),亦即在显卡不支持硬件加速情况下,Direct2D 仍可以使用软件方式描绘,且效果仍优于GDI。
Direct2D 可以使用DXGI(DirectX Graphics Infrastructure) 与交互操作,Direct2D还能很好的支持DirectWrite。
Direct2D的支持高品质的渲染,具有以下特点:
支援ClearType 文字的呈现方式(DirectWrite 提供)
消除原图锯齿状(Per primitive antialiasing)
几何形状(直线,曲线)和位图绘制和填写。
纯色(Solid color)、线性。
描绘中间层。
多元的几何操作(如unions, intersections, widening, outlining等)
在微软VS11提供了Direct模板
我们创建一个应用程序以后,
插入下列代码
请见代码分析
#include "pch.h"
#include "DWriteHelloWorld.h"
using namespace Microsoft::WRL;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::UI::Core;
using namespace Windows::System;
using namespace Windows::Foundation;
using namespace Windows::Graphics::Display;
DWriteHelloWorld::DWriteHelloWorld()
{
}
void DWriteHelloWorld::CreateDeviceIndependentResources()
{
DirectXBase::CreateDeviceIndependentResources();
DX::ThrowIfFailed(
m_dwriteFactory->CreateTextFormat(
L"Gabriola",
nullptr,
DWRITE_FONT_WEIGHT_REGULAR,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
64.0f,
L"en-US", //locale
&m_textFormat
)
);
// Center the text horizontally and vertically.
m_textFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
m_textFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
}
void DWriteHelloWorld::CreateDeviceResources()
{
DirectXBase::CreateDeviceResources();
m_sampleOverlay = ref new SampleOverlay();
m_sampleOverlay->Initialize(
m_d2dDevice.Get(),
m_d2dContext.Get(),
m_wicFactory.Get(),
m_dwriteFactory.Get(),
"D2D Hello World sample by Microsoft MVP Yincheng"
);
DX::ThrowIfFailed(
m_d2dContext->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Black),
&m_blackBrush
)
);
}
void DWriteHelloWorld::CreateWindowSizeDependentResources()
{
DirectXBase::CreateWindowSizeDependentResources();
Platform::String^ text = "Hello World By Microsoft MVP -Yincheng!";
D2D1_SIZE_F size = m_d2dContext->GetSize();
//创建文本输出设备
DX::ThrowIfFailed(
m_dwriteFactory->CreateTextLayout(
text->Data(),
text->Length(),
m_textFormat.Get(),
size.width,
size.height,
&m_textLayout
)
);
DWRITE_TEXT_RANGE textRange = {21, 12};
//设置文字大小
m_textLayout->SetFontSize(100.0f, textRange);
//创建图形文字显示设备
DX::ThrowIfFailed(
m_dwriteFactory->CreateTypography(
&m_textTypography
)
);
DWRITE_FONT_FEATURE fontFeature = {DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6, 1};
m_textTypography->AddFontFeature(fontFeature);
//移动文字的长度
textRange.length = text->Length();
textRange.startPosition = 0;
//显示文字
DX::ThrowIfFailed(
m_textLayout->SetTypography(
m_textTypography.Get(),
textRange
)
);
//设置文字的长度与开始位置
textRange.length = 12;
textRange.startPosition = 21;
//设置水平线
m_textLayout->SetUnderline(TRUE, textRange);
m_textLayout->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, textRange);
}
void DWriteHelloWorld::Render()
{
m_d2dContext->BeginDraw();
m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
m_d2dContext->SetTransform(D2D1::Matrix3x2F::Identity());
m_d2dContext->DrawTextLayout(
D2D1::Point2F(0.0f, 0.0f),
m_textLayout.Get(),
m_blackBrush.Get()
);
HRESULT hr = m_d2dContext->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
m_d2dContext->SetTarget(nullptr);
m_d2dTargetBitmap = nullptr;
CreateWindowSizeDependentResources();
}
else
{
DX::ThrowIfFailed(hr);
}
m_sampleOverlay->Render();
}
void DWriteHelloWorld::Initialize(
_In_ CoreApplicationView^ applicationView
)
{
applicationView->Activated +=
ref new TypedEventHandler(this, &DWriteHelloWorld::OnActivated);
CoreApplication::Suspending +=
ref new EventHandler(this, &DWriteHelloWorld::OnSuspending);
CoreApplication::Resuming +=
ref new EventHandler(this, &DWriteHelloWorld::OnResuming);
}
void DWriteHelloWorld::SetWindow(
_In_ CoreWindow^ window
)
{
window->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0);
window->SizeChanged +=
ref new TypedEventHandler(this, &DWriteHelloWorld::OnWindowSizeChanged);
DisplayProperties::LogicalDpiChanged +=
ref new DisplayPropertiesEventHandler(this, &DWriteHelloWorld::OnLogicalDpiChanged);
DirectXBase::Initialize(window, DisplayProperties::LogicalDpi);
}
void DWriteHelloWorld::Load(
Platform::String^ entryPoint
)
{
}
void DWriteHelloWorld::Run()
{
Render();
Present();
m_window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
}
void DWriteHelloWorld::Uninitialize()
{
}
void DWriteHelloWorld::OnWindowSizeChanged(
_In_ CoreWindow^ sender,
_In_ WindowSizeChangedEventArgs^ args
)
{
UpdateForWindowSizeChange();
m_sampleOverlay->UpdateForWindowSizeChange();
Render();
Present();
}
void DWriteHelloWorld::OnLogicalDpiChanged(
_In_ Platform::Object^ sender
)
{
SetDpi(DisplayProperties::LogicalDpi);
Render();
Present();
}
void DWriteHelloWorld::OnActivated(
_In_ CoreApplicationView^ applicationView,
_In_ IActivatedEventArgs^ args
)
{
m_window->Activate();
}
void DWriteHelloWorld::OnSuspending(
_In_ Platform::Object^ sender,
_In_ SuspendingEventArgs^ args
)
{
}
void DWriteHelloWorld::OnResuming(
_In_ Platform::Object^ sender,
_In_ Platform::Object^ args
)
{
}
IFrameworkView^ DirectXAppSource::CreateView()
{
return ref new DWriteHelloWorld();
}
[Platform::MTAThread]
int main(Platform::Array^)
{
auto directXAppSource = ref new DirectXAppSource();
CoreApplication::Run(directXAppSource);
return 0;
}
赶紧下载VS11体验吧
http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144