Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Как скрыть мигающий курсор в окне ввода ComboBox?

10.11.2016, 17:29. Показов 2772. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для TextBox всё работает:
VB.NET
1
2
3
4
5
6
<DllImport("user32")>
    Private Shared Function HideCaret(ByVal hWnd As IntPtr) As Integer
    End Function
   Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        HideCaret(TextBox1.Handle)
    End Sub
для ComboBox (стиль DropDown) куда бы мы не вставляли HideCaret(ComboBox1.Handle) каретка не исчезает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2016, 17:29
Ответы с готовыми решениями:

Скрыть мигающий курсор
Есть один-единственный edit на всю форму. Я добился того, чтобы фокус всегда был на нем, но нужно,...

Мигающий курсор в форме. Как избавиться?
В форме, несмотря на запрет редактирования, добавления/удаления по-прежнему мотыляется курсор... От...

Как попроще убить мигающий курсор в RichTextBox?
(тот, что показывает текущую позицию в тексте, а не курсор мыши). Если объявить Enabled = false, то...

Как убрать мигающий курсор из контрола Richtextbox?
Как сделать, чтобы мигающий курсор не появлялся в ричтекстбоксе после открытия формы, при клике по...

4
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
10.11.2016, 21:14 2
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Пришлось полазить по исходникам ComboBox
https://referencesource.micros... aee133dcd0

VB.NET
1
2
        Dim a As NativeWindow = GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing)
        HideCaret(a.Handle)
За вами осталось преобразовать. Не обязательно каждый раз выхватывать спрятанный объект в элементе и его указатель
3
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
11.11.2016, 05:54  [ТС] 3
Sklifosofsky, всё работает!
VB.NET
1
2
3
4
    Private Sub ComboBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click
        Dim a As NativeWindow = GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing)
        HideCaret(a.Handle)
    End Sub
но почему тоже самое не срабатывает здесь:
VB.NET
1
2
3
4
    Private Sub ComboBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Enter
        Dim a As NativeWindow = GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing)
        HideCaret(a.Handle)
    End Sub
я так понимаю, что мы работаем с объектом childEdit, являющимся составной частью ComboBox?
0
1047 / 898 / 211
Регистрация: 29.09.2015
Сообщений: 1,004
11.11.2016, 19:02 4
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
но почему тоже самое не срабатывает здесь:
Скорее всего это событие до этого момента срабатывает, когда начинает мигать курсор
Попробуйте скомбинировать несколько событий

VB.NET
1
2
3
4
   Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.TextChanged, ComboBox1.GotFocus, ComboBox1.Click
        Dim a As NativeWindow = TryCast(GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing), NativeWindow)
        HideCaret(a.Handle)
    End Sub
Опять же не стоит каждый раз выхватывать указатель. Например при инициализации компонентов получить указатель элемента и присвоить во внешнею переменную.


VB.NET
1
2
3
4
5
6
7
    Private _EComboPtr As IntPtr
    Private Sub ComboBox1_Validated(sender As Object, e As EventArgs) Handles ComboBox1.Validated
        _EComboPtr = TryCast(GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing), NativeWindow).Handle
    End Sub
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.TextChanged, ComboBox1.GotFocus, ComboBox1.Click
        HideCaret(_EComboPtr)
    End Sub
Добавлено через 1 минуту
Цитата Сообщение от jkrnd Посмотреть сообщение
я так понимаю, что мы работаем с объектом childEdit, являющимся составной частью ComboBox?
Да, он состоит из 3ех компонентов
2
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
12.11.2016, 17:12  [ТС] 5
Sklifosofsky, Ура!!! сработал код №2 (с выносом указателя на уровень формы).
понять бы ещё почему, не судьба видимо
попробовал не выносить:
VB.NET
1
2
3
4
Private Sub ComboBox1_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Validated
        Dim a As NativeWindow = GetType(ComboBox).InvokeMember("childEdit", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, Nothing, Me.ComboBox1, Nothing)
        HideCaret(a.Handle)
    End Sub
каретка не исчезает!
код №1 запустить не удалось (Ссылка на объект не указывает на экземпляр объекта. в строке HideCaret(a.Handle))
и ещё, разве у ComboBox есть событие GotFocus? почему его нет в списке событий в дизайнере?

Добавлено через 12 минут
Sklifosofsky, немного поисследовав, получил следующий работающий как надо код:
VB.NET
1
2
3
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.TextChanged, ComboBox1.GotFocus, ComboBox1.Click
        HideCaret(0) '(_EComboPtr)
    End Sub
Добавлено через 8 минут
Sklifosofsky, а для TextBox срабатывает следующее:
VB.NET
1
2
3
Private Sub TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus
        HideCaret(0)
    End Sub

Не по теме:

извиняюсь за свою назойливость

0
12.11.2016, 17:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2016, 17:12
Помогаю со студенческими работами здесь

<input type='text'> Как выровнять по правому краю мигающий курсор при вводе?
&lt;input type='text'&gt; Как выровнять по правому краю мигающий курсор при вводе?

мигающий курсор
В CODEBLOCS в окне набора текста программы появился мигающий курсор &quot;_&quot;, а раньше был курсор &quot;|&quot;. ...

Убрать мигающий курсор
Нужно убрать мигающий курсор. goto не подойдет. Мб Ассемблер? Спасибо!

Черный экран и мигающий курсор
Здравствуйте. Надеюсь на ответ как можно скорее. Переустановил на компьютере Windows XP SP3....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru