Координаты курсора в Memo
От: DemAS http://demas.me
Дата: 28.11.02 12:42
Оценка:
Добрый день.

Подскажите пожалуйста, как получить координаты курсора в Memo.

CaretPos — возвращает координаты в терминах символов, а мне надо в
пикселях.

Есть вариант, что делать надо как то так:

SendMessage (Memo1->Handle, EM_POSFROMCHAR, x, 0)

Но не совсем ясно, что использовать в качестве третьего параметра (x).

Заранее благодарен.
Re: Координаты курсора в Memo
От: Vladik Россия  
Дата: 28.11.02 13:11
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS> Подскажите пожалуйста, как получить координаты курсора в Memo.


Так же как и в любом другом окне. Получаешь сначала экранные координаты — GetCursorPos (или Mouse.CursorPos), затем корректируешь их относительно Memo — ScreenToClient.
Как все запущенно...
Re[2]: Координаты курсора в Memo
От: DemAS http://demas.me
Дата: 28.11.02 13:19
Оценка:
Здравствуйте, Vladik, Вы писали:


V>Так же как и в любом другом окне. Получаешь сначала экранные координаты — GetCursorPos (или Mouse.CursorPos), затем корректируешь их относительно Memo — ScreenToClient.


Ошибся. Не курсора(мыши), а каретки — того прямоугольничка, который в контроле мигает.
Re: Координаты курсора в Memo
От: Hacker_Delphi Россия  
Дата: 28.11.02 13:25
Оценка: 3 (1)
Здравствуйте, DemAS, Вы писали:

надо дальше по строчкам считать сумму TextHeight, потом вычитать VScrollPos
считать длинну начала строки(TextWidth) и вычитать VScrollPos. вот тебе и координаты
кстати, GetCaretPos должно вернуть координаты курсора в пикселах... не помню щаз навскидку...
... << RSDN@Home 1.0 alpha 13 РУЛИТ!!! >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Координаты курсора в Memo
От: Vladik Россия  
Дата: 28.11.02 13:27
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS> Ошибся. Не курсора(мыши), а каретки — того прямоугольничка, который в контроле мигает.


Сюрприз, сюрприз!

Memo->CaretPos;
Как все запущенно...
Re[4]: Координаты курсора в Memo
От: Hacker_Delphi Россия  
Дата: 28.11.02 13:45
Оценка:
Здравствуйте, Vladik, Вы писали:

V>Здравствуйте, DemAS, Вы писали:


DAS>> Ошибся. Не курсора(мыши), а каретки — того прямоугольничка, который в контроле мигает.


V>Сюрприз, сюрприз!


V> Memo->CaretPos;

ВНИМАТЕЛЬНО прочитай самый первый пост — там все написано про Memo->CaretPos
... << RSDN@Home 1.0 alpha 13 РУЛИТ!!! >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Координаты курсора в Memo
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 28.11.02 14:00
Оценка:
Здравствуйте, DemAS, Вы писали:

[]

DAS> SendMessage (Memo1->Handle, EM_POSFROMCHAR, x, 0)

DAS>
DAS> Но не совсем ясно, что использовать в качестве третьего параметра (x).
DAS>
DAS> Заранее благодарен.

А ты просто не пробовал, когда Memo1 имеет фокус ввода, вызвать

TPoint pt;
GetCaretPos(&pt);


И будет тебе в пикселах
Re[5]: Координаты курсора в Memo
От: Vladik Россия  
Дата: 28.11.02 14:00
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

HD>ВНИМАТЕЛЬНО прочитай самый первый пост — там все написано про Memo->CaretPos


Тогда поэкспериментировать с функциями DPtoLP/LPtoDP.
Как все запущенно...
Re[2]: Координаты курсора в Memo
От: DemAS http://demas.me
Дата: 28.11.02 14:01
Оценка:
Да, действительно — GetCaretPos — то что надо.
Re[6]: Координаты курсора в Memo
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 28.11.02 14:03
Оценка:
Здравствуйте, Vladik, Вы писали:

V>Здравствуйте, Hacker_Delphi, Вы писали:


HD>>ВНИМАТЕЛЬНО прочитай самый первый пост — там все написано про Memo->CaretPos


V>Тогда поэкспериментировать с функциями DPtoLP/LPtoDP.


Блин, ну зачем экспериментировать, если все украдено до нас?

The GetCaretPos function copies the caret's position, in client coordinates, to the specified POINT structure.

BOOL GetCaretPos(

LPPOINT lpPoint // address of structure to receive coordinates
);


Все... Если окно (в нашем случае экземпляр TMemo) имеет фокус ввода — вызываешь эту функцию и наслаждаешься позицией каретки в клиентских координатах...
Re[7]: Координаты курсора в Memo
От: Vladik Россия  
Дата: 28.11.02 14:11
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Блин, ну зачем экспериментировать, если все украдено до нас?


Я думал, что CaretPos как раз и превращается в вызов апишной GetCaresPos. Но, видимо, эти чудики (борланд) опять сделали по-своему (зачем?).
Как все запущенно...
Re[8]: Координаты курсора в Memo
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 28.11.02 14:19
Оценка:
Здравствуйте, Vladik, Вы писали:

[]

V>Я думал, что CaretPos как раз и превращается в вызов апишной GetCaresPos. Но, видимо, эти чудики (борланд) опять сделали по-своему (зачем?).


Да, все не так просто

function TCustomMemo.GetCaretPos: TPoint;
begin
  Result.X := LongRec(SendMessage(Handle, EM_GETSEL, 0, 0)).Hi;
  Result.Y := SendMessage(Handle, EM_LINEFROMCHAR, Result.X, 0);
  Result.X := Result.X - SendMessage(Handle, EM_LINEINDEX, -1, 0);
end;


А вот зачем именно так сделали, неясно... Поэтому и может вводить в заблуждение похожестью названий (API GetCaretPos и TCustomMemo-property CaretPos)...
Re[9]: Координаты курсора в Memo
От: Hacker_Delphi Россия  
Дата: 28.11.02 14:24
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Здравствуйте, Vladik, Вы писали:


F>[]



F>А вот зачем именно так сделали, неясно... Поэтому и может вводить в заблуждение похожестью названий (API GetCaretPos и TCustomMemo-property CaretPos)...


Да нет — все ясно... данное свойство введено для удобства определения координат курсора в символах, а работа в пикселах для простого юзера и не нужна, ибо свойства Canvas у Memo нету
... << RSDN@Home 1.0 alpha 13 РУЛИТ!!! >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Координаты курсора в Memo
От: Hacker_Delphi Россия  
Дата: 28.11.02 14:24
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Да, действительно — GetCaretPos — то что надо.

кстати, не уверен, что оно правильно учитывает положение SCrollBar'ов — почитай Help или поэксперементируй сам
... << RSDN@Home 1.0 alpha 13 РУЛИТ!!! >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.