Программируем на Monogame. Часть 3. Особенности Windows Store приложений

В этой статье мы немного поговорим об особенностях программирования Windows Store приложений.

Сразу заметим, что мы не может управлять размером окна Windows Store приложений. Все приложения запускаются в полноэкранном режиме или в одном из специальных режимов (snapped, например), в оконном режиме запустить их не получится.

Однако управлять разрешением мы можем.

Как и раньше, для этого используется свойства GraphicsDeviceManager.

Например, так мы установим разрешение 400х400:

_graphics.PreferredBackBufferHeight = _graphics.PreferredBackBufferWidth = 400;

Пользователь может самостоятельно изменить режим работы приложения (например, перевести его в snapped режим). И, конечно, нам нужно уметь достойно на это реагировать. В частности, для 3д графики нам нужно заново настроить AspectRatio для камеры, иначе мы получим искаженное изображение 3д объектов.

Напишем простой класс, который будет следить за состоянием экрана приложения:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.Core;
using Windows.UI.ViewManagement;

namespace ContentTest
{
    public enum EWindowState
    {
        Full = 0,
        FullPortrait = 1,
        Snap1Quarter = 2,
        Snap3Quarter = 3
    }

    public class WindowStateArgs : EventArgs
    {
        public EWindowState NewValue { get; set; }
    }

   public static class WindowState

    {

        public delegate void WindowStateEventHandler(WindowStateArgs args);
        public static event WindowStateEventHandler SizeChanged;
        public static EWindowState _windowState;
        public static CoreWindow _window;
        public static Rect _windowsBounds;

        public static void Initialize()
        {
            _window = CoreWindow.GetForCurrentThread();
            _windowsBounds = _window.Bounds;
            _windowState = EWindowState.Full;
            _window.SizeChanged += _window_SizeChanged;
        }

        //called when the window is resized

        static void _window_SizeChanged(CoreWindow sender, WindowSizeChangedEventArgs args)
        {
            if (ApplicationView.Value == Windows.UI.ViewManagement.ApplicationViewState.FullScreenLandscape)
            {
                _windowState = EWindowState.Full;
            }
            if (ApplicationView.Value == Windows.UI.ViewManagement.ApplicationViewState.FullScreenPortrait)
            {
                _windowState = EWindowState.FullPortrait;
            }
            else if (ApplicationView.Value == Windows.UI.ViewManagement.ApplicationViewState.Snapped)
            {
                _windowState = EWindowState.Snap1Quarter;
            }
            else if (ApplicationView.Value == Windows.UI.ViewManagement.ApplicationViewState.Filled)
            {
                _windowState = EWindowState.Snap3Quarter;
            }

            if (SizeChanged != null)
            {
                SizeChanged(new WindowStateArgs() { NewValue = _windowState });
            }

        }

    }

}

Отдельная благодарность читателю моего блога Александру за предложение отличного способа определения текущего состояния приложения.

Теперь нужно только инициализировать WindowState и подписаться на сообщение об измении состояния экрана.

protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            WindowState.Initialize();
            WindowState.SizeChanged += WindowState_SizeChanged;
            base.Initialize();
        }

        void WindowState_SizeChanged(WindowStateArgs e)
        {

        }

В WindowState_SizeChanged мы сможем как-то отреагировать на изменения, например, поставить паузу для режима Snapped.

Еще одна особенность Windows Store приложений, которая может нам пригодится — это стандартное меню настроек, которое вызывается компинацией win+c (или жестом или наведением указателем мыши на правый верхний угол экрана).

Для работы с этими настройками применяются стандратные для Windows Store приложений методы. Например, эти строчки (с небольшими изменениями) взяты с MSDN.

protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            WindowState.Initialize();
            WindowState.SizeChanged += WindowState_SizeChanged;

            SettingsPane.GetForCurrentView().CommandsRequested += Program_CommandsRequested;
            base.Initialize();
        }

        void WindowState_SizeChanged(WindowStateArgs e)
        {

        }

        void onSettingsCommand(IUICommand command)
        {
            SettingsCommand settingsCommand = (SettingsCommand)command;
            MessageDialog msg = new MessageDialog("You selected the " + settingsCommand.Label + " settings command");
            msg.ShowAsync();
        }

        void Program_CommandsRequested(
            SettingsPane settingsPane,
            SettingsPaneCommandsRequestedEventArgs eventArgs)
        {
            UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);

            SettingsCommand generalCommand = new SettingsCommand(
                "generalSettings", "General", handler);
            eventArgs.Request.ApplicationCommands.Add(generalCommand);

            SettingsCommand helpCommand = new SettingsCommand("helpPage", "Help", handler);
            eventArgs.Request.ApplicationCommands.Add(helpCommand);
        }

Получится вот такая менюшка

В следующих статьях мы поработаем в Windows Store Xaml приложениями. Будет делать многостраничные приложения, appbar и т.д.

Реклама
Запись опубликована в рубрике Компьютерная графика с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s