Как перейти к следующему доступному элементу окна?
Курсор стоит на первом поле. Второе поле недоступно.
Как по нажатию на клавишу Enter перейти на следующий доступный элемент окна?
На диалоговом окне есть несколько полей ввода, кнопок ...
Курсор стоит на первом поле. Второе поле недоступно.
Как по нажатию на клавишу Enter перейти на следующий доступный элемент окна?
Есть встроенный механизм навигации по ТАБ, а Enter используется обычно для окончания ввода
Если ты переопределишь значение клавиши, то твоя программа станет уникальной в части управления,
т.к. нужно сказать пользователям что нажимать вместо Enter.
А по поводу как:
1. нужен новый обработчик клавиатуры, кот
перехватывает нажатия нужных тебе клавиш
OnKeyDown(); ОnKeyUp()
2. Переход от одного элемента к другому можно
организовать с пом. SetFocus()
Есть встроенный механизм навигации по ТАБ, а Enter используется обычно для окончания ввода
Если ты переопределишь значение клавиши, то твоя программа станет уникальной в части управления,
т.к. нужно сказать пользователям что нажимать вместо Enter.
А по поводу как:
1. нужен новый обработчик клавиатуры, кот
перехватывает нажатия нужных тебе клавиш
OnKeyDown(); ОnKeyUp()
Здесь проблем нет.
2. Переход от одного элемента к другому можно
организовать с пом. SetFocus()
А вот как в случае что следующий элемент может быть недоступным? Я имею ввиду может есть какая-нибудь функция чтобы перейти на следующий доступный элемент, а не самому вычислять какой из них доступен?
А как можно иммитировать клавишу ТАБ ?
А вот как в случае что следующий элемент может быть недоступным? Я имею ввиду может есть какая-нибудь функция чтобы перейти на следующий доступный элемент, а не самому вычислять какой из них доступен?
SetWindowLong() управляет всеми прибамбасами: WS_VISIBLE, WS_DISABLED а так же WS_TABSTOP
Устанавливаешь или вбрасываешь WS_TABSTOP
и по TAB IMHO должно работать так как ты желаешь
Программно переходишь по GetNextDlgTabItem()
А как можно иммитировать клавишу ТАБ ?
SendMessage( .... WM_KEYDOWN..... ) в соответствующее окно, значения для lparam и wparam найдешь
SetWindowLong() управляет всеми прибамбасами: WS_VISIBLE, WS_DISABLED а так же WS_TABSTOP
Устанавливаешь или вбрасываешь WS_TABSTOP
и по TAB IMHO должно работать так как ты желаешь
Программно переходишь по GetNextDlgTabItem()
SendMessage( .... WM_KEYDOWN..... ) в соответствующее окно, значения для lparam и wparam найдешь
Получилось так:
::SendMessage(m_hWnd, WM_NEXTDLGCTL, 0, 0);
Но появилась следующая проблема:
Разместил в окне диалога CEdit и растянул его по вертикали на несколько строк.
Теперь мне нужно чтобы если текст в CEdit не вмещается в одной строке, то переносился бы на другую строку (без символов перевода строки). В диалоге есть обработка OnOK() где я и перехожу на следующий элемент.
Если устанавливаю свойство Multiline=true - текст переносится, но при этом по "Enter" OnOK() не вызывается, а если Multiline=false, то OnOK() вызывается!
Как можно в данном случае отловить нажатие клавиши "Enter"?
Нужен дополнительный признак, напр. специальная комбинация клавиш, кот указывает что след. Enter это конец.
Но нажатие ОК IMHO лучше, тк привычней для всех.
Обычно редакторах так и делают:
Нажимают кнопки или выбирают пункты меню,
а не вынуждают вводить что-то, к тексту не относящееся