Рисуем управление RichEdit в точечном рисунке для просмотра
Конечно, в стандартный компонент 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, спасибо Сергею.
Комментарии