Свои горячие клавиши в меню
От: Fktrc  
Дата: 01.08.05 04:35
Оценка:
Условия:
.NET Framework v1.1.4322, C#
Вопрос:
Можно ли назначить пункту меню любой нестандартный шорткат? В public enum Shortcut, нет, к примеру, комбинации Alt+X, а ведь она уже стала стандартом де-факто для выхода из приложения.
Пока все, до чего дошла мысль — это:
MenuItem  MenuExit = new MenuItem("Exit\tAlt+X", new System.EventHandler(this.MenuExit_Click));

а потом обрабатывать нажатие Alt+X на в обработчике OnKeyDown/Up на главной форме. Но это имхо решение через одно неприличное место...

В дельфи, к примеру, есть функции ShortCut, TextToShortCut, позволяющие одной строчкой создать и назначить любой нестандартный шорткат. Что-нибудь подобное в шарпе есть?
Re: Свои горячие клавиши в меню
От: nzeemin Россия http://nzeemin.livejournal.com/
Дата: 01.08.05 05:46
Оценка:
Здравствуйте, Fktrc, Вы писали:

F>Можно ли назначить пункту меню любой нестандартный шорткат? В public enum Shortcut, нет, к примеру, комбинации Alt+X, а ведь она уже стала стандартом де-факто для выхода из приложения.


Сорри что не в тему, но какой же это "стандарт де-факто"? Посмотрел в IE, calc.exe, notepad.exe, RSDN@Home, Acrobat Reader... — нигде не работает? Может это у Борланда такой стандарт?
Re: Свои горячие клавиши в меню
От: Аноним  
Дата: 01.08.05 06:16
Оценка:
Сразу вспоминается такая хохма: все программисты разделяются на тех, кто делает выход из своих программ по Alt+X, Ctrl+Q и Alt+F4, все остальные разделения — надуманы...
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Свои горячие клавиши в меню
От: Аноним  
Дата: 01.08.05 06:18
Оценка:
Ctrl+Q — это вы про Турбо-Паскаль что-ли


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Свои горячие клавиши в меню
От: Fktrc  
Дата: 01.08.05 06:19
Оценка:
Здравствуйте, nzeemin, Вы писали:

N>Сорри что не в тему, но какой же это "стандарт де-факто"? Посмотрел в IE, calc.exe, notepad.exe, RSDN@Home, Acrobat Reader... — нигде не работает? Может это у Борланда такой стандарт?


Не волнует. Вопрос в другом — нестандартный шорткат и ничего больше.
Re: Свои горячие клавиши в меню
От: orangy Россия
Дата: 01.08.05 06:54
Оценка: 14 (2)
Здравствуйте, Fktrc, Вы писали:

F>Можно ли назначить пункту меню любой нестандартный шорткат? В public enum Shortcut, нет, к примеру, комбинации Alt+X, а ведь она уже стала стандартом де-факто для выхода из приложения.

Shortcut — это очень странная идея Microsoft, призванная, по всей видимости, ограничить буйную фантазию некоторых программистов На самом деле, внутри Shortcut косвенно преобразуется в Keys и проверка идёт уже по нему.

        protected internal virtual bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            MenuItem menuItem = this.FindMenuItemInternal(1, (IntPtr)keyData);
            if (menuItem == null)
                return false;
            return menuItem.ShortcutClick();
        }
        
        private MenuItem FindMenuItemInternal(int type, IntPtr value)
        {
            for (int num1 = 0; num1 < this.itemCount; num1++)
            {
                MenuItem item1 = this.items[num1];
                switch (type)
                {
                    case 0:
                        {
                            if (item1.handle == value)
                                return item1;
                            break;
                        }
                    case 1:
                        {
                            if (item1.Shortcut == ((Shortcut)((int)value)))
                                return item1;
                            break;
                        }
                }
                item1 = item1.FindMenuItemInternal(type, value);
                if (item1 != null)
                    return item1;
            }
            return null;
        }


Так что совершенно спокойно может сделать Keys.Alt|Keys.X, прикастить к Shortcut и радоваться. Вот только отображаться оно может криво. И еще, у Keys совершенно уродский TypeConverter, поэтому в дизайнере оно нормально не работает
... << RSDN@Home 1.1.4 beta 7 rev. 499>>
"Develop with pleasure!"
Re[2]: Свои горячие клавиши в меню
От: Fktrc  
Дата: 01.08.05 07:47
Оценка:
Здравствуйте, orangy, Вы писали:
O>
O>        protected internal virtual bool ProcessCmdKey(ref Message msg, Keys keyData)
O>        {
O>            MenuItem menuItem = this.FindMenuItemInternal(1, (IntPtr)keyData);
O>            if (menuItem == null)
O>                return false;
O>            return menuItem.ShortcutClick();
O>        }
        
O>        private MenuItem FindMenuItemInternal(int type, IntPtr value)
O>        {
O>            for (int num1 = 0; num1 < this.itemCount; num1++)
O>            {
O>                MenuItem item1 = this.items[num1];
O>                switch (type)
O>                {
O>                    case 0:
O>                        {
O>                            if (item1.handle == value)
O>                                return item1;
O>                            break;
O>                        }
O>                    case 1:
O>                        {
O>                            if (item1.Shortcut == ((Shortcut)((int)value)))
O>                                return item1;
O>                            break;
O>                        }
O>                }
O>                item1 = item1.FindMenuItemInternal(type, value);
O>                if (item1 != null)
O>                    return item1;
O>            }
O>            return null;
O>        }
O>


O>Так что совершенно спокойно может сделать Keys.Alt|Keys.X, прикастить к Shortcut и радоваться. Вот только отображаться оно может криво. И еще, у Keys совершенно уродский TypeConverter, поэтому в дизайнере оно нормально не работает



Как я понял из кода, преобразования типов идут в таком порядке Keys -> IntPtr -> int -> Shortcut
Но вот этот код не работает
      Keys a = (Keys.Alt|Keys.X);
      IntPtr b = (IntPtr)a;
      int c = (int)b;
      MenuExit.Shortcut = ((Shortcut)c);


, кидает исключение на последней строчке.

В чем возможный косяк (перепробовал все возможные касты — ни один не прошел)?
Re[2]: Свои горячие клавиши в меню
От: Аноним  
Дата: 01.08.05 08:17
Оценка: 12 (1)
Что в принципе и ожидаемо. Если немножко подсмотреть в Reflector-е то можно увидеть что-то такое:
if (!Enum.IsDefined(typeof(Shortcut), value))
{
throw new InvalidEnumArgumentException("value", (int)value, typeof(Shortcut));
}
Так шта....
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Свои горячие клавиши в меню
От: orangy Россия
Дата: 01.08.05 08:31
Оценка:
Здравствуйте, Virus Quartirus, Вы писали:

VQ>Что в принципе и ожидаемо. Если немножко подсмотреть в Reflector-е то можно увидеть что-то такое:

VQ>if (!Enum.IsDefined(typeof(Shortcut), value))
VQ>{
VQ> throw new InvalidEnumArgumentException("value", (int)value, typeof(Shortcut));
VQ>}
VQ>Так шта....
Да, действительно, прошу прощения, со стандартным MenuItem это не работает. У меня нестандартный
... << RSDN@Home 1.1.4 beta 7 rev. 499>>
"Develop with pleasure!"
Re[4]: Свои горячие клавиши в меню
От: Fktrc  
Дата: 01.08.05 08:35
Оценка:
Здравствуйте, orangy, Вы писали:

O>Здравствуйте, Virus Quartirus, Вы писали:


VQ>>Что в принципе и ожидаемо. Если немножко подсмотреть в Reflector-е то можно увидеть что-то такое:

VQ>>if (!Enum.IsDefined(typeof(Shortcut), value))
VQ>>{
VQ>> throw new InvalidEnumArgumentException("value", (int)value, typeof(Shortcut));
VQ>>}
VQ>>Так шта....
O>Да, действительно, прошу прощения, со стандартным MenuItem это не работает. У меня нестандартный
Жаль. В дельфе есть, причем настолько просто, а в более современном шарпе — фигу...
Даже непонятно, что заставило ограничивать такую ерундовую вещь. Воистину, микрософт как самолет — тошнит, а выйти некуда...
Re[5]: Свои горячие клавиши в меню
От: orangy Россия
Дата: 01.08.05 19:26
Оценка:
Здравствуйте, Fktrc, Вы писали:

O>>Да, действительно, прошу прощения, со стандартным MenuItem это не работает. У меня нестандартный

F>Жаль. В дельфе есть, причем настолько просто, а в более современном шарпе — фигу...
F>Даже непонятно, что заставило ограничивать такую ерундовую вещь. Воистину, микрософт как самолет — тошнит, а выйти некуда...
Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится.

ЗЫ: Многие дельфисты жалуются, что в дотнете отсутствует система Actions. Хотя реализуется она за пару дней.
"Develop with pleasure!"
Re[6]: Свои горячие клавиши в меню
От: Fktrc  
Дата: 02.08.05 05:35
Оценка: -1
Здравствуйте, orangy, Вы писали:
O>Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится.
А нельзя ссылку на меню других производителей? Либо ссылку на литературу, с помощью которой можно из стандартного MenuItem сделать свой нестандартный (я очень сильно начинающий разработчик, пока только шаги FirstStep прошел).
Re[7]: Свои горячие клавиши в меню
От: orangy Россия
Дата: 02.08.05 05:49
Оценка:
Здравствуйте, Fktrc, Вы писали:

F>Здравствуйте, orangy, Вы писали:

O>>Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится.
F>А нельзя ссылку на меню других производителей? Либо ссылку на литературу, с помощью которой можно из стандартного MenuItem сделать свой нестандартный (я очень сильно начинающий разработчик, пока только шаги FirstStep прошел).
У меня меню собственного производства, а вообще их полно всяких. Посмотри как в Janus сделано, там кажется Roeder-овский контрол CommandBar
... << RSDN@Home 1.1.4 beta 7 rev. 499>>
"Develop with pleasure!"
Re: Свои горячие клавиши в меню
От: Fktrc  
Дата: 02.08.05 05:55
Оценка: -1
Здравствуйте, Fktrc, Вы писали:

F>Условия:

F>.NET Framework v1.1.4322, C#
F>Вопрос:
F>Можно ли назначить пункту меню любой нестандартный шорткат? В public enum Shortcut, нет, к примеру, комбинации Alt+X, а ведь она уже стала стандартом де-факто для выхода из приложения.
F>Пока все, до чего дошла мысль — это:
F>
F>MenuItem  MenuExit = new MenuItem("Exit\tAlt+X", new System.EventHandler(this.MenuExit_Click));
F>

F>а потом обрабатывать нажатие Alt+X на в обработчике OnKeyDown/Up на главной форме.

Оказывается, аналогичный прием и в WinApi ShortCut добавляется в текст пункта меню For example, "&Close\tAlt+F4" represents a Close command with the ALT+F4 key, а потом обрабатывается перехватом WM_COMMAND или WM_SYSCOMMAND. Вот что дельфа с людьми делает — я то думал, что ShortCut — стандартный атрибут любого меню и обрабатывается системой. В принципе так оно и есть, но эта система уже не винда, а дельфа
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.