surendra Kandira
surendra Kandira

Reputation: 607

Get current orientation of window in winform C#

I am get window current orientation. window orientation like as Landscape , portrait , Landscape-flipped and portrait-flipped. I had tried to implement in window application but not get any solution. In the C# how to get and set orientation by using registry key or in c#.

Upvotes: 2

Views: 1941

Answers (2)

surendra Kandira
surendra Kandira

Reputation: 607

Yes, There is such thing as orientation of window in winforms. In the winforms get screen rotation angle like 0,90,180 or 270. I have implemented this in my window application.

This is NativeMethod class ............ code.....

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

Use blow code in main form ............

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

        }

Main form constructor.........

 public MainForm()
        {
  SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
            ChangeDisplaySettings();
}

Show in details

Upvotes: 1

ATC
ATC

Reputation: 957

There is no such thing as orientation of a window in winforms.
You can use the form's Location and Size properties to set it's display rectangle, but as far as I know you can't easily flip it's content as in a print document.

Upvotes: 0

Related Questions