unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, RichEdit, jpeg;
type
// Add this as the first type in your unit to make the Canvas property public for TPanel...
TPanel = class(ExtCtrls.TPanel)
protected
FOnPaint : TNotifyEvent;
Procedure Paint; Override;
public
Property Canvas;
Property OnPaint : TNotifyEvent read FOnPaint write FOnPaint;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure RichEdit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Panel1Paint(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function PixelsToTwips(ADC : HDC; APoint : TPoint) : TPoint;
var ppiX, ppiY : Integer;
begin
ppiX := GetDeviceCaps(ADC, LOGPIXELSX);
ppiY := GetDeviceCaps(ADC, LOGPIXELSY);
if (ppiX <> 0) and (ppiY <> 0) then begin
Result.X := Round(1440 / ppiX * APoint.X);
Result.Y := Round(1440 / ppiY * APoint.Y);
end else
Result := Point(0, 0);
End;
Function RectToTwips(ADC : HDC; ARect : TRect) : TRect;
Begin
Result.TopLeft := PixelsToTwips(ADC, ARect.TopLeft);
Result.BottomRight := PixelsToTwips(ADC, ARect.BottomRight);
End;
Procedure PaintRichEditToCanvas(ARichEdit : TRichEdit; ACanvas : TCanvas; ARect : TRect);
var fmtRange: TFormatRange;
begin
FillChar(fmtRange, SizeOf(fmtRange), 0);
with fmtRange do begin
hDC := ACanvas.Handle;
hdcTarget := hDC;
rcPage := RectToTwips(hdc, ARect);
rc := RectToTwips(hdc, ARect);
chrg.cpMin := 0;
chrg.cpMax := ARichEdit.GetTextLen;
end;
ARichedit.Perform(EM_FORMATRANGE, 1, Longint(@fmtRange));
{ Free cached information }
ARichedit.Perform(EM_FORMATRANGE, 0, 0);
End;
{ TPanel }
procedure TPanel.Paint;
begin
inherited;
if Assigned(FOnPaint) then FOnPaint(Self);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.OnPaint := Panel1Paint;
end;
procedure TForm1.Panel1Paint(Sender: TObject);
var aText : TBitmap;
begin
// Paint the image
Panel1.Canvas.Draw(10, 10, Image1.Picture.Graphic);
// Paint the text...
aText := TBitmap.Create;
aText.Width := Panel1.Width;
aText.Height := Panel1.Height;
aText.PixelFormat := pf32bit;
aText.Canvas.Brush.Color := clWhite;
aText.Canvas.Pen.Color := clWhite;
aText.Canvas.Rectangle(0, 0, aText.Width, aText.Height);
aText.TransparentColor := clWhite;
aText.Transparent := True;
try
PaintRichEditToCanvas(RichEdit1, aText.Canvas, Rect(0, 0, aText.Width-1, aText.Height-1));
Panel1.Canvas.Draw(0, 0, aText);
finally
aText.Free;
end;
end;
procedure TForm1.RichEdit1Change(Sender: TObject);
begin
Panel1.Repaint;
end;
end.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
by: ThievingSixPosted on 2009-05-21 at 04:26:47ID: 24440066
This might be a very good or bad answer but what about ARichEdit.Height?