Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ширина символа в пикселах в RichEdit 
:(
    Опции темы
Гость_Cherry
Дата 26.11.2004, 13:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как определить ширину символа или строки в пикселах в Richedit?
  Вверх
<Spawn>
Дата 26.11.2004, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Воспользуйся GetTextExtentPoint32


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Guest
Дата 26.11.2004, 16:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как пользоваться GetTextExtentPoint32?
  Вверх
AntonSaburov
Дата 26.11.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Вот описание

Код

BOOL GetTextExtentPoint32(
   HDC hdc, // handle of device context
   LPCTSTR lpString, // address of text string
   int cbString, // number of characters in string
   LPSIZE lpSize  // address of structure for string size  
);


Использовать где-то так

Код

uses Types;

....
var
 size: tagSIZE;
begin
 GetTextExtentPoint32(self.Handle, 'S', 1, size); // Handle - надо какой-то


PM MAIL WWW ICQ   Вверх
Girder
Дата 27.11.2004, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Pr_HWND - дескриптор любого окна для которого надо вычислить ширину текста(т.е. сколько пикселей займет ентот текст при отображении его в ентом окне smile ).
S - текст
Код
function GetStr_Width(Pr_HWND:HWND; const s:string):integer;
var HWND_DC:HDC;
   hFontNew,hFontOld:HFONT;
   TM:TTextMetric;
   Size:TSize;
begin
Result:=0;
HWND_DC:=GetDC(Pr_HWND);
if HWND_DC<>0 then
 begin
  hFontNew:=SendMessage(Pr_HWND,WM_GETFONT,0,0);
  hFontOld:=SelectObject(HWND_DC,hFontNew);
  GetTextMetrics(HWND_DC,TM);
  GetTextExtentPoint32(HWND_DC,PChar(s),Length(s),Size);
  Result:=Size.cx+TM.tmAveCharWidth;
  SelectObject(HWND_DC,hFontOld);
  ReleaseDC(Pr_HWND,HWND_DC);
 end;
end;


Использование i:=GetStr_Width(RichEdit1.Handle,'wer');

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Guest
Дата 28.11.2004, 12:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Использую

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
SpeedButton1.Caption:=IntToStr(GetStr_Width(RichEdit1.Handle,'w'));

end;

Функция выдает значение 17.
При изменении параметров шрифта, значение не меняется.

Что не так?
  Вверх
Girder
Дата 29.11.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата(Guest @ 28.11.2004, 12:58)
Что не так?
RichEdit возвращает на WM_GetFont - что он использует системный шрифт... smile

Т.ч. можно написать так:
Код
function GetStr_Width(Pr_HWND:HWND; Font:HFont; const s:string):integer;
var HWND_DC:HDC;
   hFontNew,hFontOld:HFONT;
   TM:TTextMetric;
   Size:TSize;
begin
Result:=0;
HWND_DC:=GetDC(Pr_HWND);
if HWND_DC<>0 then
 begin
  hFontNew:=SendMessage(Pr_HWND,WM_GETFONT,0,0);
  if hFontNew=0 then
   if Font=0 then hFontNew:=GetStockObject(SYSTEM_FONT) else hFontNew:=Font;
  hFontOld:=SelectObject(HWND_DC,hFontNew);
  GetTextMetrics(HWND_DC,TM);
  GetTextExtentPoint32(HWND_DC,PChar(s),Length(s),Size);
  Result:=LoWord(Size.cx+TM.tmAveCharWidth);
  SelectObject(HWND_DC,hFontOld);
  ReleaseDC(Pr_HWND,HWND_DC);
 end;
end;
Где Font - енто шрифт которым отображен(или будет отображен) какой нить текст в RichEdit smile

Пример использования: Caption:=IntToStr(GetStr_Width(RichEdit1.Handle,RichEdit1.Font.Handle,'W'));

Удачи.

Это сообщение отредактировал(а) Girder - 29.11.2004, 15:53


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
CHERRY
Дата 29.11.2004, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Для шрифта Courier New, Font.Size:=10, Font.Pitch:=fpFixed
для символа 'Z' функция возвращает значение 16.

В то же время для тех же параметров шрифта
PaintBox1.Canvas.TextWidth('Z') возвращает значение 8.
Кто врет?
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Girder
Дата 29.11.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



В принципе ни кто... smile зависит от того для чего тебе ента ширина... smile

TextWidth делает енто без учета средней ширины символа... smile, т.е. TM.tmAveCharWidth. Что б лудше была понятна разница присвой RichEdit1.ClientWidth твои значения, при этом в RichEdit занеси свой символ.

PS: Ты можеш заменить Result:=LoWord(Size.cx+TM.tmAveCharWidth) на Result:=Size.cx и сравнить получившиеся значения c TextWidth.

Это сообщение отредактировал(а) Girder - 29.11.2004, 19:29


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
CHERRY
Дата 29.11.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Result:=Size.cx дает такой же результат, что и TextWidth.
Может я пошел не верным путем. Я хочу нарисовать у RichEdit правую
границу, по которой текст будет переноситься. Положение границы (например это Panel с шириной 1-2 пиксела) я знаю в пикселах. Поэтому зная сколько пикселов в RichEdit занимает символ, я смогу переходить от пикселов к символам и наоборот.
Или это сильно горбато? smile
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.