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

Поиск:

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


Опытный
**


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

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



Приветствую Всех!
Создаю контекстное меню:

Код

ToolStripMenuItem tsMenuItem = new ToolStripMenuItem();
tsMenuItem.Text = "Вверх";
tsMenuItem.ShortcutKeys = Keys.Up;
tsMenuItem.Click += new EventHandler(MoveUp_Click);
cmTreeView.Items.Add(tsMenuItem);



Все компилится. Но при работе проги, в момент создания этого меню, прога вылетает с фразами:
Цитата
Цитата

Значение аргумента 'value' (38) недопустимо для типа перечисления Enum 'Keys'.
Имя параметра: value


Что делаю не так и как с этим бороться?
Или вообще можно ли это делать?
Спасибо.


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 27.9.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 170



Keys.Up = 0x26

Код

public void set_ShortcutKeys(Keys value)
{
    if ((value != Keys.None) && !ToolStripManager.IsValidShortcut(value))
    {
        throw new InvalidEnumArgumentException("value", (int) value, typeof(Keys));
    }
    ...
}

 
проверяем IsValidShortcut
Код

public static bool IsValidShortcut(Keys shortcut)
{
    Keys keys = shortcut & Keys.KeyCode;
    Keys keys2 = shortcut & ~Keys.KeyCode; //будет 0 - равносильно Keys.None
    if (shortcut == Keys.None)
    {
        return false;
    }
    switch (keys)
    {
        case Keys.Delete:
        case Keys.Insert:
            return true;
    }
    if ((keys < Keys.F1) || (keys > Keys.F24))//Keys.F1 = 0x70 ->попадаем внутрь
    {
        if ((keys == Keys.None) || (keys2 == Keys.None)) //вот и эксшепшен
        {
            return false;
        }
        switch (keys)
        {
            case Keys.ShiftKey:
            case Keys.ControlKey:
            case Keys.Menu:
                return false;
        }
        if (keys2 == Keys.Shift)
        {
            return false;
        }
    }
    return true;
}


Вывод - для shotkeys использовать или F... или комбинацию с Ctrl (так и в мануале написано, про Ctrl)
например 
Keys.Control | Keys.A 
даст результат
(0x41 | 0x20000) & ~0xffff = 131072

Это сообщение отредактировал(а) tol05 - 27.9.2007, 15:15


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 27.9.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tol05 @  27.9.2007,  15:15 Найти цитируемый пост)
public void set_ShortcutKeys(Keys value)


Цитата(tol05 @  27.9.2007,  15:15 Найти цитируемый пост)
public static bool IsValidShortcut(Keys shortcut)


А переопределить их можно?


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 27.9.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 170



а почему бы не перехватывать КeyPress и, если нужная тебе клавиша нажата, не вызывать самому
Код

this.ContextMenu.Show(...);

или имитировать событие нажатия правой кнопки мыши на форме?

В последнее время столько контролов переопределял... Замучался уже просто smile

P.S. Да и в использовании Ctrl+... для горячих клавиш есть смысл. Представь себе форму с горячей клавишей "А" и с текстбоксом. Юзер собирается вводить текст, а фокус не на текстбоксе (бывает такое, правда?). Ну и что будет? Думаю, заманается юзер любоваться постоянными контекстными меню довольно быстро   smile 

Это сообщение отредактировал(а) tol05 - 27.9.2007, 17:35


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 27.9.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, Спасибо.


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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