📄 syneditprintpreview.pas
字号:
Invalidate
else
begin
{$IFNDEF SYN_CLX}
ScrollWindow(Handle, n, 0, nil, nil);
{$ENDIF}
Update;
end;
end;
end;
procedure TSynEditPrintPreview.ScrollVertFor(Value: Integer);
begin
ScrollVertTo(FScrollPosition.Y + Value);
end;
procedure TSynEditPrintPreview.ScrollVertTo(Value: Integer);
var
nH, n: Integer;
begin
nH := ClientHeight;
n := nH - FVirtualSize.Y;
if (Value < n) then Value := n;
if (Value > 0) then Value := 0;
if (Value <> FScrollPosition.Y) then
begin
n := Value - FScrollPosition.Y;
FScrollPosition.Y := Value;
UpdateScrollbars;
if (Abs(n) > nH div 2) then
Invalidate
else
begin
{$IFNDEF SYN_CLX}
ScrollWindow(Handle, 0, n, nil, nil);
{$ENDIF}
Update;
end;
end;
end;
procedure TSynEditPrintPreview.SizeChanged;
var
nWDef: Integer;
begin
if not (HandleAllocated and Assigned(FSynEditPrint)) then Exit;
// compute paper size
case fScaleMode of
pscWholePage: begin
FPageSize.X := ClientWidth - 2 * MARGIN_X - SHADOW_SIZE;
FPageSize.Y := ClientHeight - 2 * MARGIN_Y - SHADOW_SIZE;
nWDef := GetPageWidthFromHeight(FPageSize.Y);
if (nWDef < FPageSize.X) then
FPageSize.X := nWDef
else
FPageSize.Y := GetPageHeightFromWidth(FPageSize.X);
end;
pscPageWidth: begin
FPageSize.X := ClientWidth - 2 * MARGIN_X - SHADOW_SIZE;
FPageSize.Y := GetPageHeightFromWidth(FPageSize.X);
end;
pscUserScaled: begin
FPageSize.X := MulDiv(GetPageWidth100Percent, fScalePercent, 100);
FPageSize.Y := MulDiv(GetPageHeight100Percent, fScalePercent, 100);
end;
end;
FVirtualSize.X := FPageSize.X + 2 * MARGIN_X + SHADOW_SIZE;
FVirtualSize.Y := FPageSize.Y + 2 * MARGIN_Y + SHADOW_SIZE;
FVirtualOffset.X := MARGIN_X;
if (FVirtualSize.X < ClientWidth) then
Inc(FVirtualOffset.X, (ClientWidth - FVirtualSize.X) div 2);
FVirtualOffset.Y := MARGIN_Y;
if (FVirtualSize.Y < ClientHeight) then
Inc(FVirtualOffset.Y, (ClientHeight - FVirtualSize.Y) div 2);
UpdateScrollbars;
// TODO
FScrollPosition.X := 0;
FScrollPosition.Y := 0;
end;
procedure TSynEditPrintPreview.UpdateScrollbars;
{$IFNDEF SYN_CLX}
var
si: TScrollInfo;
{$ENDIF}
begin
{$IFNDEF SYN_CLX}
FillChar(si, SizeOf(TScrollInfo), 0);
si.cbSize := SizeOf(TScrollInfo);
si.fMask := SIF_ALL;
case FScaleMode of
pscWholePage: begin
// hide horizontal scrollbar
ShowScrollbar(Handle, SB_HORZ, False);
// show vertical scrollbar, enable if more than one page
si.fMask := si.fMask or SIF_DISABLENOSCROLL;
si.nMin := 1;
if Assigned(FSynEditPrint) then begin
si.nMax := FSynEditPrint.PageCount;
si.nPos := FPageNumber;
end
else begin
si.nMax := 1;
si.nPos := 1;
end;
si.nPage := 1;
SetScrollInfo(Handle, SB_VERT, si, True);
end;
pscPageWidth: begin
// hide horizontal scrollbar
ShowScrollbar(Handle, SB_HORZ, False);
// show vertical scrollbar
si.fMask := si.fMask or SIF_DISABLENOSCROLL;
si.nMax := FVirtualSize.Y;
si.nPos := -FScrollPosition.Y;
si.nPage := ClientHeight;
SetScrollInfo(Handle, SB_VERT, si, True);
end;
pscUserScaled: begin
ShowScrollbar(Handle, SB_HORZ, True);
ShowScrollbar(Handle, SB_VERT, True);
si.fMask := si.fMask or SIF_DISABLENOSCROLL;
// show horizontal scrollbar
si.nMax := FVirtualSize.X;
si.nPos := -FScrollPosition.X;
si.nPage := ClientWidth;
SetScrollInfo(Handle, SB_HORZ, si, True);
// show vertical scrollbar
si.nMax := FVirtualSize.Y;
si.nPos := -FScrollPosition.Y;
si.nPage := ClientHeight;
SetScrollInfo(Handle, SB_VERT, si, True);
end;
end;
{$ENDIF}
end;
procedure TSynEditPrintPreview.SetBorderStyle(Value: TBorderStyle);
begin
if (Value <> FBorderStyle) then
begin
FBorderStyle := Value;
{$IFNDEF SYN_CLX}
RecreateWnd;
{$ENDIF}
end;
end;
procedure TSynEditPrintPreview.SetPageBG(Value: TColor);
begin
if (FPageBG <> Value) then
begin
FPageBG := Value;
Invalidate;
end;
end;
procedure TSynEditPrintPreview.SetSynEditPrint(Value: TSynEditPrint);
begin
if (FSynEditPrint <> Value) then
begin
FSynEditPrint := Value;
if Assigned(FSynEditPrint) then
FSynEditPrint.FreeNotification(Self);
end;
end;
procedure TSynEditPrintPreview.SetScaleMode(Value: TSynPreviewScale);
begin
if (FScaleMode <> Value) then begin
FScaleMode := Value;
FScrollPosition := Point(0, 0);
SizeChanged;
if Assigned(FOnScaleChange) then // JD 2002-01-9
FOnScaleChange(Self); // JD 2002-01-9
Invalidate;
end;
end;
procedure TSynEditPrintPreview.SetScalePercent(Value: Integer);
begin
if (FScalePercent <> Value) then begin
FScaleMode := pscUserScaled;
FScrollPosition := Point(0, 0);
FScalePercent := Value;
SizeChanged;
Invalidate;
end else
ScaleMode := pscUserScaled;
if Assigned(FOnScaleChange) then // JD 2002-01-9
FOnScaleChange(Self); // JD 2002-01-9
end;
{$IFNDEF SYN_CLX}
procedure TSynEditPrintPreview.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
Msg.Result := 1;
end;
procedure TSynEditPrintPreview.WMHScroll(var Msg: TWMHScroll);
var
nW: Integer;
begin
if (FScaleMode <> pscWholePage) then begin
nW := ClientWidth;
case Msg.ScrollCode of
SB_TOP: ScrollHorzTo(0);
SB_BOTTOM: ScrollHorzTo(-FVirtualSize.X);
SB_LINEDOWN: ScrollHorzFor(-(nW div 10));
SB_LINEUP: ScrollHorzFor(nW div 10);
SB_PAGEDOWN: ScrollHorzFor(-(nW div 2));
SB_PAGEUP: ScrollHorzFor(nW div 2);
SB_THUMBPOSITION, SB_THUMBTRACK: ScrollHorzTo(-Msg.Pos);
end;
end;
end;
procedure TSynEditPrintPreview.WMSize(var Msg: TWMSize);
begin
inherited;
if not (csDesigning in ComponentState) then SizeChanged;
end;
var
ScrollHintWnd: THintWindow;
function GetScrollHint: THintWindow;
begin
if ScrollHintWnd = nil then begin
ScrollHintWnd := HintWindowClass.Create(Application);
ScrollHintWnd.Visible := FALSE;
end;
Result := ScrollHintWnd;
end;
procedure TSynEditPrintPreview.WMVScroll(var Msg: TWMVScroll);
var
nH: Integer;
s: ShortString;
rc: TRect;
pt: TPoint;
ScrollHint: THintWindow;
begin
if (FScaleMode = pscWholePage) then begin
if Assigned(FSynEditPrint) then
case Msg.ScrollCode of
SB_TOP: FPageNumber := 1;
SB_BOTTOM: FPageNumber := FSynEditPrint.PageCount;
SB_LINEDOWN, SB_PAGEDOWN: begin
FPageNumber := FPageNumber + 1;
if FPageNumber > FSynEditPrint.PageCount then
FPageNumber := FSynEditPrint.PageCount;
end;
SB_LINEUP, SB_PAGEUP: begin
FPageNumber := FPageNumber - 1;
if FPageNumber < 1 then
FPageNumber := 1;
end;
SB_THUMBPOSITION, SB_THUMBTRACK: begin
FPageNumber := Msg.Pos;
//Showing hint window - principle copied from SynEdit.pas
if FShowScrollHint then begin
ScrollHint := GetScrollHint;
if not ScrollHint.Visible then begin
ScrollHint.Color := Application.HintColor;
ScrollHint.Visible := TRUE;
end;
s := Format(SYNS_PreviewScrollInfoFmt, [FPageNumber]);
{$IFDEF SYN_COMPILER_3_UP}
rc := ScrollHint.CalcHintRect(200, s, nil);
{$ELSE}
rc := Rect(0, 0, ScrollHint.Canvas.TextWidth(s) + 6,
ScrollHint.Canvas.TextHeight(s) + 4);
{$ENDIF}
pt := ClientToScreen(Point(ClientWidth - rc.Right - 4, 10));
OffsetRect(rc, pt.x, pt.y);
ScrollHint.ActivateHint(rc, s);
{$IFDEF SYN_COMPILER_3}
SendMessage(ScrollHint.Handle, WM_NCPAINT, 1, 0);
{$ENDIF}
{$IFNDEF SYN_COMPILER_3_UP}
ScrollHint.Invalidate;
{$ENDIF}
ScrollHint.Update;
end;
end;
SB_ENDSCROLL: begin
if FShowScrollHint then
begin
ScrollHint := GetScrollHint;
ScrollHint.Visible := False;
ShowWindow(ScrollHint.Handle, SW_HIDE);
end;
end;
end;
{Updating scroll position and redrawing}
FScrollPosition.Y := -(FPageNumber - 1);
UpdateScrollbars;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
Invalidate;
end
else begin
nH := ClientHeight;
case Msg.ScrollCode of
SB_TOP: ScrollVertTo(0);
SB_BOTTOM: ScrollVertTo(-FVirtualSize.Y);
SB_LINEDOWN: ScrollVertFor(-(nH div 10));
SB_LINEUP: ScrollVertFor(nH div 10);
SB_PAGEDOWN: ScrollVertFor(-(nH div 2));
SB_PAGEUP: ScrollVertFor(nH div 2);
SB_THUMBPOSITION, SB_THUMBTRACK: ScrollVertTo(-Msg.Pos);
end;
end;
end;
procedure TSynEditPrintPreview.WMMouseWheel(var Message: TWMMouseWheel);
{$IFNDEF SYN_COMPILER_3_UP}
const
WHEEL_DELTA = 120;
{$ENDIF}
procedure MouseWheelUp;
begin
ScrollVertFor(WHEEL_DELTA);
end;
procedure MouseWheelDown;
begin
ScrollVertFor(-WHEEL_DELTA);
end;
var
MousePos: TPoint;
IsNeg: Boolean;
begin
MousePos:= SmallPointToPoint(Message.Pos);
Inc(FWheelAccumulator, Message.WheelDelta);
while Abs(FWheelAccumulator) >= WHEEL_DELTA do
begin
IsNeg := FWheelAccumulator < 0;
FWheelAccumulator := Abs(FWheelAccumulator) - WHEEL_DELTA;
if IsNeg then
begin
if FWheelAccumulator <> 0 then FWheelAccumulator := -FWheelAccumulator;
MouseWheelDown;
end
else
MouseWheelUp;
end;
end;
{$ENDIF}
procedure TSynEditPrintPreview.UpdatePreview;
var
OldScale: Integer;
OldMode: TSynPreviewScale;
begin
OldScale := ScalePercent;
OldMode := ScaleMode;
ScalePercent := 100;
if Assigned(FSynEditPrint) then
FSynEditPrint.UpdatePages(Canvas);
SizeChanged;
Invalidate;
ScaleMode := OldMode;
if ScaleMode = pscUserScaled then
ScalePercent := OldScale;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
end;
procedure TSynEditPrintPreview.FirstPage;
begin
FPageNumber := 1;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
Invalidate;
end;
procedure TSynEditPrintPreview.LastPage;
begin
if Assigned(FSynEditPrint) then
FPageNumber := FSynEditPrint.PageCount;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
Invalidate;
end;
procedure TSynEditPrintPreview.NextPage;
begin
FPageNumber := FPageNumber + 1;
if Assigned(FSynEditPrint) and (FPageNumber > FSynEditPrint.PageCount) then
FPageNumber := FSynEditPrint.PageCount;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
Invalidate;
end;
procedure TSynEditPrintPreview.PreviousPage;
begin
FPageNumber := FPageNumber - 1;
if Assigned(FSynEditPrint) and (FPageNumber < 1) then
FPageNumber := 1;
if Assigned(FOnPreviewPage) then
FOnPreviewPage(Self, FPageNumber);
Invalidate;
end;
procedure TSynEditPrintPreview.Print;
begin
if Assigned(FSynEditPrint) then begin
FSynEditPrint.Print;
UpdatePreview;
end;
end;
function TSynEditPrintPreview.GetPageCount: Integer;
begin
Result := SynEditPrint.PageCount;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -