【问题标题】:Get current orientation of window in winform C#在winform C#中获取窗口的当前方向
【发布时间】:2016-04-23 04:53:13
【问题描述】:

我正在获取窗口当前方向。窗口方向,如 Landscape 、 Portrait 、 Landscape-flipped 和 Portrait-flipped。我曾尝试在窗口应用程序中实现但没有得到任何解决方案。在 C# 中如何使用注册表项或在 c# 中获取和设置方向。

【问题讨论】:

    标签: winforms window orientation screen-orientation


    【解决方案1】:

    是的,在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();
    }
    

    Show in details

    【讨论】:

    • 我没有说不可能,我说没有这种事(意思是没有开箱即用的解决方案)
    【解决方案2】:

    在winforms中没有窗口方向之类的东西。
    您可以使用表单的 Location 和 Size 属性来设置它的显示矩形,但据我所知,您不能像在打印文档中那样轻松地翻转它的内容。

    【讨论】:

    • 我没有任何解决方案。我已经使用上面的代码工作,但有些设备有默认 Landscape 或者有些有 Portrait 。我没有获得 Landscape, Portrait , Landscape-flipped, Portrait-flipped。如果您有解决方案,请给我解决方案..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2013-01-05
    • 2017-08-26
    • 2011-03-03
    相关资源
    最近更新 更多