помогите доделать прозрачный текстбокс

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

помогите доделать прозрачный текстбокс

Сообщение arthur2 » 03.04.2019 (Ср) 16:16

Весь мозг уже сломал - не могу сообразить, чего добавить

На форме создаю тесктэдит:
Код: Выделить всё
hwndTx = CreateWindowExW(WS_EX_TRANSPARENT _
       , StrPtr("Edit"), StrPtr("ля-ля-ля") _
       , WS_BORDER Or WS_CHILD Or WS_VISIBLE Or &H4& _
       , 0, 0, 150, 150, Me.hwnd, 0, App.hInstance, 0)

Сублкассирую и эдит, и форму.
В винпрок это:
Код: Выделить всё
Public Function winProc(ByVal hwnd As Long, uMsg As Long, wParam As Long, lParam As Long, ByVal PrevProc As Long) As Long
    Dim aRect As RECT
   
    Select Case uMsg
    Case WM_CTLCOLOREDIT
         winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
         If hwnd = hwndF Then
            SetBkMode wParam, 1
         End If
'    Case WM_PAINT
    Case WM_ERASEBKGND
       If hwnd = hwndTx Then
          '  winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
       Else
           winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
       End If
    Case Else
       winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
    End Select
End Function


Эдит отлично работает - можно печатать, можно выделять текст. Но - не затирает то, что уже не действительно. Стираешь тест - картинка от него остаётся. Если утащить окно за край экрана, а потом вернуть - эдит приобретает должный вид. Как побороть?
Вложения
TransparentTextBox.zip
(166.7 Кб) Скачиваний: 155
Артур
 
   

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: помогите доделать прозрачный текстбокс

Сообщение The trick » 03.04.2019 (Ср) 19:08

UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: помогите доделать прозрачный текстбокс

Сообщение arthur2 » 03.04.2019 (Ср) 21:53

Спасибо! В общем, да, получилось.

Но только все-таки это ведь костыль :) Как бы проблему принципиально решить? А то эдит жутко мерцает, когда выделяешь что-нибудь или стираешь. Когда печатаешь - тоже мерцает, но там можно повесить флаг и во время набора обрабатывать как было. Правда, это будет ещё один костыль :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: помогите доделать прозрачный текстбокс

Сообщение arthur2 » 04.04.2019 (Чт) 4:15

Так-с... Повесить флаг при наборе не получается, потому что ведь можно печатать не только в конце текста, но и в середине, когда текст раздвигается и картинка тоже должна обновляться :( Мерцает, зараза
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: помогите доделать прозрачный текстбокс

Сообщение arthur2 » 04.04.2019 (Чт) 7:06

В твоём примере исправил ошибку. У тебя
Код: Выделить всё
            SetBkMode wParam, TRANSPARENT
            Ret = GetStockObject(NULL_BRUSH)
выполнялись вне зависимости от флага isRedraw. Сдвинул их внутрь условия. Мерцать стало значительно меньше. Уже почти терпимо :) Но всё равно мерцает...

Код: Выделить всё
        ' Если флаг перерисовки родителя не установлен, тогда перерисовываем фон под собой
        If Not isRedraw Then
            ' Проецируем координаты рабочей области на родителя
            GetClientRect lParam, RC
            MapWindowPoints lParam, hwnd, RC, 2
            ' Рисуем фон родителя под текстбоксом
            isRedraw = True
            RedrawWindow hwnd, RC, 0, RDW_INVALIDATE Or RDW_UPDATENOW Or RDW_ALLCHILDREN
            isRedraw = False
            ' Исключаем всю область, т.к. предыдущий вызов уже отрисовал текст
            ExcludeClipRect wParam, 0, 0, RC.iRight, RC.iBottom
        Else
            ' Установка прозрачной кисти и типа фона текста
            SetBkMode wParam, TRANSPARENT
            Ret = GetStockObject(NULL_BRUSH)
        End If

Кстати, без Ret = GetStockObject(NULL_BRUSH) всё работает так же.
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 2

    TopList