WebBrowser bileşeninin üzerine çizmek için bir şey çizmek veya koymak mümkün mü?
WebBrowser'a bir görüntü eklediğimde, bu görüntü her zaman WebBrowser'ın altındadır. Farklı harita türleri üzerinde, her zaman aynı şekilde alan çizmek için buna ihtiyacım var. Örneğin, Google Haritalar'da aynı alanı çizmem ve sokak haritalarını açmam gerekiyor ...Delphi'de WebBrowser bileşeni üzerinden bir şey çizmek için nasıl kullanılır?
6
A
cevap
6
Bunu yapmak için IHTMLPainter.Draw
olay yöntemini kullanmalısınız. Aşağıdaki kod, OnDocumentComplete
olay işleyicisini yazmanız gereken bir TWebBrowser
'a gereksinim duyar.
Bu örnekte büyük bir zayıflık olduğunu unutmayın, kullanıcı fare tıklaması gibi olayları etkinleştirir çünkü bu örnekteki tek şey öğenin üzerine resimdir. Bununla biraz oynamıştım, ama başarılı olamadım. Bu başka bir soru için iyi bir konu olabilir.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, SHDocVw, MSHTML, OleCtrls;
type
TElementBehavior = class(TInterfacedObject, IElementBehavior, IHTMLPainter)
private
FPaintSite: IHTMLPaintSite;
public
{ IElementBehavior }
function Init(const pBehaviorSite: IElementBehaviorSite): HRESULT; stdcall;
function Notify(lEvent: Integer; var pVar: OleVariant): HRESULT; stdcall;
function Detach: HRESULT; stdcall;
{ IHTMLPainter }
function Draw(rcBounds: tagRECT; rcUpdate: tagRECT; lDrawFlags: Integer;
hdc: hdc; pvDrawObject: Pointer): HRESULT; stdcall;
function OnResize(size: tagSIZE): HRESULT; stdcall;
function GetPainterInfo(out pInfo: _HTML_PAINTER_INFO): HRESULT; stdcall;
function HitTestPoint(pt: tagPOINT; out pbHit: Integer; out plPartID: Integer): HRESULT; stdcall;
end;
TElementBehaviorFactory = class(TInterfacedObject, IElementBehaviorFactory)
public
function FindBehavior(const bstrBehavior: WideString;
const bstrBehaviorUrl: WideString; const pSite: IElementBehaviorSite;
out ppBehavior: IElementBehavior): HRESULT; stdcall;
end;
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Image: TBitmap;
Behavior: TElementBehavior;
Factory: TElementBehaviorFactory;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Image := TBitmap.Create;
Image.LoadFromFile('c:\yourpicture.bmp');
WebBrowser1.Navigate('maps.google.com');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Behavior := nil;
Factory := nil;
Image.Free;
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
HTMLElement: IHTMLElement2;
FactoryVariant: OleVariant;
begin
HTMLElement := (WebBrowser1.Document as IHTMLDocument3).getElementById('map') as IHTMLElement2;
if Assigned(HTMLElement) then
begin
Behavior := TElementBehavior.Create;
Factory := TElementBehaviorFactory.Create;
FactoryVariant := IElementBehaviorFactory(Factory);
HTMLElement.addBehavior('', FactoryVariant);
end;
end;
function TElementBehaviorFactory.FindBehavior(const bstrBehavior,
bstrBehaviorUrl: WideString; const pSite: IElementBehaviorSite;
out ppBehavior: IElementBehavior): HRESULT;
begin
ppBehavior := Behavior;
Result := S_OK;
end;
function TElementBehavior.Draw(rcBounds: tagRECT; rcUpdate: tagRECT; lDrawFlags: Integer;
hdc: hdc; pvDrawObject: Pointer): HRESULT;
begin
StretchBlt(
hdc,
rcBounds.Left,
rcBounds.Top,
rcBounds.Right - rcBounds.Left,
rcBounds.Bottom - rcBounds.Top,
Image.Canvas.Handle,
0,
0,
Image.Canvas.ClipRect.Right - Image.Canvas.ClipRect.Left,
Image.Canvas.ClipRect.Bottom - Image.Canvas.ClipRect.Top,
SRCCOPY);
Result := S_OK;
end;
function TElementBehavior.GetPainterInfo(out pInfo: _HTML_PAINTER_INFO): HRESULT;
begin
pInfo.lFlags := HTMLPAINTER_OPAQUE;
pInfo.lZOrder := HTMLPAINT_ZORDER_WINDOW_TOP;
FillChar(pInfo.rcExpand, SizeOf(TRect), 0);
Result := S_OK;
end;
function TElementBehavior.HitTestPoint(pt: tagPOINT; out pbHit,
plPartID: Integer): HRESULT;
begin
Result := E_NOTIMPL;
end;
function TElementBehavior.OnResize(size: tagSIZE): HRESULT;
begin
Result := S_OK;
end;
function TElementBehavior.Detach: HRESULT;
begin
if Assigned(FPaintSite) then
FPaintSite.InvalidateRect(nil);
Result := S_OK;
end;
function TElementBehavior.Init(
const pBehaviorSite: IElementBehaviorSite): HRESULT;
begin
Result := pBehaviorSite.QueryInterface(IHTMLPaintSite, FPaintSite);
if Assigned(FPaintSite) then
FPaintSite.InvalidateRect(nil);
end;
function TElementBehavior.Notify(lEvent: Integer;
var pVar: OleVariant): HRESULT;
begin
Result := E_NOTIMPL;
end;
end.
İlgili konular
- 1. Konsol Uygulamasında WebBrowser Denetimi Nasıl Kullanılır?
- 2. matplotlib çizmek hiçbir şey göstermiyor
- 3. WebBrowser denetimi nasıl kullanılır DocumentCompleted olayı C#?
- 4. WebBrowser
- 5. Nasıl yuvarlatılmış bir dikdörtgen çizmek için C#
- 6. Gezinme ve WebBrowser denetimi
- 7. Çizim (grafik) bileşeni için öneriler?
- 8. libgdx'te bir dokuya çizmek için bir piksoma nasıl çevrilir?
- 9. vim + iterm: HARİCİ SEÇİM seçiminde her şey için nasıl kullanılır?
- 10. Nasıl matplotlib Axes örneği çizmek için?
- 11. Android'de SOCKS proxy üzerinden HttpURLConnection nasıl kullanılır
- 12. Bir etkinliği güncellemek için nasıl kullanılır?
- 13. Bir haritayı çizmek için xlim ve ylim'i nasıl kullanırız?
- 14. bir yüzeye bir android.media.Image çizmek
- 15. iOS - Bir daire çizmek için CAShapeLayer
- 16. WebBrowser içeriği
- 17. Tablo bileşeni ile Bootstrap 3 ızgara sistemi nasıl kullanılır?
- 18. WebBrowser ajax içeriğinin beklenmesi
- 19. Winform webbrowser reCAPTCHA,
- 20. Tablo çizmek için jQuery'yi kullanın
- 21. nasıl bir tuval bağlamında kesikli çizgi çizmek için HTML bağlamda
- 22. Vaadin için Liste/Tekrarlayıcı bileşeni
- 23. Tuvale dayalı Angular2 bileşeni: İçerisinde nasıl çizilir?
- 24. C# webBrowser denetiminde bir Javascript işlevi çağırma
- 25. Birden çok pasta çizmek için chart.js komut dosyası nasıl kullanılır? Grafikler
- 26. Bir Yazılım Bileşeni
- 27. Bir MelonJS oyunu çalıştırmak için VueJS bileşeni
- 28. WebBrowser Denetiminde bir Giriş Etiketi Ayarının Değeri
- 29. Bir Bitmap Nasıl Bildirim Simgesi Olarak Kullanılır
- 30. Bileşeni
Olaylar hakkında; bir geçici çözüm olarak 'map' elemanını gizlemek için' map' container'ını gizleyebilir ve davranışın gösterileceği yer üzerinde çizim yapmasını sağlayabilirsiniz, bu yüzden eğer satır eklerseniz (HTMLElement as IHTMLElement) .style.visibility: = 'hidden'; 'a atanmışsa (HTMLElement) o zaman deyim bloğu o zaman fare olayı zayıflığını çözebilir (kirli yol :) – TLama
Belki de öğenin arka plan resmini doğrudan stilde değiştirmek mümkündür, ancak [IHTMLPainter'ı kullanarak. Draw] (http://msdn.microsoft.com/en-us/library/aa769116%28v=vs.85%29.aspx) doğru bir yaklaşımdır. – TLama
thx, çok yardımcı oldu :) – Michal