powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Последовательность перехода по TAB, если часть контролов VB, а часть через API
13 сообщений из 13, страница 1 из 1
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209658
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например на форме есть текстбоксы, кнопки и т.д.
Если все созданы в конструкторе 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-следующий)
, но чет я не уверен полностью
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209679
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно это делается очень муторно, поэтому проще наверное сабклассить контейнер всех элементов, он вроде должен получать уведомления о переходе фокуса.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209742
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПравильно это делается очень муторно.
А правильно это как?
Antonariyсабклассить контейнер всех элементов
Элементы рассованы по Picturebox-ам, эти Picrurebox-ы вложены во Frame-ы, Fram-ы в другие PictureBox-ы - форма настроек с применением TabStrip.
Так что "контейнер всех элементов" в виде единственной Form1 -такого нет.
Не, ну понятно, что куча сабклассингов кучи контейнеров.

м-м-м, естественно, vb-шные TabIndex/TabStop нумерованы относительно Form1.
А в API нет аналогов TabIndex/TabStop чтоб вписать API-шные контролы в VB-шную модель?
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209783
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77AntonariyПравильно это делается очень муторно.
А правильно это как?IOleInPlaceActivate
Дмитрий77Antonariyсабклассить контейнер всех элементовТак что "контейнер всех элементов" в виде единственной Form1 -такого нет.Как это? В воздухе они что ли висят? Должно быть какое-то окно верхнего уровня.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209790
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И если сабклассить то на предмет чего, и чего делать?
Потому как если делать тупо "как-то так", то код типа
Код: vbnet
1.
2.
3.
Private Sub TextSec4_LostFocus()
  Call SendMessage(pTime1.hWnd, WM_SETFOCUS, 0&, 0&)
End Sub

,где pTime1 -это API-DTPicker
приводит к "двойному фокусу" и полному бардаку.

BTW Когда-то уже с этой фигней сталкивался, когда кастомизировал Common Dialogs.
Тогда забил на фокусы.
Но здесь вроде более простой и понятно обрисованный случай.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209804
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКак это? В воздухе они что ли висят? Должно быть какое-то окно верхнего уровня.
Ну если верхнего, то Form1 (относительно которой все TabIndex и в кот. все ЕТО сидит).
Ее сабклассить?
Хорошо,
Дмитрий77то на предмет чего, и чего делать?
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209805
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И если сабклассить то на предмет чего, и чего делать?Не знаю, это предположения. Я в таких случаях сабклассил что попало, смотрел, когда какие сообщения ходят, и пытался найти в этом смысл. Конкретно с фокусом не игрался, так что если тут бардак, то лучше распахивать направление IOleInPlaceActivate.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38209902
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то если вместо
Дмитрий77Потому как если делать тупо "как-то так", то код типа
Код: vbnet
1.
2.
3.
Private Sub TextSec4_LostFocus()
  Call SendMessage(pTime1.hWnd, WM_SETFOCUS, 0&, 0&)
End Sub

,где pTime1 -это API-DTPicker
приводит к "двойному фокусу" и полному бардаку.
делать
Код: vbnet
1.
2.
3.
4.
5.
Private Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

Private Sub TextSec4_LostFocus()
  PutFocus pTime1.hwnd
End Sub


то "бардака" не происходит, и фокус таки устанавливается на pTime1 однозначно, хотя и не все мне нравится (следующая за TextSec4->pTime1 кнопка, кот. не получила свой VB-законный фокус таки окрашивается "черным ободком" -но не точками)
Надо попробовать поиграться с Lost/Set на уровне сабклассинга.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38210267
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy..так что если тут бардак, то лучше распахивать направление IOleInPlaceActivate.

IOleInPlaceActivate -это видимо оч-чень муторно, я даже близко ничего не понял.

Делается оч-чень аккуратная обманка.
Например нужен DTPicker name=pTime1
Рисуется PictureBox name=Picture_pTime1 по размерам pTime1 (очень удобно, кстати).
Ему присваевается TabIndex (кот. хотим для DTPicker) и делаем Tabstop=true
В этот PictureBox размер в размер вставляется DTPicker

Код: vbnet
1.
2.
3.
4.
5.
Private Sub InitDateTimePicker()
  Set pTime1 = New cDateTimePicker
  Call pTime1.Create(Picture_pTime1.hWnd, DTS_TIMEFORMAT, 0, 0, Picture_pTime1.Width, Picture_pTime1.Height)
  pTime1.Format = "H 'h' mm' min 'ss' sec'"
End Sub



В принципе при работе через клавиатуру достаточно:

Код: vbnet
1.
2.
3.
4.
5.
Private Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As Long

Private Sub Picture_pTime1_GotFocus()
  PutFocus pTime1.hWnd
End Sub



И по табу это будет работать.

Но есть тонкий момент. Если мы пришли в 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.
Public Function NewPicturePTime1WindowProc _
 (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
  Dim tNMH As NMHDR
 
  Select Case MSG
    Case WM_NOTIFY
      CopyMemory tNMH, ByVal lParam, Len(tNMH)
      Select Case tNMH.code
        Case NM_SETFOCUS
          Debug.Print "NM_SETFOCUS(API_Control)"
          Call SendMessage(Form1.Picture_pTime1.hWnd, WM_SETFOCUS, 0&, 0&)
        Case NM_KILLFOCUS
          Debug.Print "NM_KILLFOCUS(API_Control)"
        Case Else
      End Select
    Case Else
  End Select
 
  NewPicturePTime1WindowProc = CallWindowProc _
   (OldPicturePTime1WindowProc, hWnd, MSG, wParam, lParam)
End Function


Существенно, что делаем именно WM_SETFOCUS , а не PutFocus==SetFocus==Picture_pTime1.SetFocus
Т.е. надо послать WM_SETFOCUS (VB-контейнеру), но без WM_KILLFOCUS (API-вкладыша)
Это перещелкнет Set Form1.ActiveControl=VB-контейнер при сохранении функциональности фокуса на вкладыше, и обеспечит правильный переход по TAB при выходе.
Т.е. по сути "двойной фокус" в данном случае в помощь.
Я проверил через Debug -зацикливания не происходит и вроде все корректно.
В аттаче рабочий тест.
Вроде осилил...
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38210399
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, ты стал мастером научного тыка :)
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38210519
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

с IOleInPlaceActivate для TreeView есть пример на vbAccelerator.
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38210850
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦас IOleInPlaceActivate для TreeView есть пример на vbAccelerator.
Это или подобное полотнище предлагаете разбирать?

Каждый раз пытаясь во что-то вникнуть на vbAccelerator чувствую себя идиотом.
Не говоря о том, что из 10 примеров 9 обычно ругаются на отсутствие каких-то местных ocx, что не дает без напряга обозреть результат и отбивает всякое желание заниматься раскопками в километрах часто бесполезного (с точки зрения сформулированной задачи) кода.

Чем мой вариант плох?
...
Рейтинг: 0 / 0
Последовательность перехода по TAB, если часть контролов VB, а часть через API
    #38210980
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
90% кода с vbAccelerator это бесполезный глючный шлак.

Самая большая проблема с IOleInPlaceActivate это понять, как оно работает, чтобы знать что делать, если не взлетает. А по кодингу это означает подключить модуль и вставить пару десятков строк в свой исходник. А еще им можно пользоваться только в юзерконтроле, поэтому если апи-контролы создаются в виде голых окон, остается лишь самостоятельная игра с фокусом.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Последовательность перехода по TAB, если часть контролов VB, а часть через API
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]