×
Namespaces

Variants
Actions
(Difference between revisions)

C++ support from Windows Phone 8

From Nokia Developer Wiki
Jump to: navigation, search
yan_ (Talk | contribs)
(Yan - Undo revision 178992 by Rudyhuyn (talk))
hamishwillee (Talk | contribs)
m (Hamishwillee - Add competition winner note)
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
[[Category:Windows Phone 8]][[Category:Windows Phone]][[Category:C++/CX]][[Category:DirectX]]
 
[[Category:Windows Phone 8]][[Category:Windows Phone]][[Category:C++/CX]][[Category:DirectX]]
 
{{Abstract|Windows Phone 8 SDK adds two new sets of APIs to develop applications using native code. This article will explain how to use C++ under Windows Phone and some general directions that any C++ developer should know when targeting the platform.}}
 
{{Abstract|Windows Phone 8 SDK adds two new sets of APIs to develop applications using native code. This article will explain how to use C++ under Windows Phone and some general directions that any C++ developer should know when targeting the platform.}}
 
+
{{Note|This article was a winner in the [[Windows Phone 8 Wiki Competition 2012Q4]].}}
{{Note|This is a community entry in the [[Windows Phone 8 Wiki Competition 2012Q4]]}}
+
 
+
 
{{ArticleMetaData <!-- v1.2 -->
 
{{ArticleMetaData <!-- v1.2 -->
 
|sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] -->
 
|sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] -->
Line 42: Line 40:
 
* '''Native code''' gives access to low level APIs like Socket, DirectX...
 
* '''Native code''' gives access to low level APIs like Socket, DirectX...
  
For more information read :[http://msdn.microsoft.com/library/windowsphone/develop/ff626516(v=vs.105).aspx Windows Phone API reference]
+
For more information read: [http://msdn.microsoft.com/library/windowsphone/develop/ff626516(v=vs.105).aspx Windows Phone API reference]
  
 
=== .NET (C# & VB) ===
 
=== .NET (C# & VB) ===
 +
 
.NET API is the original Windows Phone framework. It lets you to develop GUI with XAML technologies, access principal functionality (live tiles, tasks, send Mail, sms, ...) and XNA. It's actually the most important framework to develop Windows Phone application. To develop with this framework you can use C# or VB.
 
.NET API is the original Windows Phone framework. It lets you to develop GUI with XAML technologies, access principal functionality (live tiles, tasks, send Mail, sms, ...) and XNA. It's actually the most important framework to develop Windows Phone application. To develop with this framework you can use C# or VB.
You can find .NET reference documentation here :
 
* [http://msdn.microsoft.com/library/windowsphone/develop/jj207211(v=vs.105).aspx .NET API for Windows Phone]
 
  
'''Note''' : [http://msdn.microsoft.com/library/bb200104.aspx XNA] is always supported, but only to develop Windows Phone 7  application. It's replaced by Direct3D with Windows Phone 8 .
+
You can find .NET reference documentation here: [http://msdn.microsoft.com/library/windowsphone/develop/jj207211(v=vs.105).aspx .NET API for Windows Phone]
 +
 
 +
{{Note|[http://msdn.microsoft.com/library/bb200104.aspx XNA] is always supported, but only to develop Windows Phone 7  application. It's replaced by Direct3D with Windows Phone 8 .}}
  
===  Windows Phone Tuntime (C#, VB & C++/CX) ===
+
===  Windows Phone Runtime (C#, VB & C++/CX) ===
This API have two functionalities :
+
This API have two functionalities:
* share API with windows 8. [http://msdn.microsoft.com/library/windowsphone/develop/ff626516(v=vs.105).aspx A subset of this api is shared with windows 8].
+
* shared API with windows 8. [http://msdn.microsoft.com/library/windowsphone/develop/ff626516(v=vs.105).aspx A subset of this api is shared with windows 8].
 
* '''mixes managed and native code'''.  Managed and Native code are incompatible by nature but this API can be consumed by both.
 
* '''mixes managed and native code'''.  Managed and Native code are incompatible by nature but this API can be consumed by both.
This API is based on an evolution of COM technology.  To use it with C++ and write easily a WinPRT component, Microsoft have created the [http://msdn.microsoft.com/library/windows/apps/hh699871.aspx Visual C++ Language Reference (C++/CX)]. This extension adds to C++  managed equivalent like  properties, delegate, event.... To be consumed by manged code, class developed with C++/Cx generate metadata. In fact, toolchain translate this class to a complex  C++ code with WinPRT annotations :
+
This API is based on an evolution of COM technology.  To use it with C++ and write easily a WinPRT component, Microsoft have created the [http://msdn.microsoft.com/library/windows/apps/hh699871.aspx Visual C++ Language Reference (C++/CX)]. This extension adds to C++  managed equivalent like  properties, delegate, event.... To be consumed by managed code, class developed with C++/Cx generate metadata. In fact, toolchain translates this class to a complex  C++ code with WinPRT annotations :
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! with C++/CX  !! whitout C++/CX
+
! with C++/CX  !! without C++/CX
 
|-
 
|-
 
|
 
|
Line 133: Line 132:
 
* [http://msdn.microsoft.com/library/windowsphone/develop/jj681688(v=vs.105).aspx Microsoft Media Foundation APIs ] : Microsoft framework for audio/video capture and rendering. [http://msdn.microsoft.com/library/windowsphone/develop/jj207074(v=vs.105).aspx Windows Phone implement a subset of Windows 8 version].  
 
* [http://msdn.microsoft.com/library/windowsphone/develop/jj681688(v=vs.105).aspx Microsoft Media Foundation APIs ] : Microsoft framework for audio/video capture and rendering. [http://msdn.microsoft.com/library/windowsphone/develop/jj207074(v=vs.105).aspx Windows Phone implement a subset of Windows 8 version].  
 
* [http://msdn.microsoft.com/library/hh438466.aspx Windows Runtime C++ Template Library] : helper to consume and create COM or Windows Runtime component in C++. It's replace old ATL API. With Windows Phone, this library is generally use only to consume COM and WinPRT components.
 
* [http://msdn.microsoft.com/library/hh438466.aspx Windows Runtime C++ Template Library] : helper to consume and create COM or Windows Runtime component in C++. It's replace old ATL API. With Windows Phone, this library is generally use only to consume COM and WinPRT components.
* [http://msdn.microsoft.com/library/dd492418.aspx Parallel Patterns Library] : high level multithread library with concurency algorithm and task concept.
+
* [http://msdn.microsoft.com/library/dd492418.aspx Parallel Patterns Library] : high level multithread library with concurrency algorithm and task concept.
  
 
In few cases, you can use directly COM Object :
 
In few cases, you can use directly COM Object :
Line 141: Line 140:
 
== Native application ==
 
== Native application ==
  
To launch an application, Windows phone need an "entry point" it may consume. To perform it, your "entry point" will be developed with C++/CX and C++ main function is replaced by a C++/CX version :
+
To launch an application, Windows phone need an "entry point" it may consume. To perform it, your "entry point" will be developed with C++/CX and C++ main function is replaced by a C++/CX version: <code csharp>
<code csharp>
+
 
[Platform::MTAThread]
 
[Platform::MTAThread]
 
int main(Platform::Array<Platform::String^>^)
 
int main(Platform::Array<Platform::String^>^)
Line 152: Line 150:
 
</code>
 
</code>
 
* [http://msdn.microsoft.com/library/windows/apps/hh710417.aspx Platform::MTAThread] : metadata about application multi-thread apartment.
 
* [http://msdn.microsoft.com/library/windows/apps/hh710417.aspx Platform::MTAThread] : metadata about application multi-thread apartment.
* '''myFactory''': implement [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkviewsource.aspx IFrameworkViewSource]. This class is a factory use to instantiate a [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkview.aspx Iframeworkview].
+
* {{Icode|myFactory()}}: implements [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkviewsource.aspx IFrameworkViewSource]. This class is a factory use to instantiate a [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkview.aspx Iframeworkview]. <code csharp>
<code csharp>
+
 
ref class myFactory sealed : Windows::ApplicationModel::Core::IFrameworkViewSource
 
ref class myFactory sealed : Windows::ApplicationModel::Core::IFrameworkViewSource
 
{
 
{
Line 165: Line 162:
 
* [http://msdn.microsoft.com/library/windowsphone/develop/hh700469.aspx CoreApplication::Run] : C++/CX function which acquire an [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkview.aspx Iframeworkview] from an [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkviewsource.aspx IFrameworkViewSource] factory.
 
* [http://msdn.microsoft.com/library/windowsphone/develop/hh700469.aspx CoreApplication::Run] : C++/CX function which acquire an [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkview.aspx Iframeworkview] from an [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.iframeworkviewsource.aspx IFrameworkViewSource] factory.
  
IFrameworkView is the display provider use to make Direct3D rendering. Interface function are :
+
 
* Initialize : initialization function. take a[http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplicationview.aspx CoreApplicationView] in parameters. You can use [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplicationview.activated.aspx CoreApplicationView Activated  event] to be notified when application is activated and use this function to register your IFrameworkView with [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplication.aspx CoreApplication events] to handle application state changes.
+
{{Icode|IFrameworkView}} is the display provider use to make Direct3D rendering. Interface function are :
<code csharp>
+
* {{Icode|Initialize()}}: Initialization function. Take a[http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplicationview.aspx CoreApplicationView] in parameters. You can use [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplicationview.activated.aspx CoreApplicationView Activated  event] to be notified when application is activated and use this function to register your IFrameworkView with [http://msdn.microsoft.com/library/windowsphone/develop/windows.applicationmodel.core.coreapplication.aspx CoreApplication events] to handle application state changes. <code csharp>
 
void myView::Initialize(CoreApplicationView^ applicationView)
 
void myView::Initialize(CoreApplicationView^ applicationView)
 
{
 
{
Line 181: Line 178:
 
}
 
}
 
</code>
 
</code>
* Load : load and activate external resources. This function is called before Run().
+
* {{Icode|Load()}}: Load and activate external resources. This function is called before {{Icode|Run()}}.
 
+
* {{Icode|SetWindow()}}: sets the current [http://msdn.microsoft.com/library/windowsphone/develop/windows.ui.core.corewindow.aspx CoreWindow]. Use it to handle application display event like close, visibility change, mono-touch event etc: <code csharp>
* SetWindow : sets the current [http://msdn.microsoft.com/library/windowsphone/develop/windows.ui.core.corewindow.aspx CoreWindow]. Use it to handle application display event like close, visibility change, mono-touch event, ...
+
<code csharp>
+
 
void myView::SetWindow(CoreWindow^ window)
 
void myView::SetWindow(CoreWindow^ window)
 
{
 
{
Line 203: Line 198:
 
}
 
}
 
</code>
 
</code>
* Uninitialize : uninitializes ressources.
+
* {{Icode|Uninitialize()}} : Uninitializes resources.
* Run : start your view. Your must implement an application event-loop here.
+
* {{Icode|Run()}}: Start your view. Your must implement an application event-loop here. <code csharp>
<code csharp>
+
 
void myView::Run()
 
void myView::Run()
 
{
 
{
Line 229: Line 223:
 
</code>
 
</code>
  
Native application have three importants points:
+
Native application have three important points:
 
* you can only use Direct3D for display data. Native API doesn't have API to build GUI.
 
* you can only use Direct3D for display data. Native API doesn't have API to build GUI.
 
* you must execute system events.
 
* you must execute system events.
Line 242: Line 236:
  
 
== Mixed application ==
 
== Mixed application ==
You can develop mixed application where your managed code consume Windows Phone Runtime components. To develop with C++ Code, you must create a Windows Phone Runtime Component which interface C++ part with a public  sealed C++/CX class . It's important to read[http://msdn.microsoft.com/library/windows/apps/xaml/br212455.aspx C++ extension documentation] to understand its specificities :
+
You can develop mixed application where your managed code consume Windows Phone Runtime components. To develop with C++ Code, you must create a Windows Phone Runtime Component which interface C++ part with a public  sealed C++/CX class . It's important to read [http://msdn.microsoft.com/library/windows/apps/xaml/br212455.aspx C++ extension documentation] to understand its specificities :
 
*a C++/CX class/struct is declared with  '''ref''' keyword
 
*a C++/CX class/struct is declared with  '''ref''' keyword
 
<code csharp>
 
<code csharp>
Line 321: Line 315:
 
'''Warning''' :  Windows phone implement a subset of the [http://msdn.microsoft.com/en-us/library/windows/apps/hh832106.aspx Windows 8 C++/CX namespace]. Few object are not accessible.
 
'''Warning''' :  Windows phone implement a subset of the [http://msdn.microsoft.com/en-us/library/windows/apps/hh832106.aspx Windows 8 C++/CX namespace]. Few object are not accessible.
 
=== Collections===
 
=== Collections===
Windows Phone Runtime API doesn't implement collections class. To transfer collection between managed and native code, a set of [http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.foundation.collections.aspx#interfaces collections Interface] are defined. These interface have Equivalent in managed. For example  IVector besome an IList in C#.
+
Windows Phone Runtime API doesn't implement collections class. To transfer collection between managed and native code, a set of [http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.foundation.collections.aspx#interfaces collections Interface] are defined. These interface have Equivalent in managed. For example  IVector becomes an IList in C#.
  
 
[http://msdn.microsoft.com/en-US/library/windows/apps/hh700103.aspx C++/CX collections] use C++ parts and can't be consumed directly by managed Code. Like these classes implement a Windows Phone Runtime interface, you can cast these to be consumed through the interface  
 
[http://msdn.microsoft.com/en-US/library/windows/apps/hh700103.aspx C++/CX collections] use C++ parts and can't be consumed directly by managed Code. Like these classes implement a Windows Phone Runtime interface, you can cast these to be consumed through the interface  
Line 358: Line 352:
 
* [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.drawingsurface(v=vs.105).aspx DrawingSurface]. Direct3D will be rendering on DrawingSurface region. This element is used like other UI control and you can perform transformation, animation,...   
 
* [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.drawingsurface(v=vs.105).aspx DrawingSurface]. Direct3D will be rendering on DrawingSurface region. This element is used like other UI control and you can perform transformation, animation,...   
 
* [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.drawingsurfacebackgroundgrid(v=vs.105).aspx DrawingSurfaceBackgroundGrid]:Direct3D is rendering on all your application background. This layout must be the root UI  control in XAML. You can add UI control like a [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.grid(v=vs.105).aspx Grid].  
 
* [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.drawingsurfacebackgroundgrid(v=vs.105).aspx DrawingSurfaceBackgroundGrid]:Direct3D is rendering on all your application background. This layout must be the root UI  control in XAML. You can add UI control like a [http://msdn.microsoft.com/library/windowsphone/develop/system.windows.controls.grid(v=vs.105).aspx Grid].  
More informations can be found in [[Windows Phone Direct3D XAML Application Introduction]]  article.
+
More information can be found in [[Windows Phone Direct3D XAML Application Introduction]]  article.
  
Unfortunately, integration with XAML is more complicated. You need a layer of Interopility to acces to Direct3D device ( look  Direct3DContentProvider.h class in VS project) ... SDk give two project template :
+
Unfortunately, integration with XAML is more complicated. You need a layer of Interoperability to acces to Direct3D device ( look  Direct3DContentProvider.h class in VS project) ... SDK give two project template :
* [http://msdn.microsoft.com/library/windowsphone/develop/jj207012(v=vs.105).aspx Visual C# => WIndows Phone XAML and Direct 3D] : this project use  DrawingSurface to render Direct3D
+
* [http://msdn.microsoft.com/library/windowsphone/develop/jj207012(v=vs.105).aspx Visual C# => Windows Phone XAML and Direct 3D] : this project use  DrawingSurface to render Direct3D
* [http://msdn.microsoft.com/library/windowsphone/develop/jj714079(v=vs.105).aspx  Visual C++ => WIndows Phone Direct 3D with XAML] : this project use DrawingSurfaceBackgroundGrid to render Direct3D.
+
* [http://msdn.microsoft.com/library/windowsphone/develop/jj714079(v=vs.105).aspx  Visual C++ => Windows Phone Direct 3D with XAML] : this project use DrawingSurfaceBackgroundGrid to render Direct3D.
  
 
These projects share important  code :
 
These projects share important  code :
* Direct3DContentProvider.h : COM class coded with  wrl library and implement the  layer of Interopility between a IDrawingSurfaceContentProvider and IDrawingSurfaceContentProviderNative COM interface.
+
* Direct3DContentProvider.h : COM class coded with  wrl library and implement the  layer of Interoperability between a IDrawingSurfaceContentProvider and IDrawingSurfaceContentProviderNative COM interface.
 
* Direct3DBase.h : Helper class that initializes DirectX APIs for 3D rendering. Your can use it for your Direct3D class.
 
* Direct3DBase.h : Helper class that initializes DirectX APIs for 3D rendering. Your can use it for your Direct3D class.
*  XXX::CreateContentProvider() : add a layer of Interopility and return IDrawingSurfaceBackgroundContentProvider or IDrawingSurfaceContentProvider.
+
*  XXX::CreateContentProvider() : add a layer of Interoperability and return IDrawingSurfaceBackgroundContentProvider or IDrawingSurfaceContentProvider.
  
 
Your class must implement functions which are called by Direct3DContentProvider :
 
Your class must implement functions which are called by Direct3DContentProvider :
Line 393: Line 387:
  
 
==Reference links ==
 
==Reference links ==
Ressources about C++ Direct3D developpement on Windon sPhone :  
+
Resources about C++ Direct3D development on Windows Phone :  
 
*[http://channel9.msdn.com/Shows/Inside+Windows+Phone/Inside-Windows-Phone-42--Sam-George-on-Native-C-Game-Development-in-Windows-Phone-8 Inside Windows Phone 42 - Sam George on Native C++ Game Development in Windows Phone 8]
 
*[http://channel9.msdn.com/Shows/Inside+Windows+Phone/Inside-Windows-Phone-42--Sam-George-on-Native-C-Game-Development-in-Windows-Phone-8 Inside Windows Phone 42 - Sam George on Native C++ Game Development in Windows Phone 8]
  

Revision as of 02:12, 23 January 2013

Windows Phone 8 SDK adds two new sets of APIs to develop applications using native code. This article will explain how to use C++ under Windows Phone and some general directions that any C++ developer should know when targeting the platform.

Note.pngNote: This article was a winner in the Windows Phone 8 Wiki Competition 2012Q4.

WP Metro Icon DirectX.png
WP Metro Icon WP8.png
Article Metadata
Tested withCompatibility
Platform(s): Windows Phone 8.0
Windows Phone 8
Article
Keywords: windows phone, c++, managed, direct 3D, natif
Created: yan_ (07 Nov 2012)
Last edited: hamishwillee (23 Jan 2013)

Contents

Introduction

Windows Phone 8 SDK adds two new sets of APIs to develop applications using native code. This article will explain how to use C++ under Windows Phone and some general directions that any C++ developer should know when targeting the platform.

Windows Phone 8 SDK API is divided in three complementary parts:

WP api.png

  • .NET gives access to Windows Phone functionality like Live Tiles, send SMS...
  • Windows Phone Runtime is an intermediate API which gives access to low level functionality like Voice Commands, VoIP...
  • Native code gives access to low level APIs like Socket, DirectX...

For more information read: Windows Phone API reference

.NET (C# & VB)

.NET API is the original Windows Phone framework. It lets you to develop GUI with XAML technologies, access principal functionality (live tiles, tasks, send Mail, sms, ...) and XNA. It's actually the most important framework to develop Windows Phone application. To develop with this framework you can use C# or VB.

You can find .NET reference documentation here: .NET API for Windows Phone

Note.pngNote: XNA is always supported, but only to develop Windows Phone 7 application. It's replaced by Direct3D with Windows Phone 8 .

Windows Phone Runtime (C#, VB & C++/CX)

This API have two functionalities:

This API is based on an evolution of COM technology. To use it with C++ and write easily a WinPRT component, Microsoft have created the Visual C++ Language Reference (C++/CX). This extension adds to C++ managed equivalent like properties, delegate, event.... To be consumed by managed code, class developed with C++/Cx generate metadata. In fact, toolchain translates this class to a complex C++ code with WinPRT annotations :

with C++/CX without C++/CX
public ref class Number sealed
{
public:
 
Number() : _value(0) { }
 
int GetValue() { return _value; }
void SetValue(int value) { _value = value; }
 
private:
 
int _value;
};
[exclusiveto(Number)]
[uuid(5b197688-2f57-4d01-92cd-a888f10dcd90)]
[version(1.0)]
interface INumber : IInspectable
{
HRESULT GetValue([out, retval] INT32* value);
HRESULT SetValue([in] INT32 value);
}
 
[activatable(1.0), version(1.0)]
runtimeclass Number
{
[default] interface INumber;
}
 
class Number : public RuntimeClass<INumber>
{
InspectableClass(RuntimeClass_WRLNumberComponent_Number, BaseTrust)
 
public:
 
Number() : _value(0) { }
 
virtual HRESULT STDMETHODCALLTYPE GetValue(INT32* value) override
{
*value = _value;
return S_OK;
}
 
virtual HRESULT STDMETHODCALLTYPE SetValue(INT32 value) override
{
_value = value;
return S_OK;
}
 
private:
 
INT32 _value;
};

To develop in C++ you will always use this extension somewhere because it's your C++ code which is consumed by managed API and not the other way round. For example "you can't use a C++ object directly in your C# app. you need to first write a Windows Runtime Component.

Native (C++)

Visual studio 2012 have a really good support of C++ language and its recent normalization. For windows phone, these links are good entries to find supported features :

C++11 adds a lot of really good concepts and features. Too learn more and update your abilities, you should read this link : Modern C++.

Native API is developed in C++ and divided into libraries :

In few cases, you can use directly COM Object :

Native application

To launch an application, Windows phone need an "entry point" it may consume. To perform it, your "entry point" will be developed with C++/CX and C++ main function is replaced by a C++/CX version:
[Platform::MTAThread]
int main(Platform::Array<Platform::String^>^)
{
auto factory= ref new myFactory();
CoreApplication::Run(direct3DApplicationSource);
return 0;
}


IFrameworkView is the display provider use to make Direct3D rendering. Interface function are :

  • Initialize(): Initialization function. Take aCoreApplicationView in parameters. You can use CoreApplicationView Activated event to be notified when application is activated and use this function to register your IFrameworkView with CoreApplication events to handle application state changes.
    void myView::Initialize(CoreApplicationView^ applicationView)
    {
    applicationView->Activated +=
    ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &myView::OnActivated);
     
    //handle suspending and resuming application states.
    CoreApplication::Suspending +=
    ref new EventHandler<SuspendingEventArgs^>(this, &myView::OnSuspending);
     
    CoreApplication::Resuming +=
    ref new EventHandler<Platform::Object^>(this, &myView::OnResuming);
    }
  • Load(): Load and activate external resources. This function is called before Run().
  • SetWindow(): sets the current CoreWindow. Use it to handle application display event like close, visibility change, mono-touch event etc:
    void myView::SetWindow(CoreWindow^ window)
    {
    window->VisibilityChanged +=
    ref new TypedEventHandler<CoreWindow^, VisibilityChangedEventArgs^>(this, &myView::OnVisibilityChanged);
     
    window->Closed +=
    ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &myView::OnWindowClosed);
     
    window->PointerPressed +=
    ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &myView::OnPointerPressed);
     
    window->PointerMoved +=
    ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &myView::OnPointerMoved);
     
    window->PointerReleased +=
    ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &myView::OnPointerReleased);
    }
  • Uninitialize() : Uninitializes resources.
  • Run(): Start your view. Your must implement an application event-loop here.
    void myView::Run()
    {
    //reference time.
    BasicTimer^ timer = ref new BasicTimer();
     
    while (!m_windowClosed)//while application is not closed
    {
    if (m_windowVisible)// application is visible, update Direct3D rendering
    {
    timer->Update();
    CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);//process current system events
    m_renderer->Update(timer->Total, timer->Delta); //update your render from time reference.
    m_renderer->Render();// Direct3D rendering
    m_renderer->Present(); // This call is synchronized to the display frame rate.
    }
    else // application is not visible
    {
    CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending); ;//process current system events and wait new events.
    }
    }
    }

Native application have three important points:

  • you can only use Direct3D for display data. Native API doesn't have API to build GUI.
  • you must execute system events.
  • You don't have access to .Net functionality. You can't use live tiles, send a SMS, ...

Without .Net functionality, native applications are not so cool and you are limited to Direct3D develop ... But remember, you can develop WinPRT components with C++/CX. So it's possible to encapsulate your c++ Code with C++/CX and consume it with managed code


Other wiki resources about Direct3D development:

Mixed application

You can develop mixed application where your managed code consume Windows Phone Runtime components. To develop with C++ Code, you must create a Windows Phone Runtime Component which interface C++ part with a public sealed C++/CX class . It's important to read C++ extension documentation to understand its specificities :

  • a C++/CX class/struct is declared with ref keyword
ref class myclass 
{
//...
};
  • Allocation is performed by ref new.
  • C++/CX struct can be use like a POD.
  • Class instance is handled by ^ type ( is known as a "hat"). This type is a smart pointer with a counting reference like std::shared_ptr.
myclass ^ myClass = ref new myclass ();
  • Platform::String Class replace std::wstring. C++/CX String are Unicode.
  • C++/CX collections are compliant with STL.
  • Fundamental types are similar.
  • A property is similar to getter/setter in C++.
  • A delegate is a function object. It can encapsulate n C++/CX or managed code.
  • An event is a delegate collection which perform all delegate when event is raised.
  • sealed keyword : a sealed class or a sealed function can't be overridden.

To be consumed by managed code, C++/CX code generate a set of metadata. This generation depend on access modifier :

Modifier Meaning Emitted to metadata?
private The default accessibility. Same meaning as in standard C++. No
protected Same meaning as in standard C++, both within the app or component and in metadata. Yes
public Same meaning as in standard C++. Yes
public protected –or- protected public Protected accessibility in metadata, public within the app or component. Yes
protected private or private protected Not visible in metadata; protected accessibility within the app or component. No
internal or private public The member is public within the app or component, but is not visible in metadata. No

Metadata are generated only for specific C++/CX objects. A C++/CX class can declare C++ object only if the member/function have a private or internal access. Your public Class/Struct must be sealed because Managed code can't override it.

//C++/CX class declaration which can be consumed by managed code
public ref class MyClass sealed
{
private : // C++ object can be used
std::string aString:
std::vector<uint32_t> aFunction();
 
public : //object and function are accessible by managed coe. if a c++ object is used, error is generated.
property Platform::String ^ anotherString;
Windows::Foundation::Collections::IVector<uint32> ^anotherFunction();
//...
};

Public access is very strict, and only specific C++/CX objects can be used  :

These Objects must be defined with these types :

Once your components is referenced by your managed application, you can consume it like other Managed object. It's so possible to bind public properties with XAML and connect to public events.

You can find interesting explanation here :

Warning : Windows phone implement a subset of the Windows 8 C++/CX namespace. Few object are not accessible.

Collections

Windows Phone Runtime API doesn't implement collections class. To transfer collection between managed and native code, a set of collections Interface are defined. These interface have Equivalent in managed. For example IVector becomes an IList in C#.

C++/CX collections use C++ parts and can't be consumed directly by managed Code. Like these classes implement a Windows Phone Runtime interface, you can cast these to be consumed through the interface

Windows::Foundation::Collections::IVector<int>^ Class1::GetInts()
{
auto vec = ref new Platform::Collections::Vector<int>();
...
return vec;// implicit cast to Windows Phone Runtime interface. Managed code can consume collection returned.
}


Remarque : STL collection can be converted to its C++/CX equivalent. When you convert a temporary collection, You can use std::move to avoid unnecessary internal copy

Windows::Foundation::Collections::IVector<int>^ Class1::GetInts()
{
st::vector<int> vec;
for(int i = 0; i < 10; i++)
{
vec.push_back(i);
}
// Implicit conversion to IVector
return ref new Platform::Collections::Vector<int>(std::move(vec));
}

Debugger

You can't debug managed code and native code in same times. To selected which debugger you want use :

  1. open project properties
  2. open debug tab and select debugger mode

Debugger selection.png

Direct 3D

Managed code can't access directly to Direct 3D. You must develop a WinPRT component which consume Direct3D with C++ code. Direct3D rendering can be display by two XAML controls:

  • DrawingSurface. Direct3D will be rendering on DrawingSurface region. This element is used like other UI control and you can perform transformation, animation,...
  • DrawingSurfaceBackgroundGrid:Direct3D is rendering on all your application background. This layout must be the root UI control in XAML. You can add UI control like a Grid.

More information can be found in Windows Phone Direct3D XAML Application Introduction article.

Unfortunately, integration with XAML is more complicated. You need a layer of Interoperability to acces to Direct3D device ( look Direct3DContentProvider.h class in VS project) ... SDK give two project template :

These projects share important code :

  • Direct3DContentProvider.h : COM class coded with wrl library and implement the layer of Interoperability between a IDrawingSurfaceContentProvider and IDrawingSurfaceContentProviderNative COM interface.
  • Direct3DBase.h : Helper class that initializes DirectX APIs for 3D rendering. Your can use it for your Direct3D class.
  • XXX::CreateContentProvider() : add a layer of Interoperability and return IDrawingSurfaceBackgroundContentProvider or IDrawingSurfaceContentProvider.

Your class must implement functions which are called by Direct3DContentProvider :

// IDrawingSurfaceContentProviderNative
HRESULT STDMETHODCALLTYPE Connect(_In_ IDrawingSurfaceRuntimeHostNative* host);
void STDMETHODCALLTYPE Disconnect();
 
HRESULT STDMETHODCALLTYPE PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty);
HRESULT STDMETHODCALLTYPE GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle);

this method are called by Direct3DContentProvider to give Direct3D context for rendering.

IDrawingSurfaceBackgroundContentProvider and IDrawingSurfaceContentProvider are empty interface. They are only use to associate your class with target UI Controler. But XXX::CreateContentProvider() is mportant :

IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
{
ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Detach());
}
  • Make<Direct3DContentProvider>(this); : encapsulate your class instance to a Direct3DContentProvider COM object.
  • Cast COM Obect to IDrawingSurfaceContentProvider interface. You must use this returned instance to associate your rendering with UI Controler.

Reference links

Resources about C++ Direct3D development on Windows Phone  :

The media player is loading...

The media player is loading...

1552 page views in the last 30 days.
×