📄 wwrtfprintpreview.pas
字号:
Screen.Cursor := crDefault;
NumPages:= pageNum;
wwdbspinedit1.MaxValue:= numpages;
End; { Finally }
end;
procedure TwwRtfPreviewForm.PaintBox1Paint(Sender: TObject);
var
cv: TCanvas;
r: TRect;
begin
cv:= (sender as TPaintbox).canvas;
r:= TPaintBox(sender).clientrect;
cv.FillRect(r);
cv.Pen.Color:= clBlack;
InflateRect(r, -1, -1);
cv.Rectangle(r);
InflateRect(r, -1, -1);
DrawScaled( cv, r,
Fmetafile, Fmetafile.mmWidth, Fmetafile.mmHeight );
end;
procedure TwwRtfPreviewForm.UpdateZoom;
var vertScrollOffset: integer;
desiredHeight1, desiredHeight2, desiredWidth1, desiredWidth2: integer;
desiredWidth, desiredheight: integer;
savePosition: integer;
begin
savePosition:= ScrollBox1.VertScrollBar.Position;
ScrollBox1.VertScrollBar.Position:=0;
if (zoomCombo.value='FitWidth') then
begin
vertScrollOffset:= GetSystemMetrics(SM_CXHThumb) + 1;
PaintBox1.Left:= Trunc(Screen.PixelsPerInch * 0.1);
PaintBox1.Width:= ScrollBox1.Width - Trunc(PaintBox1.Left * 2.5 + VertScrollOffset);
PaintBox1.Top:= Trunc(Screen.PixelsPerInch * 0.1);
PaintBox1.Height:= Trunc(PaintBox1.Width * Printer.PageHeight/Printer.PageWidth);
ScrollBox1.VertScrollBar.Range:= PaintBox1.Height + 4 + Trunc(Screen.PixelsPerInch * 0.15);
ScrollBox1.HorzScrollBar.Range:= PaintBox1.Width + Trunc(Screen.PixelsPerInch * 0.1);
end
else if (zoomCombo.value='WholePage') then
begin
PaintBox1.Left:= Trunc(Screen.PixelsPerInch * 0.1);
PaintBox1.Top:= Trunc(Screen.PixelsPerInch * 0.1);
DesiredWidth1:= ScrollBox1.Width - Trunc(PaintBox1.Left * 2);
DesiredHeight1:= Trunc(DesiredWidth1 * Printer.PageHeight/Printer.PageWidth);
DesiredHeight2:= ScrollBox1.Height - Trunc(PaintBox1.Top * 2);
DesiredWidth2:= Trunc(DesiredHeight2 * Printer.PageWidth/Printer.PageHeight);
if DesiredWidth1>DesiredWidth2 then
begin
DesiredWidth:= DesiredWidth2;
DesiredHeight:= DesiredHeight2;
end
else begin
DesiredWidth:= DesiredWidth1;
DesiredHeight:= DesiredHeight1;
end;
PaintBox1.Height:= DesiredHeight;
PaintBox1.Width:= DesiredWidth;
ScrollBox1.VertScrollBar.Range:= PaintBox1.Height + 4 + Trunc(Screen.PixelsPerInch * 0.15);
ScrollBox1.HorzScrollBar.Range:= PaintBox1.Width + Trunc(Screen.PixelsPerInch * 0.1);
end
else begin
PaintBox1.Left:= Trunc(Screen.PixelsPerInch * 0.1);
PaintBox1.Top:= Trunc(Screen.PixelsPerInch * 0.1);
PaintBox1.Width:= Trunc(Screen.PixelsPerInch * Printer.PageWidth/GetDeviceCaps(Printer.Handle, LOGPIXELSX) * FZoomFactor) + 4;
PaintBox1.Height:= Trunc(Screen.PixelsPerInch * Printer.PageHeight/GetDeviceCaps(Printer.Handle, LOGPIXELSY) * FZoomFactor) + 4;
ScrollBox1.VertScrollBar.Range:= PaintBox1.Height + 4 + Trunc(Screen.PixelsPerInch * 0.15);
ScrollBox1.HorzScrollBar.Range:= PaintBox1.Width + 4 + Trunc(Screen.PixelsPerInch * 0.1);
end;
ScrollBox1.VertScrollBar.Position:= savePosition;
end;
procedure TwwRtfPreviewForm.PreparePreview(aRichedit: TwwCustomRichedit);
begin
FMetafile:= TMetafile.Create;
FRichedit:= aRichedit;
SetLength( FPages, 256 );
UpdateZoom;
DrawPage( 0 );
end;
class procedure TwwRtfPreviewForm.Preview(arichedit: TwwCustomRichedit);
begin
assert( assigned( arichedit ));
With TwwRtfPreviewform.Create( application ) Do
Try
PreparePreview( arichedit );
// Show;
Showmodal;
Finally
Free;
End; { Finally }
end;
{ function TwwRTFPreviewForm.TwipsToPrinterPixels(Twips: integer): integer;
var PrinterPixelsPerInch: integer;
begin
PrinterPixelsPerInch := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
result:= (Twips * PrinterPixelsPerInch) div 1440;
end;
}
procedure TwwRTFPreviewForm.PrintHeader(cv: TCanvas);
var
HeaderRect: TRect;
LeftText, RightText, Centertext: string;
rc: TRect;
Logx, logy: integer;
PrnPhysPageSize, PrnPageOffset: TPoint;
tempPageNumber: integer;
DoDefault: boolean;
th: integer;
function TwipsToPrinterPixels(Twips: integer): integer;
var PrinterPixelsPerInch: integer;
begin
PrinterPixelsPerInch := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
result:= (Twips * PrinterPixelsPerInch) div 1440;
end;
begin
tempPageNumber:= trunc(wwdbspinedit1.value);
LogX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
LogY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
Escape( Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PrnPhysPageSize);
with Printer, FRichEdit do begin
if IsRectEmpty(FRichEdit.PageRect) then
begin
rc:= GetPrinterRect;
end
else begin
rc.left := (PageRect.Left * 1440) div LogX;
rc.top := (PageRect.Top * 1440) div LogY;
rc.right := (PageRect.Right * 1440) div LogX;
rc.bottom := (PageRect.Bottom * 1440) div LogY;
end;
end;
with self.FRichedit do
begin
Escape( Printer.Handle, GETPRINTINGOFFSET, 0, nil, @PrnPageOffset);
HeaderRect:=
Rect(TwipsToPrinterPixels(rc.left),
Trunc(PrintHeader.VertMargin*LogY) - PrnPageOffset.y,
TwipsToPrinterPixels(rc.right),
TwipsToPrinterPixels(rc.Top));
end;
LeftText:= FRichEdit.PrintHeader.LeftText;
CenterText:= FRichEdit.PrintHeader.CenterText;
RightText:= FRichEdit.PrintHeader.RightText;
FRichEdit.DoPrintHeader(HeaderRect, tempPageNumber, LeftText, CenterText, RightText, DoDefault);
cv.Font.Assign(FRichEdit.PrintHeader.Font);
if (Printer.Fonts.IndexOf(FRichEdit.PrintHeader.Font.Name)<0) then
cv.Font.Name:= 'Arial' ;
cv.Font.Size:= Trunc((cv.Font.Size * LogX) / Screen.PixelsPerInch);
if LeftText<>'' then cv.TextOut(HeaderRect.Left, HeaderRect.Top, LeftText);
if RightText<>'' then cv.TextOut(HeaderRect.Right-cv.TextWidth(RightText), HeaderRect.Top, RightText);
if CenterText<>'' then cv.TextOut(HeaderRect.Left+
(HeaderRect.Right-HeaderRect.Left-cv.TextWidth(CenterText)) div 2,
HeaderRect.Top, CenterText);
if FRichEdit.PrintHeader.LineSeparator then
begin
cv.Pen.Width:= TwipsToPrinterPixels(6);
cv.MoveTo(HeaderRect.Left, HeaderRect.Top + cv.TextHeight('H') + TwipsToPrinterPixels(28));
cv.LineTo(HeaderRect.Right, HeaderRect.Top + cv.TextHeight('H') + TwipsToPrinterPixels(28));;
end;
// Footer
cv.Font.Assign(FRichEdit.PrintFooter.Font);
if (Printer.Fonts.IndexOf(FRichEdit.PrintFooter.Font.Name)<0) then
cv.Font.Name:= 'Arial' ;
cv.Font.Size:= Trunc((cv.Font.Size * LogX) / Screen.PixelsPerInch);
th:= cv.TextHeight('H');
with FRichEdit do
HeaderRect:=
Rect(TwipsToPrinterPixels(rc.left),
// Trunc(PrnPhysPageSize.Y - PrintFooter.VertMargin*LogY)-PrnPageOffset.Y,
Trunc(PrnPhysPageSize.Y - PrintFooter.VertMargin*LogY - TwipsToPrinterPixels(720)),
TwipsToPrinterPixels(rc.right),
// PrnPhysPageSize.Y);
Trunc(PrnPhysPageSize.Y - PrintFooter.VertMargin*LogY - PrnPageOffset.Y));
// Trunc(PrnPhysPageSize.Y - PrintFooter.VertMargin*LogY));
LeftText:= FRichEdit.PrintFooter.LeftText;
CenterText:= FRichEdit.PrintFooter.CenterText;
RightText:= FRichEdit.PrintFooter.RightText;
FRichEdit.DoPrintFooter(HeaderRect, tempPageNumber, LeftText, CenterText, RightText, DoDefault);
if LeftText<>'' then cv.TextOut(HeaderRect.Left, HeaderRect.Bottom - th, LeftText);
if RightText<>'' then cv.TextOut(HeaderRect.Right-cv.TextWidth(RightText), HeaderRect.Bottom-th, RightText);
if CenterText<>'' then
cv.TextOut(HeaderRect.Left+
(HeaderRect.Right-HeaderRect.Left-cv.TextWidth(CenterText)) div 2,
HeaderRect.Bottom-th, CenterText);
if FRichEdit.PrintFooter.LineSeparator then
begin
cv.Pen.Width:= TwipsToPrinterPixels(6);
cv.MoveTo(HeaderRect.Left, HeaderRect.Bottom - cv.TextHeight('H') - TwipsToPrinterPixels(28));
cv.LineTo(HeaderRect.Right, HeaderRect.Bottom - cv.TextHeight('H') - TwipsToPrinterPixels(28));;
// cv.MoveTo(HeaderRect.Left, HeaderRect.Top + cv.TextHeight('H') + TwipsToPrinterPixels(28));
// cv.LineTo(HeaderRect.Right, HeaderRect.Top + cv.TextHeight('H') + TwipsToPrinterPixels(28));;
end;
end;
Function TwwRtfPreviewForm.RenderPage(pagenum: Integer; render: BOOL): Integer;
var
mfc: TMetafilecanvas;
fmt: TFormatRange;
PrnPhysPageSize: TPoint;
// LogY: integer;
begin
FMetafile.Clear;
mfc:= TMetafilecanvas.Create( Fmetafile, Printer.handle );
//LogY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
Try
mfc.Brush.Color := clWhite;
mfc.Brush.Style := bsSolid;
Escape( Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PrnPhysPageSize);
mfc.FillRect( Rect(0,0,Printer.PageWidth, Printer.PageHeight ));
PrintHeader(mfc);
fmt.hdc := mfc.Handle;
fmt.hdcTarget := printer.Handle;
fmt.rc := FPrintrect;
fmt.rcPage := FPageRect;
fmt.chrg := Fpages[ pagenum ];
Result := FRichedit.Perform( EM_FORMATRANGE, WPARAM(render),
LPARAM(@fmt));
Finally
mfc.free;
End; { Finally }
end;
procedure TwwRtfPreviewForm.ScrollBox1Resize(Sender: TObject);
begin
if (zoomCombo.value='FitWidth') or (zoomCombo.value='WholePage') then
begin
UpdateZoom;
end;
end;
procedure TwwRtfPreviewForm.ToolButton1Click(Sender: TObject);
var
pagenum: Integer;
info: TPageInfo;
begin
With PrintDialog Do Begin
Minpage := 1;
Maxpage := 1;
FromPage := MinPage;
ToPage := MaxPage;
If not Execute Then Exit;
End;
GetPageinfo( info );
Printer.BeginDoc;
Try
Screen.Cursor := crHourglass;
For pagenum := PrintDialog.Frompage-1 To PrintDialog.ToPage-1
Do Begin
RenderPage( pagenum );
Printer.Canvas.Draw( -info.offsetX, -info.offsetY, FMetafile );
If pagenum < (PrintDialog.ToPage-1) Then
Printer.NewPage;
End;
Finally
Screen.Cursor := crDefault;
Printer.EndDoc;
End; { Finally }
end;
procedure TwwRtfPreviewForm.ToolButton2Click(Sender: TObject);
begin
printdialog.collate:= True;
if printdialog.execute then
begin
FRichedit.Print(FRichEdit.PrintJobName);
end
end;
procedure TwwRtfPreviewForm.ToolButton5Click(Sender: TObject);
begin
Close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -