Можно ли определить ориентацию экрана в собственном приложении Windows 8.1 для настольных ПК?

Мне нужно учитывать различные ориентации устройства. Ака пейзаж, перевернутый пейзаж, портрет или перевернутый портрет. Мое приложение написано на родном C ++ и работает на Windows 8.1 как настольное приложение (кросс-платформенность не является обязательной в любом случае).

Я знаю, что могу определить, находится ли устройство в книжной или альбомной ориентации, используя методы, описанные Microsoft здесь: http://msdn.microsoft.com/en-us/library/ms812142.aspx

Тем не менее, нет никакого способа различить пейзаж и перевернутый пейзаж (или перевернутый портрет и портрет).

Я мог бы получить именно то, что мне нужно, проверив DisplayInformation.CurrentOrientation свойство, но это WinRT API. Это означает, что если бы я хотел использовать его, мое приложение должно было бы использовать CLR, который не является стартовым.

Кроме того, мне бы очень хотелось, чтобы мое приложение оставалось одним исполняемым файлом, и я не думаю, что есть простой способ сделать это и одновременно вызывать управляемые API. Но опять же, я очень неопытен с интеграцией нативного + управляемого кода.

Итак, кто-нибудь знает какой-либо способ выяснить ориентацию дисплея, используя только собственный код в Windows?

3

Решение

Я понял это. На самом деле это намного проще, чем я думал. EnumDisplaySettings () не заполняет поле dmDisplayOrientation в структуре DEVMODE, но EnumDisplaySettingsEx () делает. Так что на самом деле это действительно просто 🙂

Там хороший пример Вот.

3

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

Определить размер окна SizeChanged в XAML:

<Page x:Class="ClockCpp.MainPage"Loaded="Page_Loaded"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:ClockCpp"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"Background="black"SizeChanged="Page_SizeChanged">

Затем используйте для переключения между портретом или ландшафтом:

Boolean t46 = true;
void ClockCpp::MainPage::Page_SizeChanged(Platform::Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e)
{
if (t46 == true)
{
t46 = false; // portrait
timetext->FontSize = 120; // 2/3 of 180
Othercontrols->Visibility = Windows::UI::Xaml::Visibility::Visible;
}
else
{
t46 = true; // landscape
timetext->FontSize = 180;
Othercontrols->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
}
}
0

Вы также можете сравнить высоту и ширину экрана. Если значение ширины было выше, то это ландшафт и наоборот ..

#include <windows.h>

int theScreenWidth = GetSystemMetrics(SM_CXFULLSCREEN);
int theScreenHeight = GetSystemMetrics(SM_CYFULLSCREEN);
if (theScreenWidth > theScreenHeight)
MessageBox(NULL,"Run in landscape.","Landscape",MB_OK);
else
MessageBox(NULL,"Run in portrait.","Portrait",MB_OK);
0
По вопросам рекламы [email protected]