Условия:
.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, позволяющие одной строчкой создать и назначить любой нестандартный шорткат. Что-нибудь подобное в шарпе есть?
Здравствуйте, 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, все остальные разделения — надуманы...
Здравствуйте, nzeemin, Вы писали:
N>Сорри что не в тему, но какой же это "стандарт де-факто"? Посмотрел в IE, calc.exe, notepad.exe, RSDN@Home, Acrobat Reader... — нигде не работает? Может это у Борланда такой стандарт?
Не волнует. Вопрос в другом — нестандартный шорткат и ничего больше.
Здравствуйте, Fktrc, Вы писали:
F>Можно ли назначить пункту меню любой нестандартный шорткат? В public enum Shortcut, нет, к примеру, комбинации Alt+X, а ведь она уже стала стандартом де-факто для выхода из приложения.
Shortcut — это очень странная идея Microsoft, призванная, по всей видимости, ограничить буйную фантазию некоторых программистов На самом деле, внутри Shortcut косвенно преобразуется в Keys и проверка идёт уже по нему.
Так что совершенно спокойно может сделать Keys.Alt|Keys.X, прикастить к Shortcut и радоваться. Вот только отображаться оно может криво. И еще, у Keys совершенно уродский TypeConverter, поэтому в дизайнере оно нормально не работает
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);
, кидает исключение на последней строчке.
В чем возможный косяк (перепробовал все возможные касты — ни один не прошел)?
Что в принципе и ожидаемо. Если немножко подсмотреть в Reflector-е то можно увидеть что-то такое:
if (!Enum.IsDefined(typeof(Shortcut), value))
{
throw new InvalidEnumArgumentException("value", (int)value, typeof(Shortcut));
}
Так шта....
Здравствуйте, Virus Quartirus, Вы писали:
VQ>Что в принципе и ожидаемо. Если немножко подсмотреть в Reflector-е то можно увидеть что-то такое: VQ>if (!Enum.IsDefined(typeof(Shortcut), value)) VQ>{ VQ> throw new InvalidEnumArgumentException("value", (int)value, typeof(Shortcut)); VQ>} VQ>Так шта....
Да, действительно, прошу прощения, со стандартным MenuItem это не работает. У меня нестандартный
Здравствуйте, 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 это не работает. У меня нестандартный
Жаль. В дельфе есть, причем настолько просто, а в более современном шарпе — фигу...
Даже непонятно, что заставило ограничивать такую ерундовую вещь. Воистину, микрософт как самолет — тошнит, а выйти некуда...
Здравствуйте, Fktrc, Вы писали:
O>>Да, действительно, прошу прощения, со стандартным MenuItem это не работает. У меня нестандартный F>Жаль. В дельфе есть, причем настолько просто, а в более современном шарпе — фигу... F>Даже непонятно, что заставило ограничивать такую ерундовую вещь. Воистину, микрософт как самолет — тошнит, а выйти некуда...
Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится.
ЗЫ: Многие дельфисты жалуются, что в дотнете отсутствует система Actions. Хотя реализуется она за пару дней.
Здравствуйте, orangy, Вы писали: O>Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится.
А нельзя ссылку на меню других производителей? Либо ссылку на литературу, с помощью которой можно из стандартного MenuItem сделать свой нестандартный (я очень сильно начинающий разработчик, пока только шаги FirstStep прошел).
Здравствуйте, Fktrc, Вы писали:
F>Здравствуйте, orangy, Вы писали: O>>Да нет, не все так плохо. Решения Microsoft — для масс, пишущих типовые программы. Шаг влево, шаг вправо — и уже требуются собственные контролы, собственные системы и все такое. Так что обращайте свое внимание на компоненты других производителей и всё получится. F>А нельзя ссылку на меню других производителей? Либо ссылку на литературу, с помощью которой можно из стандартного MenuItem сделать свой нестандартный (я очень сильно начинающий разработчик, пока только шаги FirstStep прошел).
У меня меню собственного производства, а вообще их полно всяких. Посмотри как в Janus сделано, там кажется Roeder-овский контрол CommandBar
Здравствуйте, 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 — стандартный атрибут любого меню и обрабатывается системой. В принципе так оно и есть, но эта система уже не винда, а дельфа