【发布时间】:2016-04-23 04:53:13
【问题描述】:
我正在获取窗口当前方向。窗口方向,如 Landscape 、 Portrait 、 Landscape-flipped 和 Portrait-flipped。我曾尝试在窗口应用程序中实现但没有得到任何解决方案。在 C# 中如何使用注册表项或在 c# 中获取和设置方向。
【问题讨论】:
标签: winforms window orientation screen-orientation
我正在获取窗口当前方向。窗口方向,如 Landscape 、 Portrait 、 Landscape-flipped 和 Portrait-flipped。我曾尝试在窗口应用程序中实现但没有得到任何解决方案。在 C# 中如何使用注册表项或在 c# 中获取和设置方向。
【问题讨论】:
标签: winforms window orientation screen-orientation
是的,在winforms中有窗口方向之类的东西。在 winforms 中获取屏幕旋转角度,例如 0,90,180 或 270。我已经在我的窗口应用程序中实现了这一点。
这是 NativeMethod 类............代码......
using System;
using System.Runtime.InteropServices;
namespace WindowApplication
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public int dmPositionX;
public int dmPositionY;
public int dmDisplayOrientation;
public int dmDisplayFixedOutput;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmFormName;
public short dmLogPixels;
public short dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmICMMethod;
public int dmICMIntent;
public int dmMediaType;
public int dmDitherType;
public int dmReserved1;
public int dmReserved2;
public int dmPanningWidth;
public int dmPanningHeight;
};
public class NativeMethod
{
// PInvoke declaration for EnumDisplaySettings Win32 API
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
// PInvoke declaration for ChangeDisplaySettings Win32 API
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern int ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags);
// helper for creating an initialized DEVMODE structure
public static DEVMODE CreateDevmode()
{
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
return dm;
}
// constants
public const int ENUM_CURRENT_SETTINGS = -1;
public const int DISP_CHANGE_SUCCESSFUL = 0;
public const int DISP_CHANGE_BADDUALVIEW = -6;
public const int DISP_CHANGE_BADFLAGS = -4;
public const int DISP_CHANGE_BADMODE = -2;
public const int DISP_CHANGE_BADPARAM = -5;
public const int DISP_CHANGE_FAILED = -1;
public const int DISP_CHANGE_NOTUPDATED = -3;
public const int DISP_CHANGE_RESTART = 1;
public const int DMDO_DEFAULT = 0;
public const int DMDO_90 = 1;
public const int DMDO_180 = 2;
public const int DMDO_270 = 3;
}
}
在主窗体中使用打击代码............
private string[] orientationNames = new string[4] { "Default", "90", "180", "270" };
private int[] orientationValues = new int[4]{NativeMethod.DMDO_DEFAULT,
NativeMethod.DMDO_90,
NativeMethod.DMDO_180,
NativeMethod.DMDO_270};
public static RotateFlipType currentOrientation { get; set; }
public void ChangeDisplaySettings() {
DEVMODE dm = NativeMethod.CreateDevmode();
GetSettings(ref dm);
switch (dm.dmDisplayOrientation)
{
case 0:
currentOrientation = RotateFlipType.RotateNoneFlipX;
break;
case 1:
currentOrientation = RotateFlipType.Rotate270FlipNone;
break;
case 2:
currentOrientation = RotateFlipType.Rotate180FlipX;
break;
case 3:
currentOrientation = RotateFlipType.Rotate90FlipNone;
break;
}
}
protected void SystemEvents_DisplaySettingsChanged(object sender, EventArgs events)
{
ChangeDisplaySettings();
}
主窗体构造函数…………
public MainForm()
{
SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
ChangeDisplaySettings();
}
【讨论】:
在winforms中没有窗口方向之类的东西。
您可以使用表单的 Location 和 Size 属性来设置它的显示矩形,但据我所知,您不能像在打印文档中那样轻松地翻转它的内容。
【讨论】: