藉助 C++ 進行 Windows 開發:Windows 運行時的呈現

來源:互聯網
上載者:User

我的上一個專欄中討論了 Windows 運行時 (WinRT) 應用程式模型 (msdn.microsoft.com/magazine/dn342867)。 我示範了如何通過標準 C++ 和經典 COM 來編寫 Windows 市集或 Windows Phone 應用程式,其中僅使用了一些 WinRT API 函數。 毫無疑問,您 不必使用 C++/CX 或 C# 這樣的語言投射。 能夠繞過這些抽象概念是一種強大的功能,同時也是一種 瞭解這項技術工作方式的很好的方法。

我在 2013 年 5 月的專欄中介紹了 Direct2D 1.1 並示範了如何使用它在傳統型應用程式中進行呈現 (msdn.microsoft.com/magazine/dn198239)。 接下來的專欄介紹了 dx.codeplex.com 上提供的 dx.h 庫,這可以大幅簡化 C++ 中的 DirectX 編程 (msdn.microsoft.com/magazine/dn201741)。

上個專欄中的代碼對於實現基於 CoreWindow 的應用程式已經足夠,但未提供任何呈現。

本月,我將示範如何利用這種基本的架構並添加呈現支援。 WinRT 應用程式模型針對使用 DirectX 呈現進行了最佳化。 我將向您示範,如何利用在之前專欄中學到的有關 Direct2D 和 Direct3D 呈現的 內容,將其應用到基於 CoreWindow 的 WinRT 應用程式,具體而言,通過 dx.h 庫使用 Direct2D 1.1 。 大多數情況下,不論您的目標是案頭還是 Windows 運行時,需要編寫的實際 Direct2D 和 Direct3D 繪製命令是相同的。 但是,其中有一些細微的差別,當然,使其完全運轉起來從一開始就有 很大差別。 因此,我將繼續上一次的內容,示範如何在螢幕上顯示一些像素!

為了正確支援呈現,視窗必須能夠意識到特定事件。 至少這包括視窗的可見度和大小的更改,以及 對使用者所選擇的邏輯顯示 DPI 配置的更改。 在上次專欄中介紹的 Activated 事件中,這些新事件都 通過 COM 介面回調報告給應用程式。 ICoreWindow 介面提供註冊 VisibilityChanged 和 SizeChanged 事件的方法,但首先我需要實現相應的處理常式。 我需要實現的兩個 COM 介面與 Activated 事件處理常式及其 Microsoft 介面定義語言 (MIDL) 產生的類模板非常相似:

             typedef ITypedEventHandler<CoreWindow *, VisibilityChangedEventArgs *>
     IVisibilityChangedEventHandler;
   typedef ITypedEventHandler<CoreWindow *, WindowSizeChangedEventArgs *>
     IWindowSizeChangedEventHandler;

接下來必須實現的 COM 介面稱為 IDisplayPropertiesEventHandler,謝天謝地這個介面已經定義 了。 我只需將相關的標頭檔包括在其中:

             #include <Windows.Graphics.Display.h>

此外,相互關聯類型在以下命名空間中定義:

             using namespace ABI::Windows::Graphics::Display;

根據這些定義,我可以更新上次專欄中介紹的 SampleWindow 類,也從這三個介面繼承:

             struct SampleWindow :
     ...
             IVisibilityChangedEventHandler,
     IWindowSizeChangedEventHandler,
     IDisplayPropertiesEventHandler

同時還需要記住更新我的 QueryInterface 實現以指示對這些介面的支援。 這些內容將讓您自行完 成。 當然,如我上次所說,Windows 運行時並不關心在哪裡實現這些 COM 介面回調。 它遵循的原則 是,Windows 運行時不假定我的應用程式 IFrameworkView(SampleWindow 類實現的主要介面)也實現 這些回調介面。 因此,雖然 QueryInterface 確實會正確處理這些介面的查詢,不過 Windows 運行時 不會為它們進行查詢。 相反,我需要註冊相應事件,而最佳位置是在 IFrameworkView Load 方法的實 現中。 提醒一下,Load 方法是應該將所有代碼粘貼到這裡的方法,以便準備應用程式進行初始呈現。 接下來在 Load 方法中註冊 VisibilityChanged 和 SizeChanged 事件:

             EventRegistrationToken token;
   HR(m_window->add_VisibilityChanged(this, &token));
   HR(m_window->add_SizeChanged(this, &token));

這會明確告訴 Windows 運行時在哪裡尋找前兩個介面實現。 第三個也是最後一個介面,它針對 LogicalDpiChanged 事件,但此事件註冊由 IDisplayPropertiesStatics 介面提供。 此靜態介面由 WinRT DisplayProperties 類實現。 我只需使用 GetActivationFactory 函數模板來擷取它(在我最 近的專欄中可以找到 GetActivationFactory 的實現):

             ComPtr<IDisplayPropertiesStatics> m_displayProperties;
   m_displayProperties = GetActivationFactory<IDisplayPropertiesStatics> (
     RuntimeClass_Windows_Graphics_Display_DisplayProperties);

成員變數保留此介面指標,在視窗的生命週期中,我需要在不同點上調用它。 現在,我可以在 Load 方法中註冊 LogicalDpiChanged 事件:

             HR(m_displayProperties- >add_LogicalDpiChanged(this, &token));

稍後將返回到這三個介面的實現。 現在該是準備 DirectX 基礎結構的時候了。 我將需要標準的設 備資源處理常式集,這些在以前的專欄中已經多次討論過:

             void CreateDeviceIndependentResources() {}
   void CreateDeviceSizeResources() {}
   void CreateDeviceResources() {}
   void ReleaseDeviceResources() {}

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。