Forum | | | | Frank Tretter | Bin neu hier und das ist meine erste Frage. Ich wollte mir selber einen kleinen Browser basteln und habe auch schon viel im Netz dafür gefunden. Mein Programm benutzt IWebBrowser2.ph. Das Demo das als Beispiel dabei war läuft auch gut. Nun möchte ich aber das Menü erweitern und die Befehle wie Markieren, Kopieren einfügen.
Leider lässt das erzeugte Browserfenster auch nicht die Tastenkompination STRG+A zu. Hoffe es kann mir jemand helfen und zeigen wie man das Menü erweitert. Mit den Befehlen AppendMenuBar komm ich klar, aber nicht mit der Procedure CallMethod die im Demo benutzt wir.
Hier das Demo KompilierenMarkierenSeparieren $H c:XProfan 8.0INCLUDEWindows.ph
$H c:XProfan 8.0INCLUDEIWebBrowser2.ph
Declare a$, a&, a#, b#, Error&, ATLdll&, WebControl&, IUnknown&, IWebBrowser&
Dim a#,1024
Dim b#,256
Def CLSIDFromString(2) !ole32,CLSIDFromString
Def AtlAxWinInit(0) !atl.dll,AtlAxWinInit
Def AtlAxGetControl(2) !atl.dll,AtlAxGetControl
Proc CallMethod-----------------------------------------------Interface-Methoden aufrufen
Parameters IFace&,Method&
Declare VTable&
VTable&=long(IFace&,0)
Method&=long(VTable&,Method&*4)
case %pcount=2:return call( Method&,IFace& )
case %pcount=3:return call( Method&,IFace&,&(3) )
case %pcount=4:return call( Method&,IFace&,&(3),$(4) )
case %pcount=5:return call( Method&,IFace&,&(3),&(4),&(5) )
case %pcount=6:return call( Method&,IFace&,&(3),&(4),&(5),&(6) )
case %pcount=7:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7) )
case %pcount=8:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7),&(8) )
EndProc
proc WebOpen-------------------------------------------------------------Irgendwas öffnen
Parameters X$
~RedrawWindow(%hwnd,0,0,$485)
casenot len(x$):return
~MultiByteToWideChar(0,0,addr(x$),-1,a#,250)
clear b#
CallMethod(IWebbrowser&,~Navigate,a#,b#,b#,b#,b#)
EndProc
*****************************************************************************************
windowstyle 16+8+4+2+1
window 10,10-700,500
usermessages 16
ATLdll&=usedll(atl.dll)
AtlAxWinInit()
WebControl&=control(AtlAxWin,Shell.Explorer.1,$50000000,0,0,0,0,%hwnd,0,0,$200)
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
Werte von Error& und IUnknown& im Fehlerfall ausgeben lassen!
Error&=AtlAxGetControl(WebControl&,addr(IUnknown&))
IWebBrowser2-Interface ermöglicht Kontrolle über das WebControl
clear a#,b#
a$=~IID_IWebBrowser2
~MultiByteToWideChar(1,1,addr(a$),-1,a#,80)-------------ANSI zu WideChar
CLSIDFromString(a#,b#)----------------------------------String zu Interface-ID
Error&=CallMethod(IUnknown&,~QueryInterface,b#,addr(IWebBrowser&))
--damit es beim Start nicht so leer aussieht
CallMethod(IWebBrowser&,~GoHome)
--------------------------------------------------------------------FensterMenü
appendmenubar 101,Zurück
appendmenubar 102,Vorwärts
appendmenubar 103,Abbrechen
appendmenubar 104,Aktualisieren
appendmenubar 105,Startseite
appendmenubar 106,Suchen
appendmenubar 107,Datei öffnen
appendmenubar 108,Ordner öffnen
appendmenubar 109,URL öffnen
--------------------------------------------------------------------Eingabeschleife
while 1
if %key=4----------------------------------------------Grössenänderung des Fensters
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
elseif menuitem(101)-----------------------------------Zurück
CallMethod(IWebBrowser&,~GoBack)
elseif menuitem(102)-----------------------------------Vorwärts
CallMethod(IWebBrowser&,~GoForward)
elseif menuitem(103)-----------------------------------Abbrechen
CallMethod(IWebBrowser&,~Stop)
elseif menuitem(104)-----------------------------------Aktualisieren
CallMethod(IWebBrowser&,~Refresh)
elseif menuitem(105)-----------------------------------Startseite
CallMethod(IWebBrowser&,~GoHome)
elseif menuitem(106)-----------------------------------Suchen
CallMethod(IWebBrowser&,~GoSearch)
elseif menuitem(107)-----------------------------------Datei öffnen
a$=loadfile$(Bitte Bild oder HTML-Datei wählen,*.*)
WebOpen a$
elseif menuitem(108)-----------------------------------Ordner öffnen
a$=choosedir$(Bitte Ordner wählen)
WebOpen a$
elseif menuitem(109)-----------------------------------URL öffnen
a$=input$(Bitte Web-Adresse eingeben:,URL:,)
WebOpen a$
endif----------------------------------------------------------------------
while 1----------------------------Warten, bis Aktion ausgeführt ist
sleep 200
CallMethod(IWebBrowser&,~get_Busy,addr(a&))
casenot a&:break
endwhile------------------------------------------------------------
waitinput
case %umessage=16:break-----------Ende
endwhile-----------------------------------------------------------------Ende Eingabeschleife
destroywindow(WebControl&)
case ATLdll&:freedll ATLdll&
End
Gruß Fränki |
| | | Seit 2008 endlich XProfan 10, ist einfach klasse | 19.02.2007 ▲ |
| |
| | | Also zum Ersten solltest Du Deinen Quellcode auch mit KompilierenMarkierenSeparieren ummanteln (das ist in allen Foren üblich) - Codes mit Smilies drin wird sich keiner anschauen. Du kannst Dein Posting ja bearbeiten. Und dann wäre es noch hilfreich wenn Du die zusätzliche PH auch als DateiAnhang beifügst - denn diese gehört nicht zum XProfanumfang.
Wir wissen auch nicht welche XProfanversion Du nutzt (hast ja nix angegeben) - das könntest Du aber auch in Deine Signatur schreiben.
Die Bereiche a# und b# werden nicht disposed .
Bis denne.
@Admins: Ich finde diese Postingform kommt in letzter Zeit sehr oft vor - wir sollten vor dem Posten ein Vorstellungsgespräch führen - inform einer Erklärungsseite howTo Post. Ich werd das mal zusammenbasteln. |
| | | | |
| | | | | | | |
| | Frank Tretter | Sorry, kenne mich da noch nicht so aus. Ich habe XProfan 8. iwebbrowser2.ph wurde von Dir schon hier angezeigt, Danke.
Jetzt versuch ich das mit dem Code noch einmal. KompilierenMarkierenSeparieren $H c:XProfan 8.0INCLUDEWindows.ph
$H c:XProfan 8.0INCLUDEIWebBrowser2.ph
Declare a$, a&, a#, b#, Error&, ATLdll&, WebControl&, IUnknown&, IWebBrowser&
Dim a#,1024
Dim b#,256
Def CLSIDFromString(2) !ole32,CLSIDFromString
Def AtlAxWinInit(0) !atl.dll,AtlAxWinInit
Def AtlAxGetControl(2) !atl.dll,AtlAxGetControl
Proc CallMethod-----------------------------------------------Interface-Methoden aufrufen
Parameters IFace&,Method&
Declare VTable&
VTable&=long(IFace&,0)
Method&=long(VTable&,Method&*4)
case %pcount=2:return call( Method&,IFace& )
case %pcount=3:return call( Method&,IFace&,&(3) )
case %pcount=4:return call( Method&,IFace&,&(3),$(4) )
case %pcount=5:return call( Method&,IFace&,&(3),&(4),&(5) )
case %pcount=6:return call( Method&,IFace&,&(3),&(4),&(5),&(6) )
case %pcount=7:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7) )
case %pcount=8:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7),&(8) )
EndProc
proc WebOpen-------------------------------------------------------------Irgendwas öffnen
Parameters X$
~RedrawWindow(%hwnd,0,0,$485)
casenot len(x$):return
~MultiByteToWideChar(0,0,addr(x$),-1,a#,250)
clear b#
CallMethod(IWebbrowser&,~Navigate,a#,b#,b#,b#,b#)
EndProc
*****************************************************************************************
*****************************************************************************************
windowstyle 16+8+4+2+1
window 10,10-700,500
usermessages 16
ATLdll&=usedll(atl.dll)
AtlAxWinInit()
WebControl&=control(AtlAxWin,Shell.Explorer.1,$50000000,0,0,0,0,%hwnd,0,0,$200)
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
Werte von Error& und IUnknown& im Fehlerfall ausgeben lassen!
Error&=AtlAxGetControl(WebControl&,addr(IUnknown&))
IWebBrowser2-Interface ermöglicht Kontrolle über das WebControl
clear a#,b#
a$=~IID_IWebBrowser2
~MultiByteToWideChar(1,1,addr(a$),-1,a#,80)-------------ANSI zu WideChar
CLSIDFromString(a#,b#)----------------------------------String zu Interface-ID
Error&=CallMethod(IUnknown&,~QueryInterface,b#,addr(IWebBrowser&))
--damit es beim Start nicht so leer aussieht
CallMethod(IWebBrowser&,~GoHome)
--------------------------------------------------------------------FensterMenü
appendmenubar 101,Zurück
appendmenubar 102,Vorwärts
appendmenubar 103,Abbrechen
appendmenubar 104,Aktualisieren
appendmenubar 105,Startseite
appendmenubar 106,Suchen
appendmenubar 107,Datei öffnen
appendmenubar 108,Ordner öffnen
appendmenubar 109,URL öffnen
--------------------------------------------------------------------Eingabeschleife
while 1
if %key=4----------------------------------------------Grössenänderung des Fensters
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
elseif menuitem(101)-----------------------------------Zurück
CallMethod(IWebBrowser&,~GoBack)
elseif menuitem(102)-----------------------------------Vorwärts
CallMethod(IWebBrowser&,~GoForward)
elseif menuitem(103)-----------------------------------Abbrechen
CallMethod(IWebBrowser&,~Stop)
elseif menuitem(104)-----------------------------------Aktualisieren
CallMethod(IWebBrowser&,~Refresh)
elseif menuitem(105)-----------------------------------Startseite
CallMethod(IWebBrowser&,~GoHome)
elseif menuitem(106)-----------------------------------Suchen
CallMethod(IWebBrowser&,~GoSearch)
elseif menuitem(107)-----------------------------------Datei öffnen
a$=loadfile$(Bitte Bild oder HTML-Datei wählen,*.*)
WebOpen a$
elseif menuitem(108)-----------------------------------Ordner öffnen
a$=choosedir$(Bitte Ordner wählen)
WebOpen a$
elseif menuitem(109)-----------------------------------URL öffnen
a$=input$(Bitte Web-Adresse eingeben:,URL:,)
WebOpen a$
endif----------------------------------------------------------------------
while 1----------------------------Warten, bis Aktion ausgeführt ist
sleep 200
CallMethod(IWebBrowser&,~get_Busy,addr(a&))
casenot a&:break
endwhile------------------------------------------------------------
waitinput
case %umessage=16:break-----------Ende
endwhile-----------------------------------------------------------------Ende Eingabeschleife
destroywindow(WebControl&)
case ATLdll&:freedll ATLdll&
End
|
| | | Seit 2008 endlich XProfan 10, ist einfach klasse | 19.02.2007 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hallo Frank!
Das WebBrowser-Control wird komplett über sogenannte COM-Interfaces gesteuert; das gilt sogar für Clipboard-Aktionen. Mit Messages (wie bei Edits) ist da nichts zu machen; dafür muss sogar ein neues Interface aufgerufen werden. Diese Prozedur sollte helfen: KompilierenMarkierenSeparieren
proc CopyToClipBoard----------------------------------------------------------
declare IOleCommandTarget&,CLSID$
CLSID$={b722bccb-4e68-101b-a2bc-00aa00404770}--IID_IOleCommandTarget
~MultiByteToWideChar(1,1,addr(CLSID$),-1,a#,80)--ANSI zu WideChar
CLSIDFromString(a#,b#)---------------------------String zu Interface-ID
CallMethod(IWebBrowser&,~QueryInterface,b#,addr(IOleCommandTarget&))
CLSID$={de4ba900-59ca-11cf-9592-444553540000}--CGID_MSHTML (Kommandomodus)
~MultiByteToWideChar(1,1,addr(CLSID$),-1,a#,80)--ANSI zu WideChar
CLSIDFromString(a#,b#)---------------------------String zu Interface-ID
CallMethod(IOleCommandTarget&,4,b#,15,0,0,0)-----Exec : IDM_COPY
CallMethod(IOleCommandTarget&,~Release)----------Interface freigeben
endproc-----------------------------------------------------------------------
Eine Routine zum Markieren reiche ich noch nach!
@ iF: Bist du sicher, dass DISPOSE am Programmende so wichig ist?
HTH Pascal |
| | | | |
| | RGH | Uwe Pascal Niemeier
@ iF: Bist du sicher, dass DISPOSE am Programmende so wichig ist?
Bei Win9x (dazu gehört auch Win ME) grundsätzlich ja, da sonst der Speicher oiftmals nicht vor dem nächsten Neustart freigegeben wird. Win2000/XP/Vista regelt das Betriebssystem bei Programmende die Freigabe in aller Regel nötigenfalls selbst.
Trotz allem sollte man sich angewöhnen mit DIM reservierten Speicher grundsätzlich durch DISPOSE wieder freizugeben. Sollte man dieses z.B. mal in einer Prozedur vergessen, hat man sehr schnell Probleme ...
Gruß Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 20.02.2007 ▲ |
| |
| | Frank Tretter | Vielen Dank erstmal für die schnelle Hilfe. Das bringt mich schon weiter. Wenn ich dann noch die Routine für das Markiern bekomm bin ich Glücklich und es hat mir sehr geholfen.
Kann leider nicht immer gleich antworten, bin nicht immer am PC und zum Programmieren fehlt als die Zeit.
Gruß Fränki |
| | | Seit 2008 endlich XProfan 10, ist einfach klasse | 21.02.2007 ▲ |
| |
|
AntwortenThemenoptionen | 3.817 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |