Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 29.01.2009, 14:41   #1
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию координаты символов в Edit

вабщем не пойму как работает си-ма метрици каретки. тоесть я нахожу координаты каретки в пикселях(GetCaretPos), потом делю размеры окна на ширину и длину симвала. здесь все хорошо работает и я нахожу какой симвал возле каретки. А вот проблемы начинаються когда происходит скрол текста. Ведь координаты каретки теже, а вот текст уже не тот. Как мне испровить? Как находить символ возле каретки учитывая скрол текста?

Последний раз редактировалось user_jasser; 29.01.2009 в 15:29.
user_jasser вне форума   Ответить с цитированием
Старый 29.01.2009, 19:46   #2
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
Репутация: 75
По умолчанию

Я таким не занимался, но я предположу что эдиту приходит WM_PAINT при скроле.
Д'якон вне форума   Ответить с цитированием
Старый 29.01.2009, 20:36   #3
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию

вобщем немного разобрался. GetScrollPos и иму подобные должны мне помоч хз. тулько вот нарыл немного инфы. если есть у кого нить пример залейте плис...
user_jasser вне форума   Ответить с цитированием
Старый 30.01.2009, 20:18   #4
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию

с координатами разобрался. появилась еще одна проблема:
я нахожу ширину и высоту символов так:

Код:
procedure TScrewDriver.CharMetrics(Hnd: hWND);
var
 DC: HDC;
 TM: TEXTMETRIC;
begin
  DC:= GetDC(HND);
 
  //fillchar(TM, sizeof(TM), 0);
  GetTextMetrics(DC, @TM);
  
  DebugMessage(':CharX: ' + IntToStr(TM.tmAveCharWidth));
  DebugMessage(':CharY: ' + IntToStr(TM.tmHeight));

  FCharWidth:= TM.tmAveCharWidth;
  FCharHeight:= TM.tmHeight;
  ReleaseDC(HND, DC);
end;
все вроде правельно находит высоту 16 и ширину 8. но вот когда я меняю шрифт на другой. все равно эта ф-ия возвращает теже параметры, а они должны быть явно другие... Что я не так делаю?
user_jasser вне форума   Ответить с цитированием
Старый 31.01.2009, 20:14   #5
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию

Блин, так и не разобрался... подозреваю, что не находиться нужный HDC, хотя окно сто-пудово то в котором текст. класс окна Scintilla можеть из за этого баг?
Еще я могу находить имя стиля и размер фонта. можеть это както поможет определить ширину и длину символа? Подмогните! *отчаянье*

Последний раз редактировалось user_jasser; 31.01.2009 в 20:49.
user_jasser вне форума   Ответить с цитированием
Старый 01.02.2009, 18:32   #6
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию

еще вопросик:

такая вот формула размера шрифта

Код:
TLogFont.lfHeight:= - Round(10 * GetDeviceCaps(DC, LOGPIXELSY) / 72);
TLogFont.lfWidth:= 0;
будет аналогично Size в VCL?

Код:
TFont.Size:= 10;
user_jasser вне форума   Ответить с цитированием
Старый 02.02.2009, 22:03   #7
user_jasser
я не ~
Форумчанин
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Репутация: 33

icq: 429167315
По умолчанию

все получилось, но оказалось это все равно не выход, ведь шрифты бывают с не фиксированной шириной символов. Вобщем оказалось что я не в том направлении копал.

Вот кажись простой и стабильный вариант:

Код:
function GetCaretPosXY(Handle: hWnd): 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;
user_jasser вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена групп символов данными из edit в memo treefantom Общие вопросы Delphi 5 26.10.2008 18:26
Ограничение по вводу символов в Edit-e Alexij Общие вопросы Delphi 1 26.06.2008 16:27
Координаты ОУ? Fainder Общие вопросы Delphi 9 15.10.2007 20:59
координаты Aram Общие вопросы C/C++ 5 08.06.2007 20:03
Image1.canvas.textout. Координаты символов Alar Компоненты Delphi 0 29.10.2006 23:04


23:27.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.