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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пишу предпросмотра, Нужна помощь имеющих опыт в этом деле 
:(
    Опции темы
кварк
Дата 16.11.2004, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно вывести текст на принтер. И чтобы предпросмотр был. Со скроллингом и зумом. Основная проблема - масштабирование текста. Хотелось бы "как в ворде". Но не особо получается, потому что font.size имеет тип integer и довольно резко скачет при изменении зума.

Единственным выходом вижу создание чего-нибудь а-ля Bitmap с размером в страницу принтера, рисование на нем, предпросмотр через StretchDraw и вывод на принтер через тот же StretchDraw. Так как опыта у меня в этом деле нет, то вопрос: может, есть алгоритм лучше?

Я хочу разобраться в этом вопросе, поэтому особо нужны теоретические размышления.

P.S. нарыл мнение, что для "буфера" надо использовать TMetafile. Но как на нем рисовать - не ясно. и в D6 примера не нашел.


[Допишу, пожалуй]
Пытаюсь применить Metafile в качестве буфера.
Код

var
 mf : TMetafile;
 mfc: TMetafileCanvas;
begin
 mf := TMetafile.Create;
 mf.Height := 500;
 mf. Width := 500;
 mfc := TMetafileCanvas.Create(mf, 0);
 mfc.Ellipse(mfc.ClipRect);

 // ???

 mfc.Free;
 mf.Free;
end;


Вместо вопросов надо вставить код, отрисовывающий содержимое метафайла на канве (ну, например, Form1). Никак не могу этого сделать.

Это сообщение отредактировал(а) кварк - 16.11.2004, 12:56
PM MAIL   Вверх
Kesh
Дата 16.11.2004, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 1
Всего: 54



А почему не на Bitmap рисовать?


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
p0s0l
Дата 16.11.2004, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



TMetaFileCanvas передаёт рисунок метафайлу при разрушении.
Поэтому, прежде чем выводить метафайл, надо уничтожить метаканвас...
Код
var
 mfc: TMetafileCanvas;
begin
 mf := TMetafile.Create;
 mf.Height := 500;
 mf. Width := 500;
 mfc := TMetafileCanvas.Create(mf, 0);
 mfc.Ellipse(mfc.ClipRect);

 mfc.Free;

 Image1.Canvas.Draw (0, 0, mf);

 mf.Free;
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
кварк
Дата 17.11.2004, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
А почему не на Bitmap рисовать?

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

Цитата
TMetaFileCanvas передаёт рисунок метафайлу при разрушении.
Поэтому, прежде чем выводить метафайл, надо уничтожить метаканвас...


Да. Я нашел пример. Но вот незадача: код
Код

// b2 - TButton
// img - TImage на форме, куда я вывожу изображение
// mf - TMetafile

procedure TForm1.b2Click(Sender: TObject);
begin
 b2.Enabled := false;
 try
   mf := TMetafile.Create;
   mf.Width  := Printer.PageWidth;
   mf.Height := Printer.PageHeight;

   with TMetafileCanvas.Create(mf, 0) do
   try
      Ellipse(ClipRect);
   finally
     Free;
   end;

   Canvas.Rectangle(img.BoundsRect);  // (*1)
   Canvas.StretchDraw(img.BoundsRect, mf);  //(*2)
 finally
   mf.Free;
   b2.Enabled := true;
 end;
end;

выводит прямоугольник (*1) четко по краям img, а вот эллипс (*2) получается какой-то маленький в левом верхнем углу. Я ожидал, что эллипс будет точно вписан в прямоугольник. Что не так?


PM MAIL   Вверх
p0s0l
Дата 17.11.2004, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Дело в том, что в TMetafileCanvas.Create во втором параметре указывается контекст устройства, на котором предполагается выводить картинку...
Ты указываешь 0 - это значит текущий экран, например, разрешением 1024x768...
А в mf.Width и mf.Height указываешь разрешение канваса принтера...
Например, будет 2500x2000 к примеру...
Поэтому Ellipse (Cliprect) рисуется не на всём метафайле, а только на левой-верхней четверти...

Блин, принтера нет, чтобы проверить... Но предполагаю, что заменив второй параметр в создании метаканваса (0) на Printer.Canvas.Handle проблема уйдёт:
Код
with TMetafileCanvas.Create(mf, Printer.Canvas.Handle) do



--------------------
С уважением, г-н Посол.
PM   Вверх
кварк
Дата 26.1.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подниму свою старую тему... Продолжаю дописывать компонент. Столкнулся с проблемой масштабирования текста. Как бы так сделать, чтобы текст (или отдельный символ - неважно) точно вписывался в заданный прямоугольник (как, например, это сделано в редакторе Macromedia Flash)? Просто если менять Font.Size, то получается топорно.

Может, в WinApi есть функции для этого?

Пока реализовал то, что первым пришло на ум, но это медленно работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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