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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как модифицировать системное меню формы? 
:(
    Опции темы
Hurricane
Дата 10.4.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 9



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

Может, как-то можно сделать свое ContextMenuStrip? Непонятно только, на какое событие его навешивать. Или все так плохо?
PM MAIL   Вверх
Retro
Дата 11.4.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Диалектик
***


Профиль
Группа: Участник Клуба
Сообщений: 1934
Регистрация: 28.6.2005
Где: Киев

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



Нашел на http://www.codeproject.com

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

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 
Если нужно я просто выложу весь код класса.

Это сообщение отредактировал(а) Retro - 11.4.2007, 01:56
PM MAIL   Вверх
Hurricane
Дата 11.4.2007, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 9



Пасиба, Retro! Так это, в общем-то, то же самое, что я на кодпроджекте видел. Т.е. все надо руками - ловить события, каждому индивидуйно ручками прописывать свой обработчик и т.д., из дезигнера не получится. Я надеялся, что в VS2005 это уже автоматизировали, но, похоже, что нет.
PM MAIL   Вверх
Retro
Дата 11.4.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Диалектик
***


Профиль
Группа: Участник Клуба
Сообщений: 1934
Регистрация: 28.6.2005
Где: Киев

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



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

Я искал такую возможность в VS2005. Не нашел. В принципе разницы особой нет, тем более есть готовый код и не нужно придумывать велосипед.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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