Как заблокировать текстовый объект на события

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

Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 04.02.2020 (Вт) 14:35

Здравствуйте!
Подскажите, пожалуйста, как мне полностью заблокировать обычный Text объект на форме? Таким образом, чтобы при кликах не выделялся текст, не появлялось контекстное меню, одним словом, - Text превратить в обычный Label. Сам Label применить не могу по определенным причинам – долго объяснять, поэтому пришлось использовать Text, убрать все бордеры и белый фон превратить в цвет формы, ну и т.д. Осталась проблема: убрать все реакции на события – все! Text должен просто выводить информацию – больше не требуется. Как мне это сделать???
Такие свойства, как...

Text1.Enabled = False
Не подходит, поскольку цвет самого текста становится серым и трудночитаемым.

Text1.Locked = True
Исключает ввод теста, но выделения и контекстное меню все равно остаются.

Пробовал использовать сабклассинг...

in Form...
Код: Выделить всё
Private Sub Form_Load()
  Text1.Locked = True
  thWnd = Text1.hWnd
  OldWndProc = SetWindowLong(thWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  SetWindowLong thWnd, GWL_WNDPROC, OldWndProc
End Sub


in Module...
Код: Выделить всё
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4
'Public Const WM_ACTIVATE = &H6

Public thWnd As Long
Public OldWndProc As Long
Public Const WM_MOUSEACTIVATE = &H21

Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  WindowProc = CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam)
   
  If Msg = WM_MOUSEACTIVATE Then
   Debug.Print Msg
  End If
End Function


Это работает, но меню и выделения все равно происходят. Как быть??? Может есть более простые пути???

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как заблокировать текстовый объект на события

Сообщение pronto » 05.02.2020 (Ср) 13:05

Отрисовать текст в PictureBox функцией DrawText или методом .Print. Проще — некуда...
O, sancta simplicitas!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 05.02.2020 (Ср) 14:39

Блин... так это надо кардинально переделывать проект. Значит, с самим Text ничего не получится??? Я сейчас пробую может как-то просто фокус сбрасывать? Пока пробую... но что-то не очень...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как заблокировать текстовый объект на события

Сообщение Mikle » 05.02.2020 (Ср) 15:00

Text1.Enabled = False не устраивает серым цветом? Может быть попробовать с этим разобраться?

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 05.02.2020 (Ср) 15:16

Mikle писал(а):Text1.Enabled = False не устраивает серым цветом? Может быть попробовать с этим разобраться?

Да, но каким образом? Не имею ни малейшего представления.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как заблокировать текстовый объект на события

Сообщение bon818 » 05.02.2020 (Ср) 20:46

Vova_2581 писал(а):
Mikle писал(а):Text1.Enabled = False не устраивает серым цветом? Может быть попробовать с этим разобраться?

Да, но каким образом? Не имею ни малейшего представления.


Только перерисовка, а это опять сабклассинг.
Если использовать субклассинг, то нужно на все события возвратить 1(true), кроме отрисовки (необходимых) конечно .

Правильно, это PictureBox

Код: Выделить всё

Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
  If Msg = WM_PAINT Then ' У ТЕКСТБОКСА УБРАТЬ СТИЛЬ ГРАНИЦЫ - БОРДЮР
    WindowProc = CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam)
  End If
 
WindowProc = 1
Exit Function

End Function


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как заблокировать текстовый объект на события

Сообщение Хакер » 06.02.2020 (Чт) 0:13

Vova_2581 писал(а):Text превратить в обычный Label. Сам Label применить не могу по определенным причинам – долго объяснять, поэтому пришлось использовать Text, убрать все бордеры и белый фон превратить в цвет формы,

Не проще ли объяснить, всё-таки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 06.02.2020 (Чт) 10:13

bon818
Ваш вариант еще не пробовал, чуток позже попробую.
Сейчас хотел бы более-менее внятно ответить на вопрос Хакера
В общем, тут такая штука, как бы это объяснить на пальцах...
Пишу небольшую утилиту для банковских расчетов и она уже полностью (почти) готова и, как это обычно происходит, под самый конец приходит мысля улучшения. Как говориться: "хорошая мысля - приходит опосля!" :D
Решил добавить некую информационную ленту для наглядности и понимания, как вдруг столкнулся с неожиданной проблемой. Заключается она в том, что в своем проекте я использую компонент со вкладками, то есть --> Microsoft Forms 2.0 Object Library библиотеки FM20.DLL - в 7-ке ее нет, поэтому я ее присоединю в приложении...
Screen1.jpg
Screen1.jpg (36.95 Кб) Просмотров: 4560

По началу я взялся за Label, но ни тут то было. По каким-то непонятным и загадочным причинам, объект Forms 2.0 упорно помещает Label за собой, а не перед собой и любые попытки переместить его на фронт... не увенчались успехом, поэтому пришлось использовать Text, который помещался нормально на переднем плане, а не за формой! Вот... в картинках вся проблема...
Screen2.jpg
Screen2.jpg (55.96 Кб) Просмотров: 4560

И такой... вариант не проходит... Label упорно сидит на фоне и ни в какую на передний план не перемещается!
Screen3.jpg
Screen3.jpg (54.66 Кб) Просмотров: 4560

Поэтому возникла проблема и потому написал, что Label использовать не могу. А брать какой-то другой компонент и все переделывать уже поздно.
Помогите решить такой казус.
Вложения
FM20.rar
Microsoft Forms 2.0 Object Library
(442.48 Кб) Скачиваний: 204

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как заблокировать текстовый объект на события

Сообщение bon818 » 06.02.2020 (Чт) 12:39

Vova_2581 писал(а):bon818
По началу я взялся за Label, но ни тут то было. По каким-то непонятным и загадочным причинам, объект Forms 2.0 упорно помещает Label за собой, а не перед собой и любые попытки переместить его на фронт... не увенчались успехом, поэтому пришлось использовать Text, который помещался нормально на переднем плане, а не за формой! Вот... в картинках вся проблема...
Помогите решить такой казус.


Тут все еще проще, UserControl + Label и все, вот вам окно(регион), ну а готовых подобных псевдо-лейбов как собак. Берите и пользуйтесь, или свой сделайте 5мин.
Вложения
NewLabel.rar
Вот например какой то Label+
(2.77 Кб) Скачиваний: 213
Последний раз редактировалось bon818 06.02.2020 (Чт) 12:48, всего редактировалось 1 раз.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 06.02.2020 (Чт) 12:46

bon818
Ваш код с поправкой сабклассинга привел к тому, что Text вообще перестал на что либо реагировать. Тут, наверное, вы не поняли, дело в том, что текст в Text объекте меняется время от времени, он не статический!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 06.02.2020 (Чт) 12:49

bon818 писал(а):Тут все еще проще, UserControl + Label...

Если можно, какой-нибудь пример, иначе мне не очень понятно, что Вы имели ввиду?

P.S. Ага вижу... чуть позже гляну... спасибо!

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как заблокировать текстовый объект на события

Сообщение bon818 » 06.02.2020 (Чт) 12:53

Ну, вот например, первый попавшийся у меня на диске
.
NewLabel.rar
(2.77 Кб) Скачиваний: 204

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 06.02.2020 (Чт) 14:59

bon818
Ваш контрол работает!! Аллилуйя! :cheers:
Screen5.jpg
Screen5.jpg (60.76 Кб) Просмотров: 4546

Код: Выделить всё
Private Sub Command1_Click()
Form1.NewLabel1.Caption = "Проверка кода NewLabel"
End Sub

Screen6.jpg
Screen6.jpg (18.13 Кб) Просмотров: 4546

Большое Вам СПАСИБО!!! :)
P.S.
Так а почему стандартный Label не работал как надо, как Вы думаете, уважаемые профессионалы?? Просто странно почему так... :?:

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как заблокировать текстовый объект на события

Сообщение bon818 » 06.02.2020 (Чт) 16:27

Vova_2581 писал(а):bon818
P.S.
Так а почему стандартный Label не работал как надо, как Вы думаете, уважаемые профессионалы?? Просто странно почему так... :?:

Потому что, в МИ6) Label это не окно. vbLabel это удобный аналог ф-й winAPI TextOut, +...

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 06.02.2020 (Чт) 16:58

Теперь понятно. Еще раз СПАСИБО БОЛЬШОЕ Вы меня очень выручили. СПАСИБО! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как заблокировать текстовый объект на события

Сообщение Хакер » 06.02.2020 (Чт) 23:30

Не обязательно было делать UserControl, можно было Label положить в контрол типа Frame, у которого выставить BorderStyle=None.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 07.02.2020 (Пт) 8:59

Хакер писал(а):Не обязательно было делать UserControl, можно было Label положить в контрол типа Frame, у которого выставить BorderStyle=None.

Сегодня проверю...

P.S.
Блин... Где же Вы раньше были?? Все гениальное просто! Работает! :)
Screen7.jpg
Screen7.jpg (55.32 Кб) Просмотров: 4513

Как бы там ни было, спасибо всем, кто мне помог! Думаю, эту тему можно считать закрытой.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как заблокировать текстовый объект на события

Сообщение Don Leno » 10.04.2020 (Пт) 19:16

Не знаю может кому может понадобиться. Это Апи отключает обновление текстового поля. Не помню кто скидывал уже этот пример
Код: Выделить всё
     
Private Declare Function LockWindowUpdate Lib "user32" _
         (ByVal hwndLock As Long) As Long

LockWindowUpdate Text1.hWnd ' Блокирует обновление текстового поля
LockWindowUpdate 0&' Включает прорисовку


Прежде чем выводить текст нужно заблокировать. Изменить значение Text1.Text и потом снова включить и отключить обновление поля:
Код: Выделить всё
LockWindowUpdate Text1.hWnd'Отключаем обновление
Text1.Text = "My text" 'Вводим значение
LockWindowUpdate 0& 'Включаем обновление поля
DoEvents ' Ждем до завершения события, иначе не сработает
LockWindowUpdate Text1.hWnd 'Отключаем прорисовку)))

Vova_2581
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как заблокировать текстовый объект на события

Сообщение Vova_2581 » 11.04.2020 (Сб) 12:07

Один хрен... не знаю, как у вас, но у меня на win 7 такое впечатление, что текстовое поле блокируется как бы временно, а потом саморазблокируется само. Да и все равно контекст работает несмотря ни на что. Все верные решения уже приведены bon818 и Хакером и уже давно применены. Этого достаточно. Ваш код... ну разве чисто для эксперимента... :)


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 11

    TopList