· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Фокус ввода в дочерних окнах SyaTabControl32

Посл.отвђт Сообщенiе


Дата: Июл 18, 2004 21:31:07

Всем привет.

Столкнулся с проблемой.

Имеется основной диалог, содержащий в себе SysTabControl32. Каждая страница таб-контрола содержит дочернее окно, в котором имеются EditBox'ы, PushButton'ы и другие элементы. Нужно, чтобы в каждом окне можно было перемещать фокус ввода между контролами с помощью клавиши tab. Т.е. чтобы это работало так же, как в PROPSHEETPAGE.

Если бы не было SysTabControl32, было бы достаточно субклассить остальные контролы по отношению к родительскому диалогу. Вопрос: как это сделать по отношению к SysTabControl32 наиболее "человеческим" способом ?

Есть несколько мыслей. Например самому обрабатывать события TCM_KEYDOWN (при нажатии tab самому перемещать фокус на следующий элемент), а при изменении текущей страницы в tab control проверять все элементы на предмет фокуса ввода (он ведь еще и мышкой меняется) и сохранять, например, хэндл текущего элемента где-нибудь в TCITEM.

В общем, все это выглядит слишком громоздко. Может быть есть способ проще ?


Дата: Июл 18, 2004 23:32:21

В качестве tab-страниц можно использовать диалоги.


Дата: Июл 19, 2004 00:19:14

„В качестве tab-страниц можно использовать диалоги“
Так оно и есть. Т.е. код примерно следующий:

mov MAIN_TAB.imask, TCIF_TEXT
mov MAIN_TAB.lpReserved1, 0
mov MAIN_TAB.lpReserved2, 0
mov MAIN_TAB.iImage, 0
mov MAIN_TAB.lParam, 0
mov MAIN_TAB.pszText, offset Dialog1Text
mov MAIN_TAB.cchTextMax, SIZEOF Dialog1Text
invoke SendMessage, hMainTab, TCM_INSERTITEM, 0, addr MAIN_TAB

mov MAIN_TAB.pszText, offset Dialog2Text
mov MAIN_TAB.cchTextMax, SIZEOF Dialog2Text
invoke SendMessage, hMainTab, TCM_INSERTITEM, 1, addr MAIN_TAB

invoke CreateDialogParam, hInstance, addr Dialog1ID, hMainTab, addr Dialog1Proc, 0
mov hDialog1, eax

invoke CreateDialogParam, hInstance, addr Dialog2ID, hMainTab, addr Dialog2Proc, 0
mov hDialog2, eax

Где Dialog1Proc и Dialog2Proc - соответствующий процедуры обработки сообщений для каждого диалога.

Вопрос в том - как заставить наиболее простым способом переключать фокус ввода между контролами в каждом из диалогов по кнопке tab.


Дата: Июл 19, 2004 02:02:31

Присвоить стиль WS_TABSTOP каждому контролу.


Дата: Июл 28, 2004 14:44:47

Если б все было настолько просто, я и не спрашивал бы :)

Дело в том, что события от дочерних диалогов, находящихся на станицах systabcontrol не обрабатываются как в обычном диалоговом окне стандартными средствами, и "навигации по дефолту" не получается.

Вариантов два:

1. Сабклассить каждый контрол по отношению к его родительскому окну. Радости мало, потому как контролов не один, не два и даже не 10. К тому же если есть несколько radiobutton в groupbox'e, то получится примерно следующее:


radiobutton -> [subclass] -> groupbox -> [subclass] -> child window -> [subclass] -> systabcontrol32 -> [subclass] -> main dialog window

При том, что у нас несколько "страниц" на systabcontrol32, и на каждой из них около или более десятка своих элементов. Выглядит грустно.

Далее. Есть такая штука, как стиль дочернего окна DS_CONTROL, и стиль родительского окна WS_EX_CONTROLPARENT. Такая комбинация, по идее, должна позволить системе самой осуществлять навигацию между родительскими и дочерними окнами и их элементами. Но трудность в том, что у нас 3-4 "уровня" родительских и дочерних диалогов. И при попытке сделать, к примеру, одно из дочерних окон WS_EX_CONTROLPARENT по отношению к эелментам, расположенным в нем, и DS_CONTROL по отношению к systabcontrol, ничего хорошего не выходит.

Может кто-то уже сталкивался с проблемой ?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078