координаты каретки

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

координаты каретки

Сообщение Shurrik » 28.09.2015 (Пн) 9:14

Для подсказки надо повесить окошко рядим с кареткой. Но как пулучить координаты каретки, а не мыши, причем нужны экранные координаты. Программа, где вводится текст, одна (например блокнот), а окошко вывешивает другая (моя). Все проблемы решил кроме этой. Наткнулся на API функцию MapWindowPoints, вроде то, что надо, но почти все ссылки на иероглифах.
Колесо: Хочешь жить? Умей вертеться.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14086
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: координаты каретки

Сообщение alibek » 28.09.2015 (Пн) 10:33

Если окошко выводить рядом с кареткой, то оно будет перекрывать часть поля ввода.
Не лучше ли (и не проще ли) выводить окошко рядом с полем ввода?
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.09.2015 (Пн) 12:10

Смотри тут - очень похоже на то, что ты спрашиваешь.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: координаты каретки

Сообщение Shurrik » 29.09.2015 (Вт) 3:03

Вопрос не в том, что окошко что-то перекроет, а в том, чтобы оно появлялось в том районе, куда смотрит в данный момент человек, а не в противоположном конце экрана.
На функцию GetCaretPos наталкивался, но она не дает координат на экране. Она дает номер строки и номер символа в строке, которые нельзя перевести в координаты экрана, потому что текст не обязательно пропорциональный, плюс вертикальный и горизонтальный бегунки. Хотя тема в посте моя. Жаль, что автору проблему не удалось решить в VB.NET.
Колесо: Хочешь жить? Умей вертеться.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: координаты каретки

Сообщение Shurrik » 29.09.2015 (Вт) 7:47

Почти нашел решение проблемы с помощью GetGuiThreadInfo. Выдает координаты каретки относительно окна ввода. Осталось перевести в координаты экрана.
Колесо: Хочешь жить? Умей вертеться.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: координаты каретки

Сообщение Shurrik » 29.09.2015 (Вт) 8:11

Для тех кому это интересно приыожу код.
Определение структур и API-функций.
Код: Выделить всё
    Structure GUITHREADINFO
        Public cbSize As Integer
        Public flags As Integer
        Public hwndactive As Integer
        Public hwndFocus As Integer
        Public hwndCapture As Integer
        Public hwndMenuOwner As Integer
        Public hwndMoveSize As Integer
        Public hwndcaret As Integer
        Public rcCaret As RECT
    End Structure

    Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure

    Public Declare Function GetGuiThreadInfo Lib "user32" Alias "GetGUIThreadInfo" (ByVal idThread As Integer, ByRef lpgui As GUITHREADINFO) As Integer

    Public Declare Function GetWindowRect Lib "User32" Alias "GetWindowRect" (ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Integer


код в программе
Код: Выделить всё
                ' получение структуры активного окна
                Dim gui As New GUITHREADINFO
                gui.cbSize = Marshal.SizeOf(gui)
                GetGuiThreadInfo(0, gui)
                MsgBox(gui.rcCaret.Left & "-" & gui.rcCaret.Top) ' получение координат в поле ввода
                Dim hk As IntPtr = gui.hwndcaret
                Dim r As New RECT
                GetWindowRect(hk, r)
                MsgBox(r.Left & "-" & r.Top) ' получение экранных координат самой каретки
Колесо: Хочешь жить? Умей вертеться.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.09.2015 (Вт) 12:14

Shurrik писал(а):Она дает номер строки и номер символа в строке, которые нельзя перевести в координаты экрана, потому что текст не обязательно пропорциональный, плюс вертикальный и горизонтальный бегунки.

Неправда.

Shurrik писал(а):На функцию GetCaretPos наталкивался, но она не дает координат на экране.

Ну я же как-то перевёл.

Shurrik писал(а):Жаль, что автору проблему не удалось решить в VB.NET.

Там же вообще в другом проблема.
Если окно поддерживает GetCaretPos, то меню отображается именно там где нужно.


Вернуться в Visual Basic .NET

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

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

    TopList