С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5

Запрет фокусировки на кнопке для корректной работы KeyDown

29.08.2012, 22:27. Показов 5345. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Возник вопрос: у меня игрушка, реагирует на нажатие стрелок, решил добавить кнопку "выход", проблема в том, что теперь мышь фокусируется на кнопке и не реагирует на стрелки. Решил имитировать WPF routed events, и вызывать на button.KeyDown событие Form.KeyDown, но почему-то при нажатии кнопок управление к button.KeyDown не возвращается. Почему так я не знаю. Как это можно сделать, скажите, пожалуйста? А то мне кажется, что на wpf у меня не получится сделать, сложновато там имо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2012, 22:27
Ответы с готовыми решениями:

Настройка и запуск VirtualBox для корректной работы ?
Здравствуйте. Хотел установить ос windows 8.1 iso файл. Прежде хочу попробовать её на VirtualBox. Во время настройки машины...

Как переделать функцию для корректной работы?
Всем доброе утро! У меня есть код для замени текста: $string = "raptor editor является редактором с открытым исходным кодом javascript...

Есть ли какие то обновления для Windows 7 x86 для корректной работы Free Pascal
Есть ли какае то обновления для Win7 x86 для корректной работы Free Pascal на ней?

20
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.08.2012, 22:37
А если в обработчике события получения фокуса что-то намудрить?
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
29.08.2012, 22:43
А что при трасировке происходит?

Смотри,в WPF есть 2 способа обращения к компоненту.Из контейнера к компоненту и из компонента к контейнеру(туннелинг или пулинг называется,уже не помню).Попробуй корректно разобраться кто из этих 2-их должен реагировать,а кто реагирует на самом деле.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.08.2012, 22:43  [ТС]
DimanRu, в любом случае, нужно что-то делать со свойством Focus или CanFocus, а они не имеют сеттера. Пробовал делать кнопку Enabled = false, и попробовать её активировать при наведении мыши, но в выключенном состоянии она не реагирует на события. В общем, не знаю не знаю...

Noob.net, я говорю, я попытался эту концепцию реализовать на WF, на WPF все прекрасно бы работало, я и так знаю. Только у меня там рисовать пока плохо получается
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.08.2012, 22:55
А вы не при наведении мыши, а при перемещении мыши, с условием что координаты курсора совпадают с областью, занимаемой кнопкой. Сейчас попробую накидать код.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.08.2012, 22:57  [ТС]
DimanRu, опрашивать мышь при каждом движении - это не очень хорошее решение. Хотя конечно рабочее
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.08.2012, 23:02
Для игра пожалуй, да, не рациональное.
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
29.08.2012, 23:30
Есть событие OnFocus
на WF все должно работать строго и прекрасно.


Цитата Сообщение от Psilon Посмотреть сообщение
решил добавить кнопку "выход", проблема в том, что теперь мышь фокусируется на кнопке и не реагирует на стрелки
Наверное перемудрили с событиями фокусировки.

А зачем мышку таскать при нажатии клавиш?//если такое имеет место
События вызывай а мышка пусть тусуется.

Или проблемы при исп.клавиш?

Добавлено через 1 минуту
Цитата Сообщение от Psilon Посмотреть сообщение
Только у меня там рисовать пока плохо получается
Там просто рай,использовать фигуры как объекты очень удобно)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.08.2012, 00:12  [ТС]
Noob.net, при запуске приложения фокус автоматически смещается на кнопку (т.к. у меня на форме больше вообще нету никаких компонент, которые можно мышкой активировать, не считая меню). И он его автоматически фокусирует
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
30.08.2012, 00:18
Так контролируй фокус.

Или при запуске наблюдается непослушание мыши? Тогда вы что-то начудили в коде.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
30.08.2012, 00:19
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Form1()
{
    InitializeComponent();
    KeyPreview = true;
}
 
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.W:
            button1.Top -= 5;
            break;
        case Keys.S:
            button1.Top += 5;
            break;
    }
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.08.2012, 00:35
смести его куда тебе надобно:

C#
1
Keyboard.Focus(focusableElement);
если хочешь разобраться поглубже, почитай msdn Focus overview
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.08.2012, 00:39  [ТС]
Blood-Angel, не помогает
Noob.net, в InitializeComponent(); происходит смещение фокуса, а потом я уже ничего с ним сделать не могу
novi4ok, у меня такого класса нет
...
Нашел в System.Windows.Input (хотя это неймспейс WPF, если я не ошибаюсь). Соответственно: работать не хочет...
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
30.08.2012, 00:59
Psilon, что? Волшебная студия, которая компилирует код как не у меня? Или ты пытаешься перехватить кнопки управлением фокуса? Ну-ну, успехов.

Добавлено через 12 минут
На тебе грязный хак:
C#
1
2
3
4
5
6
7
8
9
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Down)
    {
        button1.Top += 5;
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.08.2012, 08:18  [ТС]
Blood-Angel, да пожалуйста. Вот код, нужно в MainForm добавить кнопку. Помогите, пожалуйста, так как у меня нифига не получилось (дурак?)
Вложения
Тип файла: rar Snake.rar (106.3 Кб, 7 просмотров)
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
30.08.2012, 11:35
Забавная архитектура. А сколько дыр. Чего только стоит нажать неправильную кнопку на клавиатуре. (:
(Не знаю, правда, почему в форме "Рекорды" нет кнопки закрыть и почему при масштабировании вида игра начинается сначала)
Добавляем кнопку на форму и изменяем таким образом код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public partial class MainForm : Form
{
    /* Поля класса */
 
    public MainForm()
    {
        InitializeComponent();
        KeyPreview = true; // Чтобы срабатывал Form1_KeyDown
    }
 
    // В принципе этот метод можно выкинуть, а содержимое перенести вниз
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Escape:
                exit.PerformClick();
                break;
            case Keys.P:
                PauseItem.PerformClick();
                break;
        }
    }
 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // Чтобы не вылазило исключение, делаем проверку
        if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right)
        {
            Game.SetDirection(keyData);
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
 
    /* Другие методы */
C#
1
// ReSharper disable InconsistentNaming
Resharper - Options - Code Inspection - Inspection Severity - C# - Constraints Violations - Inconsistent Naming - Do not show
Или определить в нужном виде:
Resharper - Options - Code Editing - C# - C# Naming Style

P.S. Сильная привязка статического(?) класса Game к WinForms.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.08.2012, 12:03  [ТС]
Blood-Angel, сильная, и так знаю, подключение WF неймспейса заранее обрекает этот класс на использование в каком-нибудь WPF, это да, но знал бы, как сделать иначе, сделал бы. Я старался максимально развязать код (насколько мне мои знания позволяют), но получилось, видимо, не очень.
(Не знаю, правда, почему в форме "Рекорды" нет кнопки закрыть и почему при масштабировании вида игра начинается сначала)
Я просто убрал кнопки свернуть, развернуть и закрыть, а кнопку "закрыть" свою добавить забыл.
Начинается сначала - потому что при масштабировании меняется размер карты (визуально размер тот же, но количество "клеток" становится меньше, так, чтобы сама карта осталась прежнего размера (в пикселях).

Resharper - Options - Code Inspection - Inspection Severity - C# - Constraints Violations - Inconsistent Naming - Do not show
Или определить в нужном виде:
Resharper - Options - Code Editing - C# - C# Naming Style
это я знаю, мне нужно конкретно, чтобы он не придирался к обработчикам типа "Form1_KeyDown", предлагая переименовать в "Form1KeyDown", а в остальном очень полезная штука.

Добавлено через 12 минут
Хотя если у вас есть время на более детальный просмотр проекта, я бы выслушал конструктивную критику (я же не продавать собираюсь, а учусь и, соответственно, оставляю за собой право на ошибку, которую неплохо бы исправить).

Добавлено через 2 минуты
P.S. Сильная привязка статического(?) класса Game к WinForms.
класс статический, потому что когда я делал поле нестатического класса, и у меня создавались "игры" как экзепмляры класса Game, у меня даже вызов
C#
1
2
3
Game game = new Game();
game = null;
GC.Collect()
НЕ удаляет объект, несмотря на то, что в отладчике пишет, что он null. Яхз почему так.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.08.2012, 12:03
Цитата Сообщение от Psilon Посмотреть сообщение
Нашел в System.Windows.Input (хотя это неймспейс WPF, если я не ошибаюсь). Соответственно: работать не хочет...
извини, недочитался, думал у тебя именно wpf и есть.
1
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
30.08.2012, 12:32
Цитата Сообщение от Psilon Посмотреть сообщение
это я знаю, мне нужно конкретно, чтобы он не придирался к обработчикам типа "Form1_KeyDown", предлагая переименовать в "Form1KeyDown", а в остальном очень полезная штука.
Resharper - Options - Code Editing - C# - C# Naming Style
Должна быть кнопка Advanced Settings, с помощью которой можно добавлять свои правила. Но это не интересно. Если глянуть в средину окна, то можно увидеть надписи типа:
Event handlers naming style:
Event subscriptions on fields: $object$_On$event$
Event subscriptions on this: $event$Handler
Убрать On и будет счастье.

WF - это Windows Workflow Foundation и не что другое. Меня малость вгоняет в ступор такая запись.

Цитата Сообщение от Psilon Посмотреть сообщение
класс статический, потому что когда я делал поле нестатического класса, и у меня создавались "игры" как экзепмляры класса Game
Внутри класса Game есть объекты с интерфейсом IDisposable. Т.е. приравнять класс к null будет не достаточно.

Цитата Сообщение от Psilon Посмотреть сообщение
при масштабировании меняется размер карты
Не очевидное масштабирование как по мне. Да и пользы от него нет. Вот допустим: у меня маленькое разрешение экрана, но я хочу себе большое поле, но мне этого не дают, заставляя играть с большими (даже с огромными, ведь у меня маленькое разрешение экрана) спрайтами на маленьком поле. Т.е. правильнее было бы ввести возможность изменения размеров этих самых спрайтов и/или их количества.

Цитата Сообщение от Psilon Посмотреть сообщение
Хотя если у вас есть время на более детальный просмотр проекта, я бы выслушал конструктивную критику
Так не интересно. Если проект вида "написал и забыл", то даже паттерны проектирования желательно не использовать, так как это повышает сложность и время разработки приложения. Иначе же, интереснее самому к нужному виду прийти. Как наводка: создаем новое решение, выносим всю бизнес-логику в библиотеку и в том же решении создаем еще два проекта (один - WinForms, другой - что-нибудь еще). После чего абстрагируем библиотеку таким образом, чтобы она корректно работала в обоих типах клиентов, но так, чтобы клиент обращался только к этой библиотеке, т.е. в клиенте создавать классы бизнес-логики не есть хорошо (как к примеру тот же _keyToDirection).
Бывает правда случаи, когда невозможно вынести общую логику. Если интересно, то есть цикл уроков, где демонстрируется магия (на английском хотя):
Смотреть видео
. Коротко о сути: автор показал как реализовать калькулятор в лоб, после чего разбил код на слои.
1
30.08.2012, 14:42

Не по теме:

Цитата Сообщение от Blood-Angel Посмотреть сообщение
Если интересно, то есть цикл уроков, где демонстрируется магия (на английском хотя)
тот парень демон ]:->
где мой крест..)))

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2012, 14:42
Помогаю со студенческими работами здесь

Где нужно всунуть Критическую секцию для корректной работы
Здравствуйте, есть такая проблема, точнее я полагаю, что она там есть. В обще при создании форм я достаю информацию из ИНИ файла. И иногда...

Определить, какое количество видеопамяти необходимо для корректной работы сотового телефона
Сотовый телефон (коммуникатор) имеет следующие параметры экрана: ширина дисплея 128 высота дисплея 480 количество отображаемых цветов...

Ищу драйвера под видеокарту Intel HD Graphics для корректной работы OpenGL
Решили с другом по деградировать немного в майнкрафте. Раньше пару раз играл и всё было нормально. Теперь вылезает ошибка с...

Как запускать программу так, чтобы ей были доступны необходимые для её корректной работы каталоги с файлами?
Добрый день, есть программа, с каталогами, в которых хранятся необходимые для корректной работы файлы. При попытке запустить программу из...

Восстановление корректной работы БД Аксесс-2003
Форумчане! БД стала работать некорректно? т.е подвисать при сохранении изменений в режиме конструктора, при попытке напечатать отчет -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru