Карта сайтаСсылкиКонтакты

Рисуем управление RichEdit в точечном рисунке для просмотра

PDF Печать
Статьи

Управление RichEdit (мы ведем разговор о стандартном управлении Windows, а не о компоненте Delphi) содержит встроенные особенности печати, которые могут использоваться, чтобы послать форматированный текст на принтер или рисовать его на любом холсте с минимальными усилиями для программиста.

Конечно, в стандартный компонент Delphi инкапсулированы эти возможности. Мы можем использовать это, чтобы сделать предварительный просмотр печати с масштабированием или рисованием RichEdit на любом управлении. Рисование из управления RichEdit на любой холст использует стандартное сообщение EM_FORMATRANGE управления RichEdit. Параметр LParam для этого сообщения – указатель на запись TFormatRange. Эта запись должна быть заполнена перед посылкой сообщения RichEdit.

Запись TFormatRange содержит информацию, которую RichEdit управление использует для форматирования вывода для определенного устройства, где:

  • hDC – устройство для передачи
  • hDCTarget – устройство, для которого производится форматирование
  • rc – область передачи. Единицы измерения – twips. Twips – независимая от экран единица, чтобы гарантировать, что пропорция элементов экрана одинаковая на всех системах отображения. Twip определен как 1/1440 дюйма
  • pcPage – полная область, предоставленная устройством. Единицы измерения – twips
  • chrg – запись TCharRange, которая определяет диапазон текста для форматирования

Эта запись обычно используется с сообщениями EM_EXGETSEL и EM_EXSETSEL и включает два поля: cpMin и cpMax

  • cpMin – индекс позиции символа, предшествующий первому символу в диапазоне
  • cpMax – положение символа сразу после последнего символа в диапазоне.

function PrintRTFToBitmap(ARichEdit : TRichEdit; 
    ABitmap : TBitmap) : Longint;
var
  range : TFormatRange;
begin
  FillChar(Range, SizeOf(TFormatRange), 0);
  // При предоставлении к тому же DC мы измеряем.
  Range.hdc := ABitmap.Canvas.handle;
  Range.hdcTarget := ABitmap.Canvas.Handle;

  // Set up the page.
  Range.rc.left := 0;
  Range.rc.top := 0;
  Range.rc.right := ABitmap.Width * 1440 div Screen.PixelsPerInch;
  Range.rc.Bottom := ABitmap.Height * 1440 div Screen.PixelsPerInch;

  // По умолчанию диапазон текста для печати – весь документ
  Range.chrg.cpMax := -1;
  Range.chrg.cpMin := 0;

  // форматируем текст
  Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, 
      Longint(@Range));

  // очищаем информацию в кэше
  SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
end;

Следующий пример показывает, как рисовать RichEdit на любом холсте, а также и рисовать только выбранный диапазон текста.


function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
      ARichEdit : TRichEdit; AWidth, AHeight : integer) : Longint;
var
  Range : TFormatRange;
begin
  FillChar(Range, SizeOf(TFormatRange), 0);
  Range.hdc := ACanvas.handle;
  Range.hdcTarget := ACanvas.Handle;
  Range.rc.left := 0;
  Range.rc.top := 0;
  Range.rc.right := AWidth * 1440 div Screen.PixelsPerInch;
  Range.rc.Bottom := AHeight * 1440 div Screen.PixelsPerInch;
  Range.chrg.cpMax := ToChar;
  Range.chrg.cpMin := FromChar;
  Result := SendMessage(ARichedit.Handle, E
      M_FORMATRANGE, 1, Longint(@Range));
  SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
end;

Но как рисовать RichEdit с фоновым изображением?

Это безнадежно со стандартным управлением TRichedit, потому что он основан на Windows управлении и не имеет никакого дескриптора, чтобы обращаться с фоновым изображением или прозрачностью.

В этом случае мы можем использовать два различных точечных рисунка для фона и RichEdit и после этого их объединить.


procedure TForm1.Button2Click(Sender: TObject);
var Bmp : TBitmap;
begin
  Bmp := TBitmap.Create;
  bmp.Width := 300;
  bmp.Height := 300;
  PrintToCanvas(bmp.Canvas,2,5,RichEdit1,300,300);
  BitBlt(Image1.Picture.Bitmap.Canvas.Handle, 0, 0, 
      Bmp.Width, Bmp.Height,
  bmp.Canvas.Handle, 0, 0, srcAND);
  Image1.Repaint;
  bmp.Free;
end;

Эта программа разработана Serge Perevoznyk, спасибо, Сергею


 

Добавить комментарий


Защитный код
Обновить