Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在本机Windows 8.1桌面应用程序中确定屏幕方向?_C++_Winapi_Windows Runtime_Clr_Screen Orientation - Fatal编程技术网

C++ 是否可以在本机Windows 8.1桌面应用程序中确定屏幕方向?

C++ 是否可以在本机Windows 8.1桌面应用程序中确定屏幕方向?,c++,winapi,windows-runtime,clr,screen-orientation,C++,Winapi,Windows Runtime,Clr,Screen Orientation,我需要考虑设备可能处于的不同方向。又名横向、横向翻转、纵向或纵向翻转。我的应用程序是用C++编写的,它在Windows 8.1上运行为桌面应用程序(跨平台不是任何要求)。 我知道我可以使用Microsoft在此概述的方法确定设备是纵向还是横向: 但是,无法区分横向和横向翻转(或纵向和纵向翻转) 我可以通过检查属性得到我所需要的,但这是一个WinRT API。这意味着如果我想使用它,我的应用程序将不得不使用CLR,这是一个非初学者 此外,我真的希望将我的应用程序保持为一个可执行文件,我不认为有一种

我需要考虑设备可能处于的不同方向。又名横向、横向翻转、纵向或纵向翻转。我的应用程序是用C++编写的,它在Windows 8.1上运行为桌面应用程序(跨平台不是任何要求)。 我知道我可以使用Microsoft在此概述的方法确定设备是纵向还是横向:

但是,无法区分横向和横向翻转(或纵向和纵向翻转)

我可以通过检查属性得到我所需要的,但这是一个WinRT API。这意味着如果我想使用它,我的应用程序将不得不使用CLR,这是一个非初学者

此外,我真的希望将我的应用程序保持为一个可执行文件,我不认为有一种干净的方法可以做到这一点,同时调用托管API。但话说回来,我对本机+托管代码集成非常缺乏经验


那么,有人知道在Windows中只使用本机代码计算显示方向的方法吗

我知道了。这其实比我想象的容易多了。EnumDisplaySettings()不会填充DEVMODE结构中的dmDisplayOrientation字段,但会填充。所以这其实很简单:)


有一个很好的例子。

检测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">

您还可以比较屏幕的高度和宽度。如果“宽度”值比“景观”值更高,反之亦然

#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);
#包括
int theScreenWidth=GetSystemMetrics(SM_CXFULLSCREEN);
int theScreenhight=GetSystemMetrics(SM_CYFULLSCREEN);
如果(屏幕宽度>屏幕宽度)
MessageBox(空,“横向运行”,“横向”,MB_OK);
其他的
MessageBox(空,“纵向运行”,“纵向”,MB_OK);

显然,我不能使用DisplayInformation.CurrentOrientation,因为DisplayInformation类是仅限Windows应用商店应用程序的类。有人有什么想法吗?应该注意的是,为了在本机桌面应用程序中使用WinRT API,您不需要做任何与CLR相关的事情。您只需要引用WinMD文件。也就是说,DisplayInformation类只为商店应用程序保留,不会在桌面应用程序中运行。这是一个很好的提示。谢谢@zhuman MSFT!似乎仍然存在歧义,因为DEVMODE::dmDisplayOrientation值是DMDO_DEFAULT、DMDO_90、DMDO_180和DMDO_270,而ORIENTATION_首选项值是ORIENTATION_PREFERENCE_横向/横向/横向和纵向。例如,在DMDO_默认值为横向模式的情况下,DMDO_90方向_首选项_纵向还是方向_首选项_纵向翻转?这似乎没有在任何地方定义。此页面:似乎暗示DMDO\u默认值始终是方向\u首选项\u横向,DMDO\u 90是方向\u首选项\u纵向,等等。但是,这与此处的dmDisplayOrientation文档相冲突:不幸的是,它无法区分“横向”和“纵向”“横向翻转”或“纵向翻转”和“纵向翻转”。
#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);