Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Размеры формы


Автор: Vit 10.1.2008, 04:27
Задача такая. Пусть есть форма, на которую юзверь нажал на кнопку Maximize. Как узнать какие размеры формы будут у формы, когда её опять переведут в Normal? 

Автор: farad 10.1.2008, 10:23
посмотри RestoreBounds

Автор: Kefir 10.1.2008, 10:38
угу, добью ссылкой - http://msdn2.microsoft.com/en-us/library/system.windows.forms.form.restorebounds.aspx В)

Автор: Vit 10.1.2008, 16:33
Цитата(Kefir @  10.1.2008,  01:38 Найти цитируемый пост)
угу, добью ссылкой - http://msdn2.microsoft.com/en-us/library/s...torebounds.aspx В) 



Написано что не поддерживается .net 1.0 

Автор: Kefir 10.1.2008, 17:18
ах даже так?.. ну тогда лови максимайз и запоминай вручную.

Автор: stab 10.1.2008, 17:20
тогда видимо либо отслеживать эти размеры с самого рождения формы, что довольно суетно:

Код

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        normalBounds = Bounds; // -1 for Left/Top means not assigned or position is system defined
    }

    private Rectangle normalBounds;

    private void Form1_SizeChanged(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Normal)
        {
            normalBounds = Bounds;
        }
    }

    private void Form1_LocationChanged(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Normal)
        {
            normalBounds = Bounds;
        }
    }
}


либо Win32 API + GetWindowPlacement + rcNormalPosition, что невыносимо.. т.е. непереносимо.. т.е. некрасиво smile

Код

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public Rectangle NormalBounds
    {
        get
        {
            NativeMethods.WINDOWPLACEMENT placement = new NativeMethods.WINDOWPLACEMENT();
            placement.length = Marshal.SizeOf(typeof(NativeMethods.WINDOWPLACEMENT));
            NativeMethods.GetWindowPlacement(this.Handle, ref placement);
            return Rectangle.FromLTRB(
                placement.rcNormalPosition.left,
                placement.rcNormalPosition.top,
                placement.rcNormalPosition.right,
                placement.rcNormalPosition.bottom
            );
        }
    }
}

static class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern bool GetWindowPlacement(IntPtr hWnd,
        ref WINDOWPLACEMENT lpwndpl);

    public struct POINT
    {
        public int x;
        public int y;
    }

    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    public struct WINDOWPLACEMENT
    {
        public int length;
        public int flags;
        public int showCmd;
        public POINT ptMinPosition;
        public POINT ptMaxPosition;
        public RECT rcNormalPosition;
    }
}

Автор: Kefir 10.1.2008, 17:27
Код

MyForm.SizeChanged += new EventHandler(this.MyForm_SizeChanged);
private void MyForm_SizeChanged(object sender, System.EventArgs e)
{
  if(this.WindowState != FormWindowState.Maximized) {
    // запоминать тут куда надо В)
  }
}

Автор: Vit 10.1.2008, 17:41
да уж... :( именно таких решений я пытаюсь обычно избегать. некрасиво... но видно ничего другого не остаётся...

Автор: stab 10.1.2008, 17:48
что делать.. :\

Автор: Kefir 10.1.2008, 17:54
Vit, из праздного интереса - откуда ограничение на 1.0?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)