Консультация № 82888
17.04.2007, 02:38
0.00 руб.
0 4 4
Товарищи эксперты, вот такой вапрос.Есть форма, в которую,предпололжим, вводится имя юзера и пароль, и две кнопки Ok и Canсel. При нажатии ОК подтверждается ввод данных, при нажатии Canсel, соответсвенно совершается выход.А если нажать клавишу Enter на клавиатуре, то она дублирует нажатие кнопки OK. Собственно сам вопрос:в какую сторону копать, чтоб при нажатии клавиши enter совершался выход из программы. Т.е. enter дублировал бы клавишу Cancel

Обсуждение

давно
Старший Модератор
31795
6196
17.04.2007, 10:28
общий
это ответ
Здравствуйте, Chip!

Когда Вы создаете кнопки с помощью CreateWindow обратите внимание dwStyle:BS_DEFPUSHBUTTON этот параметр определяет кнопку для выбора по умолчанию. Кнопка отмечается ободком, ее можно выбрать нажимая клавишу ENTER даже если она не имеет фокуса ввода.
CreateDialog использует CreateWindow в соответствии с шаблоном диалога.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
17.04.2007, 10:49
общий
это ответ
Здравствуйте, Chip!
Или по-другому: ловите WM_COMMAND с кодом IDOK для Enter-а и IDCANCEL для Escape
и делайте по ним все, что хочется.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.04.2007, 12:24
общий
это ответ
Здравствуйте, Chip!
См. установку фокуса на копку.Если я не ошибаюсь то дефалтово фокус установлен на ОК.
Неизвестный
18.04.2007, 20:34
общий
это ответ
Здравствуйте, Chip!

Для того чтобы при нажтии на Enter нажималась какая-либо кнопка, необходимо чтобы эта кнопка имела фокус ввода. Кнопка может быть поумолчанию, но без фокуса ввода, тогда Enter не "нажмет" ее.

Возможны несколько вариантов.

1. При создании диалога из ресурса удобнее поступить следующим образом:

вместо простой кнопки пишем:

DEFPUSHBUTTON текст, id, x, y, ширина, высота [, стиль [, расширенный_стиль]]

параметры, полагаю, и без меня понятны.
ВАЖНО! При этом кнопка будет по умолчанию (с дополнительным бордюром) и с фокусом (при старте диалога). НО если фокус потеряется у кнопки, И фокус НЕ будет принадлежать ДРУГОЙ КНОПКЕ, то все равно Enter "нажмет" ее, иначе, если фокус у другой кнопки, нажмется эта кнопка - с новым фокусом.

2. Для не-диалога нужно вручную установить фокус ввода на нужную кнопку, здесь даже поумолчанию кнопка не поможет (елси даже фокус где-то - не на другой кнопке):

invoke SetFocus,hNewPushButton ;(masm)

где hNewPushButton - хэндл кнопки.

А чтобы сделать бордюрчик как у кнопки по умолчанию, можно либо, как было сказано ранее, при создании кнопки указать атрибут BS_DEFPUSHBUTTON, а можно динамически назначить:

invoke GetWindowLong,hNewPushButton,GWL_STYLE ;получаем стиль кнопки
or eax,BS_DEFPUSHBUTTON ;задаем атрибут кнопки по умолчанию
invoke SetWindowLong,hNewPushButton,GWL_STYLE,eax ;устанавливаем атрибут

Вот основные моменты.
Форма ответа