zoukankan      html  css  js  c++  java
  • 基于VisualStudio11开发Windows8的Direct2DMetro应用程序范例(1)hello world

    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<CoreApplicationView^, IActivatedEventArgs^>(this, &DWriteHelloWorld::OnActivated);
    
        CoreApplication::Suspending +=
            ref new EventHandler<SuspendingEventArgs^>(this, &DWriteHelloWorld::OnSuspending);
    
        CoreApplication::Resuming +=
            ref new EventHandler<Platform::Object^>(this, &DWriteHelloWorld::OnResuming);
    }
    
    void DWriteHelloWorld::SetWindow(
        _In_ CoreWindow^ window
        )
    {
        window->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0);
    
        window->SizeChanged +=
            ref new TypedEventHandler<CoreWindow^, WindowSizeChangedEventArgs^>(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<Platform::String^>^)
    {
        auto directXAppSource = ref new DirectXAppSource();
        CoreApplication::Run(directXAppSource);
        return 0;
    }


     

    赶紧下载VS11体验吧

    http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144

  • 相关阅读:
    日期型数据知识
    如何让VS检查函数和类Comment的添加情况
    HTTP request is unauthorized with client authentication scheme 'Anonymous'.
    将SerializableAttribute序列化为xml
    使用EnterpriseLibrary Validation Block对WCF做验证
    表达式树中递归方法
    使用SignalR在Asp.net中实现进度条
    SQLServer中列出数据库的所有表的创建时间
    用Knockoutjs与Asp.net MVC实现级联下拉列表
    使用UnityAutoMoq简化单元测试
  • 原文地址:https://www.cnblogs.com/new0801/p/6177749.html
Copyright © 2011-2022 走看看