powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Граница Combobox при включенных стилях. Толщина и цвет.
6 сообщений из 6, страница 1 из 1
Граница Combobox при включенных стилях. Толщина и цвет.
    #38286037
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметно только если Combo прозрачный.
Не могу понять как бороться с жирной белой границей.
Особенно заметно на "Вистах" -где кнопка в обычном состоянии белая и сливается с границей.
Прозрачность делается (придаточный Listbox не рассматриваем) в основном за счет:
WM_CTLCOLOREDIT при сабклассинге Combo.
(TextBox в котором Combo отображает текст).
Но, что интересно, на классике,
если сабклассить контейнер в кот. сидит Combobox,
то можно отработать еще один WM_CTLCOLOREDIT
(4-я сверху картинка для классики выгодно отличается от3-ей).
Т.е. получается, что кроме внутреннего TextBox есть еще и внешний? Или это "сам Combo"?
Но при этом на "Вистах" и XP стиле эта вторая "доводка" (WM_CTLCOLOREDIT от сабклассинга контейнера) не срабатывает.

Я хочу уменьшить толщину беложирной линии и м.б. поменять ее цвет. Есть идеи?
...
Рейтинг: 0 / 0
Граница Combobox при включенных стилях. Толщина и цвет.
    #38286102
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Но, что интересно, на классике,
если сабклассить контейнер в кот. сидит Combobox,
то можно отработать еще один WM_CTLCOLOREDIT
(4-я сверху картинка для классики выгодно отличается от3-ей).
Т.е. получается, что кроме внутреннего TextBox есть еще и внешний? Или это "сам Combo"?

hwnd того кто посылает этот WM_CTLCOLOREDIT = hwnd Combo, т.е. это он и есть
Единственный видимый вариант - отрабатывать WM_PAINT в Combobox
Тупо вырезать прямоугольник (ValidateRect), оставляя по 1 пикселю белого с каждой стороны,
ну а прямоугольник заливать куском картинки. А текстбокс сквозь него "прорвется".
Ну или врезать в этот вырезанный прямоугольник другой -под размер текстбокса (через InValidateRect).

Как то так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    Case WM_PAINT
      'http://www.rsdn.ru/forum/mfc/1846939.all
      Debug.Print "WM_PAINT(Combo)"
      
      GetClientRect Form1.Combo2.hwnd, rc
      rc.Right = rc.Right - GetSystemMetrics(SM_CXVSCROLL) - 1
      rc.Top = rc.Top + 2
      rc.Bottom = rc.Bottom - 2
      rc.Left = rc.Left + 2
      ValidateRect Form1.Combo2.hwnd, rc



Т.е. я вырезаю внутренность, оставляя внешнюю часть родной границы и родную кнопку.
Предварит. результат для XP стиля виден на картинке (издеваюсь над верхним Combobox).
...
Рейтинг: 0 / 0
Граница Combobox при включенных стилях. Толщина и цвет.
    #38286755
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну вроде все осилилось по методу как предположил.
То что мне не нравится это из области рисования.
К счастью код для XP и Виста темы совпадает по пикселям.
Надо вырезать в WM_PAINT прямоугольник, в нем вырезать еще один.
То что между ними - рисуем сами (кладем туда рамку из картинки) -ValidateRect.
А то что по обе стороны - рисуется штатно - InValidateRect.
Визуально - уменьшаем толщину белой рамки на 1px, а на "вистах" -справа где кнопка на 2px.
И это смотрится уже совсем по другому.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    Case WM_PAINT
      If ThemesEnabled(Form1.Combo2.hwnd) Then
        'http://www.rsdn.ru/forum/mfc/1846939.all
        Debug.Print "WM_PAINT(Combo)"
        GetClientRect Form1.Combo2.hwnd, rc 'combo целиком
         
        'вырезаем прямоугольник, не перерисовываем родную кнопку и внешнюю часть родных границ
        Dim rc1 As RECT
        rc1 = rc
        rc1.Right = rc1.Right - GetSystemMetrics(SM_CXVSCROLL) - 1
        rc1.Top = rc1.Top + 2
        rc1.Bottom = rc1.Bottom - 2
        rc1.Left = rc1.Left + 2
        ValidateRect Form1.Combo2.hwnd, rc1
         
        'внутри первого прямоугольника вырезаем еще один(текстбокс+примыкающая область и тоже не перерисовываем)
        rc1 = rc
        rc1.Right = rc1.Right - GetSystemMetrics(SM_CXVSCROLL) - 3
        rc1.Top = rc1.Top + 3
        rc1.Bottom = rc1.Bottom - 3
        rc1.Left = rc1.Left + 3
        InvalidateRect Form1.Combo2.hwnd, rc1, False
         
        'рисуем кусок картинки только для области между прямоугольниками(стираем внутр. часть границы)
        DrawComboBox Form1.Combo2, rc, Form1.PictureDigits.hwnd
      End If



Ну и отрисовка рамки из картинки. Лишнего лучше не рисовать, поэтому рисуем только рамку из 4-х PatBlt:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Public Sub DrawComboBox(the_combo As ComboBox, rc1 As RECT, hwndParent As Long)
  'rc1 - из GetClientRect(the_combo), в отличии от rc -кот. GetWindowRect(the_combo)
  'как rc1 так и rc -это the_combo целиком
  'hwndParent -Picturebox с картинкой которому принадлежит the_combo

  Dim rc As RECT
  Dim tPt As POINTAPI
  Dim the_hdc As Long
  Dim hbmDstOld As Long
  
  the_hdc = GetDC(the_combo.hwnd)
  hbmDstOld = SelectObject(the_hdc, hbshBackDigits)
  SetBkMode the_hdc, TRANSPARENT
  GetWindowRect the_combo.hwnd, rc
  tPt.x = rc.Left
  tPt.y = rc.Top
  MapWindowPoints 0, hwndParent, tPt, 2
  rc.Left = tPt.x
  rc.Top = tPt.y
  SetBrushOrgEx the_hdc, -rc.Left, -rc.Top, tPt
  
  'вариант ниже закрашивает картинкой весь прямоугольник, включая Textbox -
  'это излишество, и приведет к мерцанию, Textbox заполняется по WM_CTLCOLOREDIT
  'PatBlt the_hdc, 2, 2, (rc1.Right - rc1.Left - GetSystemMetrics(SM_CXVSCROLL) - 3), _
  ' (rc1.Bottom - rc1.Top - 4), PATCOPY
  
  'закрашиваем границу прямоугольника отрезками в 4 этапа
  'верх (1px)
  PatBlt the_hdc, 2, 2, (rc1.Right - rc1.Left - GetSystemMetrics(SM_CXVSCROLL) - 3), 1, PATCOPY
  'низ (1px)
  PatBlt the_hdc, 2, rc1.Bottom - rc1.Top - 3, (rc1.Right - rc1.Left - GetSystemMetrics(SM_CXVSCROLL) - 3), 1, PATCOPY
  'слева(1px)
  PatBlt the_hdc, 2, 2, 1, (rc1.Bottom - rc1.Top - 4), PATCOPY
  'справа(2px)
  PatBlt the_hdc, (rc1.Right - rc1.Left - GetSystemMetrics(SM_CXVSCROLL) - 3), 2, 2, (rc1.Bottom - rc1.Top - 4), PATCOPY
  
  SelectObject the_hdc, hbmDstOld
  ReleaseDC the_combo.hwnd, the_hdc
End Sub
...
Рейтинг: 0 / 0
Граница Combobox при включенных стилях. Толщина и цвет.
    #38286763
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вот так выглядит:
...
Рейтинг: 0 / 0
Граница Combobox при включенных стилях. Толщина и цвет.
    #38287568
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, по моему скромному мнению то чем Вы занимаетесь должно было уладиться так:
кто-то ещё в бытность VB1 заметил эти проблемы с недостаточностью настроек и уже в VB2 это устранилось, а тут уже ВБ6 имеет, а воз и ныне там... и сто % в ВБ7 никто не собирается это улаживать - нужно же на форумах воздух гонять...
...
Рейтинг: 0 / 0
Граница Combobox при включенных стилях. Толщина и цвет.
    #38288555
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа,

А VB7 и не будет никогда.
Есть VB.NET (2003,2005,2008,2010,2012) но там (вроде как) свои контролы (кстати с теми же проблемами и возможно с большими).
VB6 по крайней мере позволяет в целом нормально и с ходу нарисовать штатные виндовые контролы в конструкторе и без API (допиливается то ведь далеко не все).
Чего нельзя сказать про WinForms.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Граница Combobox при включенных стилях. Толщина и цвет.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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