powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Массовый сабклассинг (OldXXXWindowProc?) и прозрачность ComboBox
2 сообщений из 2, страница 1 из 1
Массовый сабклассинг (OldXXXWindowProc?) и прозрачность ComboBox
    #38012181
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

В приложенном ниже примере прозрачность TextBox а также backgroung Combobox (тонкое обрамление вокруг текста) делаю стандартной (для меня уже) подстановкой hbshBackground на сообщения
WM_CTLCOLORBTN/WM_CTLCOLORSTATIC/WM_CTLCOLOREDIT -пускай сам выбирает - код один и тот же
(т.е. сабклассинг единственного PictureBox).

Идем дальше: в Combobox вставлен собственный TextBox/Edit -это я допер.
Т.е. сабклассим сам Combobox на предмет WM_CTLCOLOREDIT, код подстановки картинки тот же но с маленьким отличием:

Код: vbnet
1.
2.
3.
4.
Public Function NewComboWindowProc _
 (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
...
      MapWindowPoints 0, GetParent(GetParent(lParam)), tPt, 2



1. Вопрос 1 (сразу):
А что за елемент, который суть раскрывающийся список (где value1, value2) -он по прежнему белый -его бы как-нибуть тоже прозрачным сделать. То бишь как называется, какой у него WM_CTLCOLOR??? и кто родитель?

2. Вопрос 2
Я не хочу каждый раз добавлять новые NewCombo XXX WindowProc и Public OldCombo XXX WindowProc As Long, когда я добавляю новый Combobox.
Я сделал так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub Form_Load()
...
  Dim Ctr As Control, Count As Long
  For Each Ctr In Me.Controls
    If (TypeOf Ctr Is ComboBox) Then
      Ctr.Tag = CStr(Count)
      OldComboWindowProc = SetWindowLong(Ctr.hWnd, GWL_WNDPROC, _
       AddressOf NewComboWindowProc) 'hbshBackground
      Count = Count + 1
    End If
  Next
  Set Ctr = Nothing

Public OldComboWindowProc As Long

'для событий Combo
Public Function NewComboWindowProc _
...
  NewComboWindowProc = CallWindowProc _
   (OldComboWindowProc, hWnd, Msg, wParam, lParam)
End Function



Оно работает в данном конкретном случае. Но я чувствую задницу.
Я использую общий OldComboWindowProc.
И мне кажется что ето нехорошо.
Как сделать правильно? (OldComboWindowProc употребляется внутри ф-ции NewComboWindowProc и если я например использую массив OldComboWindowProc(), то надо понимать какой его элемент использовать при конкретном вызове NewComboWindowProc.
Или итак сойдет? Но что-то я не уверен.
...
Рейтинг: 0 / 0
Массовый сабклассинг (OldXXXWindowProc?) и прозрачность ComboBox
    #38012351
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А что за елемент, который суть раскрывающийся список (где value1, value2) -он по прежнему белый -его бы как-нибуть тоже прозрачным сделать. То бишь как называется, какой у него WM_CTLCOLOR??? и кто родитель?
С этим разобрался. Есть еще такой
Case WM_CTLCOLORLISTBOX:
Его применяем к Listbox, а раскрывающийся список в Combobox это ListBox.
А parent-ом проще тупо назначать Form1.PictureDigits.hwnd, чтоб именно оттуда нарезался правильный кусок картинки.
С Combobox не очень нравятся толстые белые границы на Win7/Vista.

Пытаюсь освоить Treview на предмет прозрачности, но пока что-то не очень -автоматом только background - работает это только на классике и XP-стиле, на висте-нет. Да и тот прыгает. Что есть item-ы пока не понял.

...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Массовый сабклассинг (OldXXXWindowProc?) и прозрачность ComboBox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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