powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как сделать прозрачный TextBox?
4 сообщений из 4, страница 1 из 1
А как сделать прозрачный TextBox?
    #38898228
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть окно свойств.
TabControl, TabPage (UseVisualStyleBackColor=True)

На TabPage отображение идет в виде:

LabelProperty1 TextBoxProperty1 (ReadOnly=True, BorderStyle=None)
LabelProperty2 TextBoxProperty2 (ReadOnly=True, BorderStyle=None)
...
LabelPropertyN TextBoxPropertyN (ReadOnly=True, BorderStyle=None)

TextBoxProperty -используется TextBox а не Label, чтоб по ним можно было пройтись, при необх. скопировать, короче хочу стандартный TextBox

У TextBox есть св-во BackColor, но выставить его в Transparent не получается.
Выставить его в какой-то фиксированный цвет - не вариант, т.к. TabPage (UseVisualStyleBackColor=True) -вообще говоря не фиксированный цвет, а градиент (во всяком случае на XP-теме сильно заметный).
В VB6 такого вопроса не стояло, т.к. там не было такой роскоши как TabPage (UseVisualStyleBackColor=True).
Просто тупо брал GetPixel с верхнего левого угла Tab-а и красил Frame (и все текстбоксы) в этот один цвет - получалось похоже.

У TextBox есть сообщение WM_CTLCOLOREDIT, в обработке которого можно подменить HBRUSH - это я умею, т.е. прозрачность относительно фоновой картинки - не есть проблема. Но для этого надо знать фоновую картинку, которая под ним лежит (чтоб изготовить HBRUSH=CreatePatternBrush(hBitmap)), а я ее не знаю, т.к. это тематический фон Tab-а.

Если красить в один цвет (GetPixel с верхнего левого угла Tab-а), то будет заметно.

Пока вижу 2 варианта:
1) Пытаться брать пиксель цвета из-под верхнего левого угла TextBox-а -для каждого свой - тогда не будет заметно.
2) Отключить UseVisualStyleBackColor для панелей и делать как в VB6 -т.е. красить все в цвет левого верхнего угла Tab-а.

Какие идеи?
...
Рейтинг: 0 / 0
А как сделать прозрачный TextBox?
    #38898235
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот так если.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Class CTextBox
  Inherits TextBox

  Public Sub New()
    SetStyle(ControlStyles.SupportsTransparentBackColor, True)
  End Sub
End Class



С ручной заменой As (New) TextBox на As (New) CTextBox в файле конструктора.
Вроде фурычит.
...
Рейтинг: 0 / 0
А как сделать прозрачный TextBox?
    #38898452
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не работает так. Он его похоже белым делает. На 8-ке тематический фон таба белый, вот и показалось что получилось.
А на XP все сразу ясно, что не работает.
...
Рейтинг: 0 / 0
А как сделать прозрачный TextBox?
    #38898507
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал по тому же принципу что и раньше.
Т.е. беру видимый TabPage (пофиг какой, лишь бы он был прорисован на экране) и второй пиксель слева на уровне Textbox-а (Top), и присваиваю этот цвет текстбоксу.

Код: 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.
Public Class Form1

  Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    ApplyTextBoxesBackColor()
  End Sub

  Private Sub ApplyTextBoxesBackColor()
    Dim st As IntPtr = GetDC(TabControl1.SelectedTab.Handle) 'надо взять видимый Tab, из него тащим цвета
    'здесь выбираем контролы, для которых применяем цвет = цвету таба
    'в данном случае все Textbox-ы на всех вкладках TabControl1
    For Each tp As TabPage In Me.TabControl1.TabPages
      For Each Ctr As Control In tp.Controls
        If TypeOf (Ctr) Is TextBox Then
          'цвет не меняется по горизонтали, поэтому надо взять цвет пикселя, 
          'точно неперекрытого каким-либо контролом, напр. 2-й пиксель в правильной "скан-линии"
          Ctr.BackColor = ColorTranslator.FromWin32(GetPixel(st, 2, Ctr.Top))
        End If
      Next
    Next
    ReleaseDC(TabControl1.SelectedTab.Handle, st)
  End Sub
End Class

Module Module1
  'Device Context Functions
  Public Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As IntPtr
  Public Declare Function ReleaseDC Lib "user32" ( _
   ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Boolean

  'BITMAP Functions
  Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As IntPtr, _
   ByVal nXPos As Integer, ByVal nYPos As Integer) As Integer

End Module



Ну, при смене стиля конечно не сработает если не перевызывать ф-цию, но на это обычно плюю - окно можно закрыть и открыть снова. Картинку прилагаю, чтоб было ясно чего добиваюсь.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как сделать прозрачный TextBox?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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