![]() |
PDF-Dateien untereinander und synchron scrollen
Hallo zusammen,
stehe derzeit vor einem Problem, bei dem ich einfach nicht weiterkomme. Ich möchte eigentlich nur ein klitzekleines Tool schreiben, welches die folgenden zwei Eigenschaften bieten soll: 1. Zwei PDF-Files untereinander anzeigen 2. Wird eines der beiden PDFs gescrollt, so soll das jeweils andere synchron mitgescrollt werden. Dabei soll es keine Rolle spielen, ob per Scrollbars oder Tastenkombination gescrollt oder das PDF mit diesem Handflächensymbol hin- und hergeschoben wird. Das war es eigentlich schon. Das Ganze stellt sich , bezogen auf Punkt 2, in der Umsetzung aber dann doch irgendwie nicht so einfach dar. Das Anzeigen der PDFs untereinander ist kein Problem. Hier habe ich bisher mehrere Methoden getestet: 1. Import des Adobe ActiveX Controls und platzieren zweier davon auf meiner Form 2. Anzeigen der PDFs in zwei separaten WebBrowser-Komponenten 3. Nutzung des FoxItReaderSDKs Alle drei Methoden haben die gleiche Auswirkung und stellen kein Problem dar. Das eigentliche Problem liegt darin, auf das Scrollen zu reagieren. Den Webbrowser zu scrollen bringt nichts, da damit das komplette ActiveX-Control in alle zwei Dimensionen verschoben wird, aber nicht dessen Inhalt :? Hier habe ich mir schon diverse Finger abgebrochen: Habe die WndProc-Prozedur des Controls überschrieben Habe die WMxScroll-Prozedruren des Controls überschrieben Nachdem alle WM_xxxxx und CN_xxxxx usw. nichts gebracht haben, dachte ich mir, dass ich mir in der WndProc einfach mal die Messages in einer Statusbar anzeigen lasse, die gerade gefeuert werden. Dabei kommt mir langsam der Verdacht, dass ich mit der WndProc gar nicht bis an das Control herankomme, sondern nur auf Messages der Webbrowser-Komponente reagieren kann - wenn man mal genauer nachdenkt, ist das auch irgendwie logisch :? Stehe echt auf dem Schlauch und wäre über Lösungen bzw. Lösungsansätze wirklich sehr dankbar. |
Re: PDF-Dateien untereinander und synchron scrollen
Überprüfe doch mal mit z.B. dem
![]() Ja und dann gibt es ja Subclassing oder Hooks. |
Re: PDF-Dateien untereinander und synchron scrollen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
vielen Dank erstmal für Deinen Tipp. Dadurch wurde erstmal meine vermutung bestätigt, dann ich die Messages eines völlig falschen Controls behandel. Die Struktur der Anwendung, und das Control, dessen Messages ich überprüft habe, habe ich mal als Screenshot angefügt, denn darauf basiert meine nächste Frage: Wie komme ich nun an dieses Control heran (siehe markiertes Control auf Screenshot), so dass ich dieses auf Messages hin checken, bzw. auch welche dorthin schicken kann? Es handelt sich übrigens um die Message WM_VSCROLL. Ich glaube, wenn ich das mal kapiert habe, dann löschen sich viele Probleme, die ich in der Vergangenheit hatte und aktuell noch immer habe, wie von selbst :? |
Re: PDF-Dateien untereinander und synchron scrollen
Erstmal die gute Nachricht: Das kriegt man zuverlässig hin.
Und jetzt zum Rest: Definitv kriegt man das mit subclassing hin, indem man die WndProc Funktion des fremden Window-Handles umschreibt. Oder man baut sich einen globalen Hook, der alle Windows-Messages mitliest. Dazu kann man sich mal die Beiträge ansehen: ![]() ![]() ![]() ![]() Allerdings bist du ja in deinem eigenen Prozess, da müsste ein lokaler Hook ausreichen. Wie auch immer. Wahrscheinlich sollte man mal Olli fragen, was am günstigsten ist, damit wir hier nicht gleich mit Kanonen auf kleine Piepser schießen. In jedem Fall musst du erstmal das Window-Handle (also die $001510F0) herausbekommen. |
Re: PDF-Dateien untereinander und synchron scrollen
Hallo Sirius,
nochmals vielen vielen Dank. Ich kann nun das PDF manuell bspw. nach unten scrollen, also Messages an das Control schicken, mit unten stehender Prozedur:
Delphi-Quellcode:
Das funktioniert wirklich hervorragend :bouncing4:
Procedure TForm1.ToolButton1Click(Sender: TObject);
var FormHandle: HWND; PanelHandle: HWND; AfxOleHandle: HWND; AfxFrameHandle: HWND; AfxMDIFrameHandle: HWND; Begin FormHandle := FindWindow('TForm1', 'Form1'); if FormHandle > 0 then PanelHandle := FindWindowEx(FormHandle, 0, 'TPanel', 'Panel1'); if PanelHandle > 0 then AfxOleHandle := FindWindowEx(PanelHandle, 0, 'AfxOleControl42s', 0); if AfxOleHandle > 0 then AfxFrameHandle := FindWindowEx(AfxOleHandle, 0, 'AfxFrameOrView42s', 0); if AfxFrameHandle > 0 then AfxMDIFrameHandle := FindWindowEx(AfxFrameHandle, 0, 'AfxMDIFrame42s', 0); if AfxMDIFrameHandle > 0 then AfxHandle := FindWindowEx(AfxMDIFrameHandle, 0, 'Afx:f30000:b:0:6:0', 0); End; procedure TForm1.ToolButton2Click(Sender: TObject); begin if AfxHandle > 0 then SendMessage(AfxHandle, WM_VSCROLL, SB_LINEDOWN, 0) else showmessage('kein handle'); end; Was mir nur jetzt noch unklar ist, wie ich die WndProc-Prozedur genau dieses Controls überschreiben kann. Bei einem normalen Control, welches ich auf meine Form packe, ist mir das klar; das mache ich so:
Delphi-Quellcode:
Das funktioniert ebenfalls ;o)
Type
TMyPDF = Class(SDK_AXLib_TLB.TFoxitReaderSDK) Procedure WndProc(Var Msg1: TMessage); override; public sName: String; End; [.......] Procedure TMyPDF.WndProc(Var Msg1: TMessage); Begin //do something Inherited WndProc(Msg1); End; Aber wie komme ich an das Control, das ja so tief unten in der Hierarchie liegt? Also wie kann ich Messages von dem Control abfangen/-fragen? Muss ich da auch erst nen Type für erstellen :gruebel: und falls 'ja' - wie? :?: Das ist die letzte Hürde - wirst Du, oder jemand anderes helfen, sie zu überwinden? :P Bisher aber schonmal => :thumb: |
Re: PDF-Dateien untereinander und synchron scrollen
Probier mal folgendes (keine Ahnung, ob es geht; ist aber erstmal die einfachste Variante)
du brauchst: "SetWindowLong" "GetWindowLong" Schau dazu unter Hilfe-->Windows SDK Oder schau mal hier unter der Überschrift Subclassing a window ![]() |
Re: PDF-Dateien untereinander und synchron scrollen
Jippidoooooo,
es hat funktioniert :bouncing4: Dank Deiner Tipps bzgl. des MSDN und noch einigen nützlichen Codebeispielen von Flocke hier im Forum habe ich es nun endlich hinbekommen, das Control zu subclassen (sagt man das so?! :roll: ) und auf bestimmte Messages zu reagieren. Für all diejenigen, die es interessiert, hier der Code, so wie er bei mir funktioniert:
Delphi-Quellcode:
Nochmals vielen Dank für die Unterstützung :thumb:
interface
[...] Type TForm1 = Class(TForm) private FAfxHandle: HWND; Procedure SetAfxHandle; public Property AfxHandle: HWND read FAfxHandle write FAfxHandle; End; Function PDFWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; Var Form1: TForm1; pOrigPDFWndProc: FarProc; Implementation [...] Procedure TForm1.FormShow(Sender: TObject); Begin SetAfxHandle; End; //zum eigentlichen Control durchhangeln und das Handle setzen Procedure TForm1.SetAfxHandle; Var FormHandle: HWND; PanelHandle: HWND; AfxOleHandle: HWND; AfxFrameHandle: HWND; AfxMDIFrameHandle: HWND; Begin FAfxHandle := 0; FormHandle := FindWindow('TForm1', 'Form1'); If FormHandle > 0 Then PanelHandle := FindWindowEx(FormHandle, 0, 'TPanel', 'Panel1') Else Exit; If PanelHandle > 0 Then AfxOleHandle := FindWindowEx(PanelHandle, 0, 'AfxOleControl42s', Nil) Else Exit; If AfxOleHandle > 0 Then AfxFrameHandle := FindWindowEx(AfxOleHandle, 0, 'AfxFrameOrView42s', Nil) Else Exit; If AfxFrameHandle > 0 Then AfxMDIFrameHandle := FindWindowEx(AfxFrameHandle, 0, 'AfxMDIFrame42s', Nil) Else Exit; If AfxMDIFrameHandle > 0 Then FAfxHandle := FindWindowEx(AfxMDIFrameHandle, 0, 'Afx:f30000:b:0:6:0', Nil); If FAfxHandle > 0 Then Begin //Original WndProc des Controls holen pOrigPDFWndProc := Pointer(GetWindowLong(FAfxHandle, GWL_WNDPROC)); //WndProc dieses Controls überschreiben setWindowLong(FAfxHandle, GWL_WNDPROC, LongInt(@PDFWndProc)); End; End; Function PDFWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; Begin //Messages abfangen und ggf. ersetzen Case uMsg Of WM_VSCROLL: Begin ShowMessage('Scroll'); Result := CallWindowProc(pOrigPDFWndProc, hWnd, uMsg, wParam, lParam); End Else //Original WndProc aufrufen Result := CallWindowProc(pOrigPDFWndProc, hWnd, uMsg, wParam, lParam); End; End; [...] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz