Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Физические координаты курсора


Автор: Delphist 13.3.2006, 11:11
На форме расположен компонент TMemo, у memo есть свойство Memo.Caret.X и Memo.Caret.Y где возвращаются координаты каретки - позиция в строке и номер строки. Как узнать физические координаты(в пикселях) каретки.

Автор: Yanis 13.3.2006, 11:14
Умничка. Только вопрос забыл задать.

Автор: Romikgy 13.3.2006, 11:26
Рискну предположить что GetCursorPos

Автор: Yanis 13.3.2006, 11:30
Меня терзают смутные сомнения, но похоже разговор идёт не о курсоре, а о каретке. Киньте в меня камень, если я не прав. Но всё равно непонятно, что хотел сказать своим первым постом автор.

Автор: Alexeis 13.3.2006, 11:43
Цитата

Но всё равно непонятно, что хотел сказать своим первым постом автор

Цитата

Физические координаты курсора

Автор: Yanis 13.3.2006, 11:47
Цитата(alexeis1 @ 13.3.2006, 11:43 Найти цитируемый пост)
Физические координаты курсора

Всё равно непонятно. Подразумеваю, что речь про каретку, а "вопрос" о курсоре. smile

Автор: Alexeis 13.3.2006, 12:17
Справка говорит так надо отправить memo либо richEditu сообщение EM_POSFROMCHAR

Автор: Delphist 13.3.2006, 14:49
Цитата(Yanis @ 13.3.2006, 11:14)
Умничка. Только вопрос забыл задать.

Как получить физические координаты(в пикселах) курсора каретки.

Автор: Yanis 13.3.2006, 15:18
Цитата(Delphist @ 13.3.2006, 14:49 Найти цитируемый пост)
Как получить физические координаты(в пикселах) курсора каретки.

Цитата(Delphi Help)

CaretPos defines a pixel location onscreen, with the origin in the top left corner of the memo

Либо я плохо знаю английский, либо (к сожалению) ребята из Borland ошиблись smile

Автор: Alexeis 13.3.2006, 15:20
Подключайтесь уже кто-нибудь
Я тестил сообщение EM_POSFROMCHAR
Но у меня плохой результат (большие числа)
Может что-то не так написал??
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  X, Y: LongInt;
  p : ^TPoint;
begin
  p := nil;
  integer(p) := SendMessage(Memo1.Handle, EM_POSFROMCHAR, 60, 0);
  showmessage(inttostr(p^.x) + ' ' + inttostr(p^.y));
end;

Добавлено @ 15:21
Yanis, ребята из Borland ошиблись smile

Автор: Yanis 13.3.2006, 16:03
Цитата(Delphist @ 13.3.2006, 14:49 Найти цитируемый пост)
Как получить физические координаты(в пикселах) курсора каретки.

Например тебе нужно узнать положение X твоей каретки в Memo с таким текстом: "Font a|nd Text Functions". Значит тебе нужно подсчитать ширину текста "Font a" и прибавить к TMemo.Left. Примерно таким же образом получается и значение координаты Y. Всё, что тебе нужно можно узнать при помощи функции GetTextExtentPoint32. Если при использовании этой функции возникают проблемы, то попробуй такой варинт:
Код

var
  C: TCanvas;
begin
  C := TCanvas.Create;
  C.Handle := GetWindowDC(Memo1.Handle);
  { при помощи стандартного метода TextExtent() получаешь значения  интересующих тебя свойств и высчитываешь координаты }
  C.Free;

Автор: maxim1000 13.3.2006, 16:29
Цитата(alexeis1 @ 13.3.2006, 14:20 Найти цитируемый пост)
integer(p) := SendMessage(Memo1.Handle, EM_POSFROMCHAR, 60, 0);
  showmessage(inttostr(p^.x) + ' ' + inttostr(p^.y));

SendMessage при EM_POSFROMCHAR возвращает целое 32-битное число, в младшем и старшем словах которого закодированы координаты
в это коде эта комбинация присваивается указателю, а потом производится попытка взять по получившемуся адресу информацию...

как по мне, лучшетак:
Код

var
  buf:integer;
  x,y:integer;
begin
  buf:=SendMessage(Memo1.Handle,EM_POSFROMCHAR,60,0);
  x:=buf mod 65536;
  y:=buf div 65536;//не помню, как в Delphi выделение слов :)
  ...
end;

Автор: Delphist 14.3.2006, 13:35
Гораздо проще GetCaretPos.

Автор: Yanis 14.3.2006, 13:58
Цитата(Delphist @ 14.3.2006, 13:35 Найти цитируемый пост)
Гораздо проще GetCaretPos.

Проще для чего? Она не удовлетворяет твоим условиям.

Автор: Святогор 2.10.2007, 07:41
Пардон, но я так и не понял. Неужелине сущесвтует конкретного метода, который бы определил экранные координаты курсора(не мыши) в окне TMemo ? 

Автор: stab 2.10.2007, 07:48
Святогор, GetCaretPos и если требуется потом ClientToScreen.

Автор: Святогор 2.10.2007, 08:12
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)