|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Например на форме есть текстбоксы, кнопки и т.д. Если все созданы в конструкторе VB, то TabStop=true, TabIndex=0,1,2,3 и все путем. А если я часть контролов создаю через API. Тогда "фокус" будет проскакивать "мимо" API-шных контролов. Непорядок. Если API-UpDown, то он привязан к VB-шному TextBox - и черт бы с ним. Но я предполагаю натыкать на форму API-шных Date/Time Picker -ов, и они будут вперемешку c VB-шными кнопками, текстбоксами и т.п. И при переходе по TAB уже будет некрасиво (не говоря о том что без мышки фиг попадешь). Как выкрутиться? По идее как-то типа событие LostFocus(VB-предыдущий) -> вызов SetFocus(API-следующий) , но чет я не уверен полностью ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 17:11 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Правильно это делается очень муторно, поэтому проще наверное сабклассить контейнер всех элементов, он вроде должен получать уведомления о переходе фокуса. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 17:18 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
AntonariyПравильно это делается очень муторно. А правильно это как? Antonariyсабклассить контейнер всех элементов Элементы рассованы по Picturebox-ам, эти Picrurebox-ы вложены во Frame-ы, Fram-ы в другие PictureBox-ы - форма настроек с применением TabStrip. Так что "контейнер всех элементов" в виде единственной Form1 -такого нет. Не, ну понятно, что куча сабклассингов кучи контейнеров. м-м-м, естественно, vb-шные TabIndex/TabStop нумерованы относительно Form1. А в API нет аналогов TabIndex/TabStop чтоб вписать API-шные контролы в VB-шную модель? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 17:41 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Дмитрий77AntonariyПравильно это делается очень муторно. А правильно это как?IOleInPlaceActivate Дмитрий77Antonariyсабклассить контейнер всех элементовТак что "контейнер всех элементов" в виде единственной Form1 -такого нет.Как это? В воздухе они что ли висят? Должно быть какое-то окно верхнего уровня. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 17:59 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
И если сабклассить то на предмет чего, и чего делать? Потому как если делать тупо "как-то так", то код типа Код: vbnet 1. 2. 3.
,где pTime1 -это API-DTPicker приводит к "двойному фокусу" и полному бардаку. BTW Когда-то уже с этой фигней сталкивался, когда кастомизировал Common Dialogs. Тогда забил на фокусы. Но здесь вроде более простой и понятно обрисованный случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 18:01 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
AntonariyКак это? В воздухе они что ли висят? Должно быть какое-то окно верхнего уровня. Ну если верхнего, то Form1 (относительно которой все TabIndex и в кот. все ЕТО сидит). Ее сабклассить? Хорошо, Дмитрий77то на предмет чего, и чего делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 18:06 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Дмитрий77И если сабклассить то на предмет чего, и чего делать?Не знаю, это предположения. Я в таких случаях сабклассил что попало, смотрел, когда какие сообщения ходят, и пытался найти в этом смысл. Конкретно с фокусом не игрался, так что если тут бардак, то лучше распахивать направление IOleInPlaceActivate. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 18:06 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Вообще-то если вместо Дмитрий77Потому как если делать тупо "как-то так", то код типа Код: vbnet 1. 2. 3.
,где pTime1 -это API-DTPicker приводит к "двойному фокусу" и полному бардаку. делать Код: vbnet 1. 2. 3. 4. 5.
то "бардака" не происходит, и фокус таки устанавливается на pTime1 однозначно, хотя и не все мне нравится (следующая за TextSec4->pTime1 кнопка, кот. не получила свой VB-законный фокус таки окрашивается "черным ободком" -но не точками) Надо попробовать поиграться с Lost/Set на уровне сабклассинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2013, 19:19 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Antonariy..так что если тут бардак, то лучше распахивать направление IOleInPlaceActivate. IOleInPlaceActivate -это видимо оч-чень муторно, я даже близко ничего не понял. Делается оч-чень аккуратная обманка. Например нужен DTPicker name=pTime1 Рисуется PictureBox name=Picture_pTime1 по размерам pTime1 (очень удобно, кстати). Ему присваевается TabIndex (кот. хотим для DTPicker) и делаем Tabstop=true В этот PictureBox размер в размер вставляется DTPicker Код: vbnet 1. 2. 3. 4. 5.
В принципе при работе через клавиатуру достаточно: Код: vbnet 1. 2. 3. 4. 5.
И по табу это будет работать. Но есть тонкий момент. Если мы пришли в DTPicker мышкой не из "предыдущего" контрола, а из другого (минуя контейнер), то из DTPicker мы по TAB уйдем "не туда". Т.е. PutFocus не меняет Form1.ActiveControl. Надо чтобы активным контролом был контейнер Picture_pTime1. Здесь основная обманка: Сабклассим контейнер Picture_pTime1 и исполняем такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Существенно, что делаем именно WM_SETFOCUS , а не PutFocus==SetFocus==Picture_pTime1.SetFocus Т.е. надо послать WM_SETFOCUS (VB-контейнеру), но без WM_KILLFOCUS (API-вкладыша) Это перещелкнет Set Form1.ActiveControl=VB-контейнер при сохранении функциональности фокуса на вкладыше, и обеспечит правильный переход по TAB при выходе. Т.е. по сути "двойной фокус" в данном случае в помощь. Я проверил через Debug -зацикливания не происходит и вроде все корректно. В аттаче рабочий тест. Вроде осилил... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2013, 06:17 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Ну вот, ты стал мастером научного тыка :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2013, 09:47 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
Дмитрий77, с IOleInPlaceActivate для TreeView есть пример на vbAccelerator. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2013, 10:42 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
ЦЦас IOleInPlaceActivate для TreeView есть пример на vbAccelerator. Это или подобное полотнище предлагаете разбирать? Каждый раз пытаясь во что-то вникнуть на vbAccelerator чувствую себя идиотом. Не говоря о том, что из 10 примеров 9 обычно ругаются на отсутствие каких-то местных ocx, что не дает без напряга обозреть результат и отбивает всякое желание заниматься раскопками в километрах часто бесполезного (с точки зрения сформулированной задачи) кода. Чем мой вариант плох? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2013, 12:33 |
|
Последовательность перехода по TAB, если часть контролов VB, а часть через API
|
|||
---|---|---|---|
#18+
90% кода с vbAccelerator это бесполезный глючный шлак. Самая большая проблема с IOleInPlaceActivate это понять, как оно работает, чтобы знать что делать, если не взлетает. А по кодингу это означает подключить модуль и вставить пару десятков строк в свой исходник. А еще им можно пользоваться только в юзерконтроле, поэтому если апи-контролы создаются в виде голых окон, остается лишь самостоятельная игра с фокусом. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2013, 13:16 |
|
|
start [/forum/topic.php?fid=60&tid=2157063]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 262ms |
total: | 384ms |
0 / 0 |