Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окно с фиксированной высотой 
V
    Опции темы
Voyager
Дата 13.2.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Интересует как сделать форму с фиксированной высотой  (например как в Delphi 7, на форме меню, тулбары).
Кинул на форму меню, тулбары, все это лежит в toolStripContainer. Окно должно автоматически менять высоту при перетаскивании тулбаров (например по высоте toolStripContainer).

Код:
Код

 public partial class Form1 : Form
    {
        //---------------------------------------------------------------------

        private const int WM_GETMINMAXINFO = 0x24;
        private const int WM_SIZE = 5;
        private const int WM_WINDOWPOSCHANGING = 70;

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

        public struct MINMAXINFO
        {
            public POINTAPI ptReserved;
            public POINTAPI ptMaxSize;
            public POINTAPI ptMaxPosition;
            public POINTAPI ptMinTrackSize;
            public POINTAPI ptMaxTrackSize;
        }

        //---------------------------------------------------------------------

        public Form1()
        {
            InitializeComponent();
        }

        //---------------------------------------------------------------------

        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == WM_GETMINMAXINFO)
            {
                int h = Size.Height - ClientSize.Height + toolStripContainer1.TopToolStripPanel.Height;
                MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
                mmi.ptMinTrackSize.y = h;
                mmi.ptMaxTrackSize.y = h;
                Marshal.StructureToPtr(mmi, m.LParam, true);
            }
            base.WndProc(ref m);
        }

        //---------------------------------------------------------------------

        private void toolStripContainer1_TopToolStripPanel_SizeChanged(object sender, EventArgs e)
        {
            int h = Size.Height - ClientSize.Height + toolStripContainer1.TopToolStripPanel.Height;
            this.Height = h;
        }

        //---------------------------------------------------------------------
    }


Пример в аттаче.

В состоянии WindowState=Normal работает как надо, при максимизации (WindowState=Maximazed) проблемы - окно можно перетаскивать за заголовок (нужно отключить, чтобы в максимизированном состоянии вело себя как обычное окно) и не меняется автоматически высота при перетаскивании тулбаров. При сворачивании-разворачивании сбивается высота окна. Есть идеи как побороть?

В принципе перетаскивание окна в максимизированном состоянии поборол так (как вариант):
Код

        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == WM_GETMINMAXINFO)
            {
                int h = Size.Height - ClientSize.Height + toolStripContainer1.TopToolStripPanel.Height;
                MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
                mmi.ptMinTrackSize.y = h;
                mmi.ptMaxTrackSize.y = h;
                Marshal.StructureToPtr(mmi, m.LParam, true);
            }
            else if (m.Msg == WM_WINDOWPOSCHANGING
                && this.WindowState == FormWindowState.Maximized)
            {
                WINDOWPOS wp = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
                wp.x = this.Left;
                wp.y = this.Top;
                Marshal.StructureToPtr(wp, m.LParam, true);
            }
            base.WndProc(ref m);
        }


Остается автоматическое изменение высоты при Maximazed и сворачивание/разворачивание.


Это сообщение отредактировал(а) Voyager - 13.2.2009, 12:35

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  FixedWindow2.zip 26,76 Kb
PM   Вверх
emmanuil
Дата 17.2.2009, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Файл не смотрел. Если я все правильно понял, то может вот так подойдет?
Код

        private int height;

        public Form1() {
            InitializeComponent();
            height = toolStripContainer1.TopToolStripPanel.Height;
        }

        private void toolStripContainer1_ContentPanel_Resize(object sender, EventArgs e) { // можно вместо этого на событие TopToolStripPanel подписаться
            if (this.WindowState == FormWindowState.Normal) {
                this.ClientSize = new Size(this.ClientSize.Width,
                    this.ClientSize.Height + (toolStripContainer1.TopToolStripPanel.Height - height));
            }
            height = toolStripContainer1.TopToolStripPanel.Height;
        }

PM MAIL   Вверх
Voyager
Дата 17.2.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Решил сам, если кому интересно:

Код

 public partial class Form1 : Form
    {
        //---------------------------------------------------------------------

        private const int WM_GETMINMAXINFO = 0x24;
         private const int WM_WINDOWPOSCHANGING = 0x46;
 
        public struct POINTAPI
        {
            public int x;
            public int y;
        }

        public struct MINMAXINFO
        {
            public POINTAPI ptReserved;
            public POINTAPI ptMaxSize;
            public POINTAPI ptMaxPosition;
            public POINTAPI ptMinTrackSize;
            public POINTAPI ptMaxTrackSize;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct WINDOWPOS
        {
            public IntPtr hwnd;
            public IntPtr hwndInsertAfter;
            public int x;
            public int y;
            public int cx;
            public int cy;
            public int flags;
        }

        //---------------------------------------------------------------------

        public Form1()
        {
            InitializeComponent();
        }

        //---------------------------------------------------------------------

        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == WM_GETMINMAXINFO)
            {
                int h = Size.Height - ClientSize.Height + toolStripContainer1.TopToolStripPanel.Height;
                MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
                mmi.ptMinTrackSize.y = h;
                mmi.ptMaxTrackSize.y = h;
                Marshal.StructureToPtr(mmi, m.LParam, true);
            }
            else if (m.Msg == WM_WINDOWPOSCHANGING
                && this.WindowState == FormWindowState.Maximized)
            {
                WINDOWPOS wp = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
                wp.x = this.Left;
                wp.y = this.Top;
                Marshal.StructureToPtr(wp, m.LParam, true);
            }
            base.WndProc(ref m);
        }

        //---------------------------------------------------------------------

        private void toolStripContainer1_TopToolStripPanel_SizeChanged(object sender, EventArgs e)
        {
            int h = Size.Height - ClientSize.Height + toolStripContainer1.TopToolStripPanel.Height;
            this.Height = h;
            if (WindowState == FormWindowState.Maximized)
            {
                Rectangle rc = RestoreBounds;
                this.MinimumSize = new Size(this.MinimumSize.Width, h);
                Bounds = rc;
            }
            else if (WindowState == FormWindowState.Normal)
            {
                this.MinimumSize = new Size(this.MinimumSize.Width, h);
            }
        }        

        //---------------------------------------------------------------------

       
    }


PM   Вверх
emmanuil
Дата 18.2.2009, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Voyager, ты мой пост читал? Не подошло?!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.