![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Споткнулась на дурацкой проблеме: хочу, чтобы когда пользователь нажимает TAB в мультилайн-эдите, этот самый TAB туда и вставлялся - ну то есть отступ возникал. Казалось бы, делов-то... но не тут-то было! Эдит засовываемый в него TAB полностью игнорирует.А именно, когда посылаешь ему TAB в виде WM_KEYDOWN - соответствующий WM_CHAR не приходит. И даже когда засылаешь WM_CHAR с TAB - ноль реакции. Единственное, что сработало - перехватывать WM_KEYDOWN \ TAB и вставлять его в поле руками, т.е. через ReplaceSel. Но это же дичь какая-то!
Ладно, решила посмотреть, как с этим делом справляется нотепад, который и есть Edit. Засунула его под Спай... Результат - WM_KEYDOWN, потом WM_CHAR... вроде все. Никаких следов REPLACESEL (но все работает). Ну там еще чертова прорва всякого мусора - WM_GETTEXT, например, запрашивается стопицот раз минуту, не поймешь, связано ли это со вставкой TAB... Либо там просто программная обработка, либо я где-то туплю. Стили сравнивала, различий нет, кроме флага WANTRETURN (что, кстати, наводит на мысль о ручной обработке, т.к. без него RETURN'ы игонорируются). Какие мысли, друзья? -------------------- ... |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
То есть вместо просто TAB помогает CTRL-TAB... Но нужно именно TAB или разобраться с Notepad'ом? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| YDean |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
Переходом по TAB занимается IsDialogMessage.
Он же шлёт WM_GETDLGCODE на примере MFC - CWnd::IsDialogMessage
Для нативного кода - он вызывается в цикле выборки сообщений.
|
||||
|
|||||
| feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Увы, переход по TAB жёстко вшит в мультилайн-эдит. Потому шаманство с WM_GETDLGCODE и/или IsDialogMessage не даёт результатов.
Вот никак понять не могу -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
| YDean |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
У меня пример с PreTranslateMessage работает.
|
|||
|
||||
| feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Супер! Значит решение есть Думаю, что в ноутраде TAB работает из-за того, что мультилайн-эдит не находится в диалоге, ped->fInDialogBox
при этом принимает значение 0, перехвата TAB'а при WM_CHAR не происходит:
Бит fInDialogBox выставляется в MLEditWndProc при обработке сообщения WM_GETDLGCODE:
И точно! Опрос WM_GETDLGCODE с ненулевым lParam идёт из под IsDialogMessage:
Вывод: если избегать IsDialogMessage (насколько это правильно - вопрос, поскольку затрагивает весь диалог в целом, не только мультилайн-эдит), то можно решить проблему. Функции DialogBox* вызывают IsDialogMessage внутри цикла обработки сообщений, а в MFC при реализации диалога как раз используется свой цикл, не связанный с DialogBox*. Если же использовать мультилайн-эдит в диалоге, то нужно не просто сабклассировать мультилайн-эдит так, чтобы он возвращал ещё и DLGC_WANTTAB (а он этого не делает), так ещё и обнулять lParam при обращении к оригинальной функции окна (если хотя бы раз опросить WM_GETDLGCODE с ненулевым lParam, то бит fInDialogBox во внутренней структуре мультилайн-эдита примет значение 1, да так и останется). От lParam зависит ещё какая-то обработка VK_BACK, но тут надо разбираться... Ну, или не использовать мультилайн-эдит в диалогах, не вызывая при этом IsDialogMessage -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
YDean, насчет PreTranslate и прочего IsDialogMessage я же писала, что обошла это и прямо засылала TAB в контрол, с нулевоцй реакцией.
feodorv, убирание TABSTOP не помогает - я же уже все это перехватила и работаю прямо с эдитом, и фокус никуда не девается. Насчет GetDlgCode \ WANTTAB тоже думала, но посмотрела на нотепад и не обнаружила там следов GetDlgCode. В голову не пришло, что эдит может по-разному работать в диалоге и не в диалоге. Спасибо за идею... мне это дело нужно в одном конкретном месте, там переход по TAB не нужен. В общем, раз понятно, почему, придумаю, как обойти не очень криво. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |