end;procedure TForm1.FormCreate(Sender: TObject); begin RE_SetLineSpacing(RichEdit1,LineSpacing,0); TotalLine:= trunc(RichEdit1.Height/(Richedit1.SelAttributes.Height+2*LineSpacing)); //计算当前能够显示的总行数 end;procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); begin UpdateCursorPos; if CurLine>TotalLine then begin Key:=#0; showmessage('out of bound!'); end; end;
如果RichEdit里还有图片等,会稍麻烦些,但绝对可以实现。
只给个思路,希望楼主自己研究。暂无兴趣直接帮楼主写代码。
uses RichEdit;
{$R *.dfm}function PrintRTFToBitmap(ARichEdit: TRichEdit; ABitmap: TBitmap): Longint;
var
range: TFormatRange;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
Range.hdc := ABitmap.Canvas.handle;
Range.hdcTarget := ABitmap.Canvas.Handle;
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;procedure TForm9.Button1Click(Sender: TObject);
var
FBitmap: TBitmap;
begin
FBitmap := TBitmap.Create;
try
FBitmap.Width := RichEdit1.Width;
FBitmap.Height := RichEdit1.Height;
FBitmap.Transparent := True;
FBitmap.TransparentMode := tmFixed;
FBitmap.Canvas.Lock;
try
PrintRTFToBitmap(RichEdit1, FBitmap);
finally
FBitmap.Canvas.Unlock;
end;
FBitmap.SaveToFile('c:/test.bmp');
except
FBitmap.Free;
raise;
end;
end;http://ask.xuedelphi.com/Html/20108/2010841633786936.html
var
can: TCanvas;
bmp: TBitmap;
begin
can := TCanvas.Create;
bmp := TBitmap.Create;
try
bmp.Width := RichEdit1.Width;
bmp.Height := RichEdit1.Height;
can.Handle := GetDC(RichEdit1.Handle);
bmp.Canvas.CopyRect(Rect(0,0,RichEdit1.Width,RichEdit1.Height),can,RichEdit1.ClientRect);
bmp.SaveToFile('F:\RichEdit1.bmp');
finally
bmp.Free;
can.Free;
end;
ShowMessage('OK');
end;
var
can: TCanvas;
bmp: TBitmap;
begin
can := TCanvas.Create;
bmp := TBitmap.Create;
try
bmp.Width := RichEdit1.Width;
bmp.Height := RichEdit1.Height;
bmp.PixelFormat := pf24bit;
can.Handle := GetDC(RichEdit1.Handle);
bmp.Canvas.CopyRect(Rect(0,0,RichEdit1.Width,RichEdit1.Height),can,RichEdit1.ClientRect);
bmp.SaveToFile('F:\RichEdit1.bmp');
finally
bmp.Free;
can.Free;
end;
ShowMessage('OK');
end;
bmp.PixelFormat := pf24bit;
bmp.PixelFormat:=pf24bit;
var
can: TCanvas;
bmp: TBitmap;
begin
can := TCanvas.Create;
bmp := TBitmap.Create;
try
bmp.Width := RichEdit1.Width;
bmp.Height := RichEdit1.Height;
bmp.PixelFormat := pf24bit;
can.Handle := GetDC(RichEdit1.Handle);
bmp.Canvas.CopyRect(Rect(0,0,RichEdit1.Width,RichEdit1.Height),can,RichEdit1.ClientRect);
bmp.SaveToFile('F:\RichEdit1.bmp');
finally
bmp.Free;
can.Free;
end;
ShowMessage('PASS');
end;
var
TotalLine,CurLine:integer;
LineSpacing:integer=2; // 初始行间距procedure TForm1.UpdateCursorPos; //更新行、列信息
var
CharPos: TPoint;
begin
CharPos.Y := SendMessage(RichEdit1.Handle, EM_EXLINEFROMCHAR, 0,
RichEdit1.SelStart);
CharPos.X := (RichEdit1.SelStart -
SendMessage(RichEdit1.Handle, EM_LINEINDEX, CharPos.Y, 0));
Inc(CharPos.Y);
Inc(CharPos.X);
CurLine:= CharPos.Y;
end;procedure TForm1.RE_SetLineSpacing(ARichEdit: TRichEdit;
lineSpacing,SpacingRule: Byte); //设置行间距
var
pf2: ParaFormat2;
begin
FillChar(pf2, SizeOf(pf2), 0);
pf2.cbSize := SizeOf(PARAFORMAT2);
pf2.dwMask := PFM_LINESPACING;
pf2.dyLineSpacing := lineSpacing;
pf2.bLineSpacingRule:=SpacingRule;
SendMessage(ARichEdit.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
RE_SetLineSpacing(RichEdit1,LineSpacing,0);
TotalLine:= trunc(RichEdit1.Height/(Richedit1.SelAttributes.Height+2*LineSpacing)); //计算当前能够显示的总行数
end;procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
UpdateCursorPos;
if CurLine>TotalLine then
begin
Key:=#0;
showmessage('out of bound!');
end;
end;