Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2009, 14:58   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
Вопрос Размеры текста, после изменения координат? (TmetafileCanvas)

как работают методы определения размеров текста, когда у канвы меняем систему координат?

Кладу на форму кнопку, пишу:

Код:
procedure TMainForm.Button1Click(nil);
var
  AMetafile : TMetafile;
  ACanvas : TMetafileCanvas;
  Text: string;
  Size: TSize;
begin
  AMetafile := TMetafile.Create;
  ACanvas := TMetafileCanvas.Create(AMetafile, 0);

  Text := 'Hello';
  ACanvas.Font.Size := 20;
  ACanvas.Font.Name := 'Arial';

  GetTextExtentPoint32(ACanvas.Handle, PChar(Text), Length(Text), Size);
  ShowMessage(IntToStr(Size.cx)+','+IntToStr(Size.cy)); // результат: 61,32

  SetMapMode(ACanvas.Handle, MM_ANISOTROPIC);
  SetWindowExtEx(ACanvas.Handle, 100, 100, nil);
  SetViewPortExtEx(ACanvas.Handle, 10, 10, nil);

  GetTextExtentPoint32(ACanvas.Handle, PChar(Text), Length(Text), Size);
  ShowMessage(IntToStr(Size.cx)+','+IntToStr(Size.cy));  // результат: 80,30
end;
Размеры области вывода уменьшили (или увеличили?) в десять раз, размеры выводимого в ней текста изменились, на 30 и 5 %, в ширину и высоту, соответсвенно.

Подскажите, кто знает, почему это может происходить? Ну, я бы понял, если бы они в 10 раз изменились...

ps требуется написать функцию, которая рассчитает ширину выводимого текста, написанного определённым шрифтом, с определёнными размерами, вне зависимости от канвы и её системы координат, на которую он будет выводиться. Первоначально проблема была сформулирована немного не так, и здесь.

Похоже, это невозможно?

Последний раз редактировалось AnTe; 23.06.2009 в 15:00.
AnTe вне форума Ответить с цитированием
Старый 24.06.2009, 08:41   #2
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Пожалуй, вопрос закрыт.

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

По всей видимости, венда дважды округляет размеры шрифта (ведь они хранятся в int!), при переводе его, в физических, а затем логических координатах. Ну или что-то подобное. И никакими ухищрениями, (с увеличением размера логической области, например) приемлемой точности не добиться.

Похоже, это результат нехилой ошибки, допущенной в GDI

Последний раз редактировалось AnTe; 24.06.2009 в 08:43.
AnTe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перерисовать кнопку Пуск после изменения надписи Sazary Win Api 2 08.06.2009 17:45
Запретить изменения Книги после истечения месячного срока komar73 Microsoft Office Excel 0 31.03.2009 11:01
Размеры изображения RamireZ Мультимедиа в Delphi 5 05.10.2008 09:48
Каретка после текста Shouldercannon Общие вопросы Delphi 3 20.07.2008 10:37
Как обновить GridView после изменения SELECT в SqlDataSource? posdnyaa БД в Delphi 2 21.04.2008 11:55