Минимальное приложение для Windows Phone 8.1 (без XAML): отличия от настольного приложения

Я начинаю разработку приложений Windows Runtime на C ++. У меня есть опыт разработки Win32 / C ++, но для меня это новый мир.

Ниже приведено минимальное приложение, написанное без XAML, которое собирает информацию из различных источников (MSDN, DirectXTutorial.com и т. Д.).

Мой вопрос: на рабочем столе Windows хорошо работает, отображая пустое окно и получая событие PointerPressed. Но в Windows Phone я только достигаю логотипа запуска приложения и ничего не происходит.

В чем разница между двумя платформами для этого минимального приложения? Требуется ли создавать DirectX или поверхность для рисования в случае платформы Windows Phone 8.1?

Я использую WIndows 10 host плюс Visual Studio 2015. Спасибо.

#include "pch.h"
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::UI::Core;
using namespace Windows::Foundation;
using namespace Platform;

ref class dxAppView sealed : IFrameworkView
{
bool _bActive;

public:
virtual void Initialize(CoreApplicationView ^applicationView)
{
applicationView->Activated += ref new TypedEventHandler<CoreApplicationView ^, IActivatedEventArgs ^>(this, &dxAppView::OnActivated);
CoreApplication::Suspending += ref new EventHandler<SuspendingEventArgs^>(this, &dxAppView::OnSuspending);
CoreApplication::Resuming += ref new EventHandler<Object ^>(this, &dxAppView::OnResuming);

_bActive = true;
}

virtual void SetWindow(CoreWindow ^window)
{
window->PointerPressed += ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &dxAppView::OnPointerPressed);
window->Closed += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::CoreWindowEventArgs ^>(this, &dxAppView::OnClosed);
}

virtual void Load(String ^entryPoint) {}
virtual void Run()
{
CoreWindow^ wnd = CoreWindow::GetForCurrentThread();

while (_bActive)
{
wnd->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
}

}

virtual void Uninitialize() {}

void OnActivated(CoreApplicationView ^sender, IActivatedEventArgs ^args)
{
CoreWindow^ wnd = CoreWindow::GetForCurrentThread();
wnd->Activate();
}

void OnPointerPressed(CoreWindow ^sender, PointerEventArgs^  args)
{
Windows::UI::Popups::MessageDialog dlg(L"Hi From Windows Runtime app.");
dlg.ShowAsync();
}

void OnSuspending(Platform::Object ^sender, Windows::ApplicationModel::SuspendingEventArgs ^args){}

void OnResuming(Platform::Object ^sender, Platform::Object ^args){}

void OnClosed(Windows::UI::Core::CoreWindow ^sender, Windows::UI::Core::CoreWindowEventArgs ^args)
{
_bActive = false;
}
};

ref class dxAppFrameworkViewSource sealed : IFrameworkViewSource
{
public:
virtual IFrameworkView^ CreateView()
{
return ref new dxAppView;
}
};[MTAThread]
int main(Array<String^>^ args)
{
CoreApplication::Run(ref new dxAppFrameworkViewSource());
return 0;
};

1

Решение

Я нашел это, кажется, что вы ничего не можете сделать в Phone 8.1 без активной цепи обмена DX. Итак, минимальное приложение без XAML включает следующий дополнительный код:

Создать устройство Direct3D

(Переменные с префиксом подчеркивания являются членами класса)

ComPtr<ID3D11DeviceContext> pDevCtx;
ComPtr<ID3D11Device>        pDev;
ComPtr<IDXGISwapChain>      pSwapChain;

D3D_FEATURE_LEVEL fLevel;

HRESULT hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&pDev,
&fLevel,
&pDevCtx);

Создать цепочку обмена

pDevCtx.As(&_pDevCtx);
pDev.As(&_pDevice);

ComPtr<IDXGIDevice1> pDXGIDev;
pDev.As(&pDXGIDev);

ComPtr<IDXGIAdapter> pDXGIAdapter;
pDXGIDev->GetAdapter(&pDXGIAdapter);

ComPtr<IDXGIFactory2> pDXGIFactory;
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), &pDXGIFactory);

DXGI_SWAP_CHAIN_DESC1 swChDesc = { 0 };
swChDesc.BufferCount = 2;
swChDesc.SampleDesc.Count = 1;
swChDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
swChDesc.SampleDesc.Quality = 0;
swChDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swChDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;

CoreWindow^ wnd  = CoreWindow::GetForCurrentThread();

pDXGIFactory->CreateSwapChainForCoreWindow(
_pDevice.Get(),
(IUnknown*) wnd,
&swChDesc,
nullptr,
_pSwapChain.GetAddressOf());

Подарок (переверните свои буферы)

while (_bActive)
{
wnd->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
Render();
}

где Render () может быть что-то вроде:

_pSwapChain->Present(1, NULL);
0

Другие решения

Других решений пока нет …