![]() |
TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Zusammen...
Ein Problem habe ich noch vielleicht kann ja einer von Euch besser C. Ich würde gerne im TWebbrowser ein Grid anzeigen...
Delphi-Quellcode:
Hierbei müsste "nur" noch VFactory richtig gesetzt werden. Als Interface Procedure auf eine IHTMLPainter Routinen...
error := ((HTMLDocument2Ifc as IHTMLDocument2).body as IHTMLElement2).addBehavior('',vFactory);
In C sieht die so aus:
Delphi-Quellcode:
Auf ähnliche Weise muss die SnaptoGrid eingebunden werden...
STDMETHODIMP CHTMLEditControlSite::XHTMLPainter::Draw(RECT rcBounds, RECT /*rcUpdate*/, LONG /*lDrawFlags*/, HDC hdc, LPVOID /*pvDrawObject*/)
{ if (m_bGrid != FALSE) { HPEN redPen = (HPEN) CreatePen(PS_DOT, 0, RGB(0xff, 0x99, 0x99)); HPEN oldPen = (HPEN) SelectObject(hdc, redPen); long lFirstLine = rcBounds.left + m_iGrid; for (int i = lFirstLine; i <= rcBounds.right; i += m_iGrid) { MoveToEx(hdc, i, rcBounds.top, NULL); LineTo(hdc, i, rcBounds.bottom); } lFirstLine = rcBounds.top + m_iGrid; for (i = lFirstLine ; i <= rcBounds.bottom; i += m_iGrid) { MoveToEx(hdc, rcBounds.left, i, NULL); LineTo(hdc, rcBounds.right, i); } SelectObject(hdc, oldPen); DeleteObject(redPen); } return S_OK; } Hat einer von Euch das als Delphi Source? Ich habe auch noch 2* Source und Demo in C gefunden: Einmal ![]() und ![]() Danke im Voraus Frank :coder: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Zusammen...
Vielleicht hat ja einer von Euch eine Idee, wie ich eine QueryService procedure in mein Form-Object implementiere. Das würde mir schon helfen. Frank :coder: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Hallo Frank,
meinst du das hier?
Delphi-Quellcode:
Grüße vom marabu
uses
{...} ActiveX; type TForm1 = class(TForm, IServiceProvider) public function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; end; |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Meine Test Unit:
Delphi-Quellcode:
Frank :wiejetzt:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw,ActiveX,MSHTML; type TForm1 = class(TForm,IServiceProvider) WebBrowser1: TWebBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); private { Private-Deklarationen } public { Public-Deklarationen } function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Webbrowser1.Navigate('http://www.delphipraxis.net'); end; function TForm1.QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall; begin Caption := 'Query'; // Wird nie Aufgerufen end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin (Webbrowser1.Document as IHTMLDocument2).designMode := 'on'; end; end. |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Vielleicht weil deine Form nicht der Host für die TWebBrowser-Komponente ist.
Nachtrag: wenn ich richtig gelesen habe, dann muss deine Form auch die Schnittstelle IOleClientSite implementieren, deren Methode QueryInterface verwendet wird um den ServiceProvider zu ermitteln. marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Frank |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Wenn ich jedoch IOleClientSite und IHTMLPainter und IHTMLBehavior und IHTMLBehaviorFactory in mein TForm include... :wall: :wiejetzt: Wie kann ich unterschiedliche QueryInterface declarieren? Frank :coder: :roteyes: :spin2: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Wieso denn "unterschiedliche" QueryInterface? Die Interfaces teilen sich doch eine Implementierung dieser Methode - oder verstehe ich dich falsch?
marabu |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Delphi-Quellcode:
und
STDMETHODIMP CHTMLEditControlSite::XHTMLEditHost::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLEditHost); return pThis->ExternalQueryInterface(&iid, ppvObj); }
Delphi-Quellcode:
und
STDMETHODIMP CHTMLEditControlSite::XHTMLElementBehaviorFactory::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLElementBehaviorFactory); *ppvObj = NULL; if (IsEqualIID(iid, IID_IElementBehaviorFactory)) { *ppvObj = (IUnknown *) this; return S_OK; } else if (IsEqualIID(iid, IID_IElementBehavior)) { *ppvObj = (IUnknown *) &pThis->m_xHTMLElementBehavior; return S_OK; } return E_NOTIMPL; }
Delphi-Quellcode:
Also drei Mal QueryInterface mit unterschiedlichen Auswirkungen...
STDMETHODIMP CHTMLEditControlSite::XHTMLPainter::QueryInterface(REFIID iid, LPVOID far* ppvObj)
{ METHOD_PROLOGUE(CHTMLEditControlSite, HTMLPainter); return pThis->ExternalQueryInterface(&iid, ppvObj); } Ich habe es jetzt so gelöst, da das ursprüngliche Obj kein Interface ist und ich keinen TypCast hingekiregt habe...
Delphi-Quellcode:
function TForm1.MyQuery(out Obj: IInterface): HRESULT;
begin Obj := Self as IHTMLPainter; Result := S_OK; end; function TForm1.MyQuery2(out Obj: IInterface): HRESULT; begin Obj := Self; Result := S_OK; end; function TForm1.MyQuery3(out Obj: IInterface): HRESULT; begin Obj := Self as IElementBehaviorFactory; Result := S_OK; end; function TForm1.MyQuery4(out Obj: IInterface): HRESULT; begin Obj := Self as IElementBehavior; Result := S_OK; end; function TForm1.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; begin Inherited QueryInterface(IID,Obj); if IsEqualGUID(IID,IID_IElementBehaviorFactory) then begin result := MyQuery3(IUnknown(Obj)); exit; end; if IsEqualGUID(IID,IID_IElementBehavior) then begin result := MyQuery4(IUnknown(Obj)); exit; end; if IsEqualGUID(IID, IID_IHTMLPainter) then begin result := MyQuery(IUnknown(Obj)); exit; end; if IsEqualGUID(IID, IID_IUnKnown) then begin result := MyQuery2(IUnknown(Obj)); exit; end; result := E_NOTIMPL; end; Ich habe ein Testprogramm mit EmbeddedWB! Diese Unit "schafft" es den QueryInterface zu erhalten. Bei mit kommt im Queryinterface immer nur ein TGUID = '{00000000-0000-0000-C000-000000000046}' einmal und sonst NIX! Frank :wall: :wall: |
Re: TWebbrowser Gridshow und Snap-to-grid CtoPas
Zitat:
Wolltest du es vielleicht so?
Delphi-Quellcode:
marabu
// ungetestet
function TForm1.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; begin Result := S_OK; if IsEqualGUID(IID, IID_IElementBehaviorFactory) then IInterface(Obj) := self as IElementBehaviorFactory else if IsEqualGUID(IID, IID_IElementBehavior) then IInterface(Obj) := self as IElementBehavior else if IsEqualGUID(IID, IID_IHTMLPainter) then IInterface(Obj) := self as IHTMLPainter else Result := inherited QueryInterface(IID, Obj); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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-2025 by Thomas Breitkreuz