⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wwrtfprintpreview.pas

📁 InfoPower_Studio 2007 v5.0.1.3 banben
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    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 + -