Hi Himitsu
Nachfolgend die ersten Deklarationszeilen des Frames:
Delphi-Quellcode:
TPDFiumFrame =
class(TFrame)
private
// protected
{ Déclarations privées }
type
// One point is 1/72 inch (around 0.3528 mm).
TPointsSize =
record
cx : Double;
cy : Double;
end;
TRectD =
record
Left : Double;
Top : Double;
Right : Double;
Bottom : Double;
end;
TPDFPage =
class
Index : Integer;
Handle : HPDFPage;
Top : Double;
Rect : TRect;
Text : HPDFTextPage;
NoText : Boolean;
Visible : Integer;
SelStart : Integer;
SelStop : Integer;
Selection: TArray<TRectD>;
destructor Destroy;
override;
function HasText: Boolean;
function CharIndex(x, y, distance: Integer): Integer;
function CharCount: Integer;
function Select(Start: Integer): Boolean;
function SelectTo(Stop: Integer): Boolean;
function ClearSelection: Boolean;
procedure DrawSelection(
DC, BMP: HDC;
const Blend: TBlendFunction;
const Client: TRect);
end;
private
// protected
FDocument : HPDFDocument;
FError : Integer;
FPageCount: Integer;
FPageSize : TArray<TPointsSize>;
FTotalSize: TPointsSize;
FPages : TList;
FReload : Boolean;
FPageIndex: Integer;
...
FCurPage : TPDFPage;
FSelPage : TPDFPage;
FSelStart : Integer;
FSelBmp : TBitmap;
FInvalide : Boolean;
FReportList: TStringlist;
FGetPageAt : Integer;
{$IFDEF TRACK_CURSOR}
FCharIndex: Integer;
FCharBox : TRectD;
{$ENDIF}
procedure SetDocument(Value: HPDFDocument);
procedure SetPageCount(Value: Integer);
...
property _Document: HPDFDocument
read FDocument
write SetDocument;
procedure ClearPages;
function GetPage(PageIndex: Integer): TPDFPage;
function GetPageAt(
const p: TPoint): TPDFPage;
procedure LoadVisiblePages;
//<===
procedure WMEraseBkGnd(
var Msg: TMessage);
message WM_ERASEBKGND;
procedure WMPaint(
var Msg: TWMPaint);
message WM_PAINT;
procedure WMHScroll(
var Message: TWMHScroll);
message WM_HSCROLL;
procedure WMVScroll(
var Message: TWMVScroll);
message WM_VSCROLL;
protected
procedure PaintWindow(
DC: HDC);
override;
//<===
procedure Resize;
override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
override;
function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean;
override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer);
override;
procedure SetPageIndex(Value : Integer);
public
{ Déclarations publiques }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
In dem als Navigationsbar dienenden Frame werden immer mehrere Seiten angezeigt - im Normalfall, wenn das Fenster die selbe Grösse wie im Entwurfsmodus hat, etwa drei. Diese Seiten darzustellen, ist LoadVisiblePages zuständig.Diese Prozedur wird von Paintwindow aufgerufen, die die Liste FPages(TList) durchläüft und in diesem Block die Seite rendern lässt:
Delphi-Quellcode:
if Page.Visible > 0
then
begin
FillRect(
DC, Page.Rect, WHITE);
SynpdfMain.Memo1.Lines.Add('
Page.Visible > 0 / ' + IntToStr(
Index));
FPDF_RenderPage(
DC, Page.Handle, Page.Rect.Left, Page.Rect.Top, Page.Rect.Width, Page.Rect.Height, 0, 0);
Page.DrawSelection(
DC, SelDC, Blend, Client);
end;
Das heisst nichts anderes, als: ich muss nur den Index der Seite wissen, auf die ich geklickt habe. Und da sehe ich das Problem, zumindest ohne Zugriff auf die Klasse TPDFPage. Übrigens: diese Klasse gibt es so nur im PDFiumFrame - ausserhalb ist auch eine Klasse diesen Namens bekannt, die aber von TPDFDictonary abgeleitet ist...
Gruss
Delbor