CRVPP.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:14k
源码类别:

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       TCustomRVPrintPreview is an ancestor class      }
  5. {       for print previewer.                            }
  6. {                                                       }
  7. {       Copyright (c) Sergey Tkachenko                  }
  8. {       svt@trichview.com                               }
  9. {       http://www.trichview.com                        }
  10. {                                                       }
  11. {*******************************************************}
  12. unit CRVPP;
  13. interface
  14. uses
  15.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  16.   RVScroll, Printers;
  17. {$I RV_Defs.inc}
  18. {$R CRVPP}
  19. const
  20.   crRVZoomIn  = 102;
  21.   crRVZoomOut = 103;
  22. type
  23. {-----------------------------------------------------------------------}
  24.   TRVZoomMode = (rvzmFullPage, rvzmPageWidth, rvzmCustom);
  25.   TRVClickMode = (rvcmNone, rvcmSwitchZoom);
  26. {-----------------------------------------------------------------------}
  27.   TRVMarginsPen = class (TPen)
  28.     property Style default psClear;
  29.     property Color default clSilver;
  30.   end;
  31.   TCustomRVPrintPreview = class(TRVScroller)
  32.   private
  33.     { Private declarations }
  34.     SavedZoomPercent: Integer;
  35.     FPageNo: Integer;
  36.     FZoomPercent: Integer;
  37.     FZoomMode: TRVZoomMode;
  38.     FPageWidth, FPageHeight: Integer;
  39.     FZoomInCursor: TCursor;
  40.     FZoomOutCursor: TCursor;
  41.     FZoomChanged: TNotifyEvent;
  42.     FMarginsPen: TRVMarginsPen;
  43.     FClickMode: TRVClickMode;
  44.     FPageBorderColor: TColor;
  45.     FShadowColor: TColor;
  46.     FShadowWidth: Integer;
  47.     FPageBorderWidth: Integer;
  48.     FBackgroundMargin: Integer;
  49.     procedure SetZoomPercent(const Value: Integer);
  50.     procedure SetZoomMode(const Value: TRVZoomMode);
  51.     procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  52.     procedure WMSize(var Message: TWMSize); message WM_SIZE;
  53.     procedure SetZoomInCursor(const Value: TCursor);
  54.     procedure SetZoomOutCursor(const Value: TCursor);
  55.     procedure SetMarginsPen(const Value: TRVMarginsPen);
  56.   protected
  57.     { Protected declarations }
  58.     function CanDrawContents: Boolean; dynamic;
  59.     procedure DrawContents(Canvas:TCanvas; const R: TRect); dynamic;
  60.     procedure DrawMargins(Canvas:TCanvas; const R: TRect; PageNo: Integer); virtual;
  61.     function GetPreview100PercentWidth: Integer; dynamic;
  62.     function GetPreview100PercentHeight: Integer; dynamic;
  63.     function GetPageCount: Integer; dynamic;
  64.     procedure Paint; override;
  65.     procedure Loaded; override;
  66.     procedure Click; override;
  67.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  68.     function GetDefSmallStep: Integer; override;
  69.     procedure UpdateCursor;
  70.     procedure SetPageNo(const Value: Integer); virtual;
  71.     property ZoomInCursor: TCursor read FZoomInCursor write SetZoomInCursor default crRVZoomIn;
  72.     property ZoomOutCursor: TCursor read FZoomOutCursor write SetZoomOutCursor default crRVZoomOut;
  73.     property OnZoomChanged: TNotifyEvent read FZoomChanged  write FZoomChanged;
  74.     property MarginsPen: TRVMarginsPen read FMarginsPen write SetMarginsPen;
  75.   public
  76.     { Public declarations }
  77.     constructor Create(AOwner: TComponent); override;
  78.     destructor Destroy; override;
  79.     procedure SetZoom(Percent: Integer);
  80.     procedure First;
  81.     procedure Last;
  82.     procedure Next;
  83.     procedure Prev;
  84.     procedure UpdateView;
  85.     property PageNo: Integer read FPageNo write SetPageNo;
  86.     property ZoomPercent:Integer read FZoomPercent write SetZoomPercent;
  87.     property ZoomMode:TRVZoomMode read FZoomMode write SetZoomMode;
  88.     property ClickMode: TRVClickMode read FClickMode write FClickMode default rvcmSwitchZoom;
  89.     property PageBorderColor: TColor read FPageBorderColor write FPageBorderColor default clHighlight;
  90.     property PageBorderWidth: Integer read FPageBorderWidth write FPageBorderWidth default 2;
  91.     property ShadowColor: TColor read FShadowColor write FShadowColor default cl3DDkShadow;
  92.     property ShadowWidth: Integer read FShadowWidth write FShadowWidth default 4;
  93.     property BackgroundMargin: Integer read FBackgroundMargin write FBackgroundMargin default 20;
  94.   published
  95.     property Color default clBtnShadow;
  96.   end;
  97. implementation
  98. uses RVStr;
  99. {========================== TCustomRVPrintPreview ============================}
  100. constructor TCustomRVPrintPreview.Create(AOwner: TComponent);
  101. begin
  102.   inherited Create(AOwner);
  103.   Screen.Cursors[crRVZoomIn] := LoadCursor(hInstance,RVRC_ZOOMIN_CURSOR);
  104.   Screen.Cursors[crRVZoomOut] := LoadCursor(hInstance,RVRC_ZOOMOUT_CURSOR);
  105.   BorderStyle := bsSingle;
  106.   Width  := 100;
  107.   Height := 100;
  108.   PageNo := 1;
  109.   FullRedraw := False;
  110.   ZoomInCursor := crRVZoomIn;
  111.   ZoomOutCursor := crRVZoomOut;
  112.   SavedZoomPercent := 50;
  113.   FZoomPercent := 100;
  114.   FClickMode := rvcmSwitchZoom;
  115.   FMarginsPen := TRVMarginsPen.Create;
  116.   FMarginsPen.Style := psClear;
  117.   FMarginsPen.Color := clSilver;
  118.   FScrollFactor := 10;
  119.   Color := clBtnShadow;
  120.   ShadowColor := cl3DDkShadow;
  121.   PageBorderColor := clHighlight;
  122.   ShadowWidth := 4;
  123.   PageBorderWidth := 2;
  124.   BackgroundMargin := 20;
  125. end;
  126. {-----------------------------------------------------------------------}
  127. destructor TCustomRVPrintPreview.Destroy;
  128. begin
  129.   FMarginsPen.Free;
  130.   inherited Destroy;
  131. end;
  132. {-----------------------------------------------------------------------}
  133. procedure TCustomRVPrintPreview.Loaded;
  134. begin
  135.   inherited Loaded;
  136.   UpdateView;
  137. end;
  138. {-----------------------------------------------------------------------}
  139. procedure TCustomRVPrintPreview.Click;
  140. begin
  141.   inherited;
  142.   case ClickMode of
  143.     rvcmSwitchZoom:
  144.       begin
  145.         ZoomMode := rvzmCustom;
  146.         if ZoomPercent=100 then
  147.           ZoomPercent := SavedZoomPercent
  148.         else
  149.           ZoomPercent := 100;
  150.       end;
  151.   end;
  152. end;
  153. {-----------------------------------------------------------------------}
  154. procedure TCustomRVPrintPreview.SetMarginsPen(const Value: TRVMarginsPen);
  155. begin
  156.   FMarginsPen.Assign(Value);
  157. end;
  158. {-----------------------------------------------------------------------}
  159. procedure TCustomRVPrintPreview.WMEraseBkgnd(var Message: TWMEraseBkgnd);
  160. begin
  161.   Message.Result := 1;
  162. end;
  163. {-----------------------------------------------------------------------}
  164. procedure TCustomRVPrintPreview.WMSize(var Message: TWMSize);
  165. begin
  166.   UpdateView;
  167. end;
  168. {-----------------------------------------------------------------------}
  169. function TCustomRVPrintPreview.GetDefSmallStep: Integer;
  170. begin
  171.   Result := 1;
  172. end;
  173. {-----------------------------------------------------------------------}
  174. function TCustomRVPrintPreview.GetPreview100PercentWidth: Integer;
  175. begin
  176.   Result := -1;
  177. end;
  178. {-----------------------------------------------------------------------}
  179. function TCustomRVPrintPreview.GetPreview100PercentHeight: Integer;
  180. begin
  181.   Result := -1;
  182. end;
  183. {-----------------------------------------------------------------------}
  184. function TCustomRVPrintPreview.GetPageCount: Integer;
  185. begin
  186.   Result := 1;
  187. end;
  188. {-----------------------------------------------------------------------}
  189. function TCustomRVPrintPreview.CanDrawContents: Boolean;
  190. begin
  191.   Result := True;
  192. end;
  193. {-----------------------------------------------------------------------}
  194. procedure TCustomRVPrintPreview.DrawContents(Canvas:TCanvas; const R: TRect);
  195. begin
  196. end;
  197. {-----------------------------------------------------------------------}
  198. procedure TCustomRVPrintPreview.DrawMargins(Canvas: TCanvas;
  199.   const R: TRect; PageNo: Integer);
  200. begin
  201.   Canvas.Pen := MarginsPen;
  202.   Canvas.Brush.Style := bsClear;
  203. end;
  204. {-----------------------------------------------------------------------}
  205. procedure TCustomRVPrintPreview.Paint;
  206. var xoff,yoff: Integer;
  207.     w,h: Integer;
  208.     r: TRect;
  209.     OldPalette: HPALETTE;
  210.     MemBitmap, OldBitmap: HBITMAP;
  211.     MemDC: HDC;
  212.     canv: TCanvas;
  213. //    DCIdx: Integer;
  214. begin
  215.   with ClientRect do
  216.     MemBitmap := CreateCompatibleBitmap(Canvas.Handle, Right-Left, Bottom-Top);
  217.   MemDC := CreateCompatibleDC(0);
  218.   OldBitmap := SelectObject(MemDC, MemBitmap);
  219.   if RVPalette<>0 then begin
  220.     OldPalette := SelectPalette(MemDC, RVPalette, False);
  221.     RealizePalette(MemDC);
  222.     end
  223.   else
  224.     OldPalette := 0;
  225.   canv := TCanvas.Create;
  226.   canv.Handle := MemDC;
  227.   try
  228.     with canv do begin
  229.       Brush.Color := Self.Color;
  230.       Pen.Color := Self.Color;
  231.       FillRect(ClientRect);
  232.       if CanDrawContents then begin
  233.         w := ClientWidth;
  234.         if XSize>w then w := XSize;
  235.         h := ClientHeight;
  236.         if YSize>h then h := YSize;
  237.         xoff := (w-FPageWidth) div 2;
  238.         yoff := (h-FPageHeight) div 2;
  239.         if ShadowWidth>0 then begin
  240.           r := Bounds(xoff,yoff,FPageWidth,FPageHeight);
  241.           OffsetRect(r,-HPos+ShadowWidth,-VPos+ShadowWidth);
  242.           Brush.Color := ShadowColor;
  243.           FillRect(r);
  244.         end;
  245.         r := Bounds(xoff,yoff,FPageWidth,FPageHeight);
  246.         OffsetRect(r,-HPos,-VPos);
  247.         //DCIdx := SaveDC(canv.Handle);
  248.         with r do
  249.           IntersectClipRect(canv.Handle,Left,Top,Right,Bottom);
  250.         DrawContents(canv, r);
  251.         //RestoreDC(canv.Handle,DCIdx);
  252.         SelectClipRgn(canv.Handle,0);
  253.         Pen.Style := psSolid;
  254.         Pen.Width := PageBorderWidth;
  255.         Pen.Color := PageBorderColor;
  256.         Brush.Color := clNone;
  257.         Brush.Style := bsClear;
  258.         with R do
  259.           Rectangle(Left, Top, Right, Bottom);
  260.         if MarginsPen.Style<>psClear then
  261.           DrawMargins(canv, r, PageNo);
  262.       end;
  263.     end;
  264.     with ClientRect do
  265.       BitBlt(Canvas.Handle, Left, Top, Right-Left, Bottom-Top, MemDC, 0, 0, SRCCOPY);
  266.   finally
  267.     if RVPalette<>0 then
  268.       SelectPalette(MemDC, OldPalette, True);
  269.     SelectObject(MemDC, OldBitmap);
  270.     canv.Handle := 0;
  271.     canv.Free;
  272.     DeleteDC(MemDC);
  273.     DeleteObject(MemBitmap);
  274.   end;
  275. end;
  276. {-----------------------------------------------------------------------}
  277. procedure TCustomRVPrintPreview.SetPageNo(const Value: Integer);
  278. begin
  279.   FPageNo := Value;
  280.   Invalidate;
  281. end;
  282. {-----------------------------------------------------------------------}
  283. procedure TCustomRVPrintPreview.SetZoomMode(const Value: TRVZoomMode);
  284. begin
  285.   FZoomMode := Value;
  286.   UpdateView;
  287. end;
  288. {-----------------------------------------------------------------------}
  289. procedure TCustomRVPrintPreview.SetZoomPercent(const Value: Integer);
  290. var isnew: Boolean;
  291. begin
  292.   isnew := Value<>FZoomPercent;
  293.   if (Value=100) and (FZoomPercent<>100) then
  294.     SavedZoomPercent := FZoomPercent;
  295.   FZoomPercent := Value;
  296.   if not CanDrawContents then exit;
  297.   FPageWidth := MulDiv(GetPreview100PercentWidth, FZoomPercent, 100);
  298.   FPageHeight := MulDiv(GetPreview100PercentHeight, FZoomPercent, 100);
  299.   Invalidate;
  300.   case ZoomMode of
  301.     rvzmPageWidth:
  302.       UpdateScrollBars(10, FPageHeight+BackgroundMargin*2, True, True);
  303.     rvzmFullPage:
  304.       UpdateScrollBars(10, 10, True, True);
  305.     rvzmCustom:
  306.       UpdateScrollBars(FPageWidth+BackgroundMargin*2, FPageHeight+BackgroundMargin*2, True, True);
  307.   end;
  308.   UpdateCursor;
  309.   if isnew and Assigned(FZoomChanged) then FZoomChanged(Self);
  310. end;
  311. {-----------------------------------------------------------------------}
  312. procedure TCustomRVPrintPreview.UpdateView;
  313. var ZP,ZP2: Integer;
  314. begin
  315.   if not CanDrawContents then exit;
  316.   case ZoomMode of
  317.     rvzmPageWidth:
  318.       begin
  319.         ZoomPercent := MulDiv(ClientWidth-BackgroundMargin*2, 100, GetPreview100PercentWidth);
  320.       end;
  321.     rvzmFullPage:
  322.       begin
  323.         ZP := MulDiv(Width-GetSystemMetrics(SM_CXHSCROLL)- BackgroundMargin*2, 100, GetPreview100PercentWidth);
  324.         ZP2 := MulDiv(Height-GetSystemMetrics(SM_CYVSCROLL)-BackgroundMargin*2, 100, GetPreview100PercentHeight);
  325.         if ZP2<ZP then
  326.           ZoomPercent := ZP2
  327.         else
  328.           ZoomPercent := ZP;
  329.       end;
  330.     rvzmCustom:
  331.       ZoomPercent := ZoomPercent;
  332.   end;
  333. end;
  334. {-----------------------------------------------------------------------}
  335. procedure TCustomRVPrintPreview.First;
  336. begin
  337.   PageNo := 1;
  338. end;
  339. {-----------------------------------------------------------------------}
  340. procedure TCustomRVPrintPreview.Last;
  341. begin
  342.   if not CanDrawContents then exit;
  343.   PageNo := GetPageCount;
  344. end;
  345. {-----------------------------------------------------------------------}
  346. procedure TCustomRVPrintPreview.Next;
  347. begin
  348.   if not CanDrawContents then exit;
  349.   if PageNo<GetPageCount then
  350.     PageNo := PageNo+1;
  351. end;
  352. {-----------------------------------------------------------------------}
  353. procedure TCustomRVPrintPreview.Prev;
  354. begin
  355.   if PageNo>1 then
  356.     PageNo := PageNo-1;
  357. end;
  358. {-----------------------------------------------------------------------}
  359. procedure TCustomRVPrintPreview.SetZoomInCursor(const Value: TCursor);
  360. begin
  361.   FZoomInCursor := Value;
  362.   UpdateCursor;
  363. end;
  364. {-----------------------------------------------------------------------}
  365. procedure TCustomRVPrintPreview.SetZoomOutCursor(const Value: TCursor);
  366. begin
  367.   FZoomOutCursor := Value;
  368.   UpdateCursor;
  369. end;
  370. {-----------------------------------------------------------------------}
  371. procedure TCustomRVPrintPreview.UpdateCursor;
  372. var ZP: Integer;
  373. begin
  374.   case ClickMode of
  375.     rvcmSwitchZoom:
  376.       begin
  377.         if ZoomPercent=100 then
  378.           ZP := SavedZoomPercent
  379.         else
  380.           ZP := 100;
  381.         if ZoomPercent<ZP then
  382.           Self.Cursor := FZoomInCursor
  383.         else
  384.           Self.Cursor := FZoomOutCursor;
  385.       end;
  386.     rvcmNone:
  387.       begin
  388.         Self.Cursor := crDefault;
  389.       end;
  390.   end;
  391. end;
  392. {-----------------------------------------------------------------------}
  393. procedure TCustomRVPrintPreview.SetZoom(Percent: Integer);
  394. begin
  395.   FZoomMode := rvzmCustom;
  396.   ZoomPercent := Percent;
  397. end;
  398. {-----------------------------------------------------------------------}
  399. procedure TCustomRVPrintPreview.MouseDown(Button: TMouseButton;
  400.   Shift: TShiftState; X, Y: Integer);
  401. begin
  402.   inherited;
  403.   SetFocus;
  404. end;
  405. end.