适用于 Windows Phone 8.1(无 XAML)的最小应用程序:与桌面应用程序的差异

Posted

技术标签:

【中文标题】适用于 Windows Phone 8.1(无 XAML)的最小应用程序:与桌面应用程序的差异【英文标题】:Minimal app for Windows Phone 8.1 (no XAML) : differences with desktop app 【发布时间】:2016-03-16 08:00:17 【问题描述】:

我开始使用 C++ 开发 Windows 运行时应用程序。我在 Win32/C++ 开发方面经验丰富,但这对我来说是一个新世界。

以下是我键入的一个最小的非 XAML 应用程序,它从各种来源(MSDN、DirectXTutorial.com 等)收集信息。

我的问题是:在 Windows 桌面中,通过显示空白窗口并接收 PointerPressed 事件来运行良好。但在 Windows Phone 中,我只能到达应用程序启动徽标,什么也没有发生。

这个最小应用程序的两个平台有什么区别?在 Windows Phone 8.1 平台的情况下,我是否需要创建一些 DirectX 或绘图表面?

我正在使用 WIndows 10 主机和 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】:

我找到了,如果没有激活 DX 交换链,您似乎无法在 Phone 8.1 中执行任何操作。因此,最小的无 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);

【讨论】:

以上是关于适用于 Windows Phone 8.1(无 XAML)的最小应用程序:与桌面应用程序的差异的主要内容,如果未能解决你的问题,请参考以下文章

xml 适用于Windows 8.1和Windows Phone 8.1应用程序的扩展器控件的模板。

适用于 Windows Phone 8.1 的 XMPP 库

适用于 Windows Phone 8.1 的后台媒体播放器中的无缝循环

Return to viewmodel 禁用可执行命令 (Caliburn Micro - Windows Phone 8.1)

Windows Phone 8.1 HTML 公司应用程序 - 无法安装公司应用程序

SQLite WinRT 包装器在 Windows phone 8.1 项目中的处理器架构之间提供了不匹配