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


Автор: Hurricane 10.4.2007, 16:41
Ну, то самое, которое по иконке в верхнем левом углу вызывается? Restore, Move, Size, Minimize и т.д.? В MFC это делалось просто, а как в дотнете - что-то не могу найти. Смотрел пример на кодепраджект, там через вызовы dll-ок, в общем - танцы с бубном какие-то.

Может, как-то можно сделать свое ContextMenuStrip? Непонятно только, на какое событие его навешивать. Или все так плохо?

Автор: Retro 11.4.2007, 01:55
Нашел на http://www.codeproject.com/dotnet/CustomWinFormSysMenu.asp

Добавляем:
Код

using System.Runtime.InteropServices;


Код

[DllImport("user32.dll")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("user32.dll")]
        private static extern bool InsertMenu(IntPtr hMenu,
            Int32 wPosition, Int32 wFlags, Int32 wIDNewItem,
            string lpNewItem);

        public const Int32 WM_SYSCOMMAND = 0x112;
        public const Int32 MF_SEPARATOR = 0x800;
        public const Int32 MF_BYPOSITION = 0x400;
        public const Int32 MF_STRING = 0x0;
        public const Int32 IDM_EDITFUNDS = 1000;
        public const Int32 IDM_ANALYZE = 1001;

На событие Form_Load вешаем:
Код

        private void Form1_Load(object sender, EventArgs e)
        {
            IntPtr sysMenuHandle = GetSystemMenu(this.Handle, false);
            //It would be better to find the position at run time of the 'Close' item, but...
            InsertMenu(sysMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty);
            InsertMenu(sysMenuHandle, 6, MF_BYPOSITION, IDM_EDITFUNDS, "Edit Funds");
            InsertMenu(sysMenuHandle, 7, MF_BYPOSITION, IDM_ANALYZE, "Analyze");
        }


И в заключении обработчик:
Код

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SYSCOMMAND)
            {
                switch (m.WParam.ToInt32())
                {
                    case IDM_EDITFUNDS:
                        MessageBox.Show("Clicked 'EditFunds'");
                        return;
                    case IDM_ANALYZE:
                        MessageBox.Show("Clicked 'Analyze'");
                        return;
                    default:
                        break;
                }
            }
            base.WndProc(ref m);
        }

В принципе в коде можно разобраться.

Hurricane, танцы с бубном не так уж и тяжелы, может мало пива запас? smile 
Если нужно я просто выложу весь код класса.

Автор: Hurricane 11.4.2007, 02:38
Пасиба, Retro! Так это, в общем-то, то же самое, что я на кодпроджекте видел. Т.е. все надо руками - ловить события, каждому индивидуйно ручками прописывать свой обработчик и т.д., из дезигнера не получится. Я надеялся, что в VS2005 это уже автоматизировали, но, похоже, что нет.

Автор: Retro 11.4.2007, 10:18
Цитата(Hurricane @  11.4.2007,  01:38 Найти цитируемый пост)
Я надеялся, что в VS2005 это уже автоматизировали, но, похоже, что нет. 

Я искал такую возможность в VS2005. Не нашел. В принципе разницы особой нет, тем более есть готовый код и не нужно придумывать велосипед.

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