c++ winapi windows-runtime clr screen-orientation

c++ - ¿Es posible determinar la orientación de la pantalla en una aplicación de escritorio nativa de Windows 8.1?



winapi windows-runtime (3)

Me di cuenta de esto. En realidad es mucho más fácil de lo que pensaba. EnumDisplaySettings () no completa el campo dmDisplayOrientation en la estructura DEVMODE, pero EnumDisplaySettingsEx () sí lo hace. Entonces es realmente muy fácil :)

Hay un buen ejemplo aquí .

Necesito dar cuenta de las diferentes orientaciones en las que puede estar un dispositivo. Paisaje Aka, paisaje volteado, retrato o retrato volteado. Mi aplicación está escrita en C ++ nativo y se ejecuta en Windows 8.1 como una aplicación de escritorio (la plataforma multiplataforma no es un requisito en modo alguno).

Sé que puedo determinar si el dispositivo está en modo vertical u horizontal usando los métodos descritos por Microsoft aquí: http://msdn.microsoft.com/en-us/library/ms812142.aspx

Sin embargo, no hay forma de discernir entre paisaje y paisaje volteados (o retrato y retrato volteados).

Podría obtener exactamente lo que necesito marcando la propiedad DisplayInformation.CurrentOrientation , pero es una API de WinRT. Lo que significa que si quisiera usarlo, mi aplicación debería usar CLR, que no es de inicio.

También me gustaría mantener mi aplicación como un ejecutable único y no creo que haya una manera clara de hacerlo y llamar API administradas al mismo tiempo. Pero, de nuevo, soy muy inexperto con integración de código administrado nativo +.

Entonces, ¿alguien sabe de alguna forma de determinar la orientación de la pantalla usando solo código nativo en Windows?


Detectar la ventana SizeChanged en 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">

Luego use para alternar entre vertical u horizontal:

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; } }


También puede comparar la altura y el ancho de la pantalla. Si el valor del ancho era más alto, entonces es horizontal y viceversa.

#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);