感动的事开头怎么写:我的浏览器-浏览器接口
来源:百度文库 编辑:偶看新闻 时间:2024/04/30 11:02:27
原文::http://chaolihf.spaces.live.com/Blog/cns!86CFF65E5D2AB570!156.entry
我的浏览器-浏览器接口(4)
为了扩展浏览器的功能,往往需要实现以下的接口,这些接口的定义可以参考MSDN,TLB文件可以从http://www.mvps.org/emorcillo/en/index.shtml里面下载,这个网址也是开发我的浏览器很重要的一个参考网站。LExtendDefine是自己写的扩展,首先写一个ODL,然后用VC带的MKTYPLIB.EXE程序编译生成TLB文件即可。ISubClass是www.vbaccelerator.com中大多数控件都使用的一个实现子类的一个接口,这个网站给出了很多实现控件的方法,我的浏览器重写了几乎所有的Windows标准控件,都是基于ISubClass,但对此进行了修改已方便操作。说一句题外话为什么要重写这个控件呢,为什么不使用Window Common Dialog里面提供的控件呢,原因有二: 一是这些控件的方法不全,难以符合XP等新系统界面和功能方面的要求,而且控件也相对较少;二是这些控件会使VB应用程序无法释放内存。如果你在窗口中放入这些控件,正常情况下最小化窗口时进程会释放掉一部分运行时内存,但加入后就不能释放,这个算是VB的一个Bug。Implements IOleClientSite '将WbBrowser中的Document窗口作为当前Form的客户端,并使其通过此接口通知当前FormImplements olelib2.IOleInPlaceSite '容器接口
Implements olelib.IDocHostUIHandler 'Document文档中的界面接口,处理与用户交互方面的问题
Implements olelib.IDocHostShowUI '实现对Help和MessageBox的接口
Implements olelib2.IServiceProvider '实现服务提供接口
Implements olelib.IInternetSecurityManager
Implements olelib2.IOleCommandTarget
Implements IOleWindow
Implements IInputObjectSite
Implements LExtendDefine.IDownloadManager
Implements LExtendDefine.INewWindowManager
Implements ISubclass下面是关联接口的代码Private Sub ImplementSite()
Dim tMSG As olelib.MSG
Dim tRECT As olelib.RECT
Dim objOleObject As IOleObject
Dim objOleControl As IOleControl
Dim objOleWindow As IOleWindow
On Error GoTo ErrProc
m_strBrowserAgent = cBI.BrowserTag
olelib.CLSIDFromString IID_IWebBrowser2, udtIWebBrowser2UUID
olelib.CLSIDFromString IID_IUnknown, udtIUnknown
CoInternetCreateZoneManager Nothing, m_objOZM, 0
Me.ScaleMode = vbPixels
Set objOleObject = Me.wbBrowser.Object
Set objOleWindow = objOleObject.GetClientSite
objOleObject.DoVerb OLEIVERB_HIDE, tMSG, objOleWindow, 0, 0, tRECT
m_lngDocumentHwnd = GetWindow(objOleWindow.GetWindow, GW_CHILD)
m_OleWindow = m_lngDocumentHwnd
SetParent m_lngDocumentHwnd, Me.hwnd
objOleObject.SetClientSite Me
objOleObject.DoVerb OLEIVERB_INPLACEACTIVATE, tMSG, Me, 0, Me.hwnd, tRECT
p_GlobalLF.SetFocusWindow m_lngDocumentHwnd
Set objOleControl = objOleObject
If m_strBrowserAgent <> "" Then
objOleControl.OnAmbientPropertyChange DISPID_AMBIENT_USERAGENT
End If
objOleControl.OnAmbientPropertyChange DISPID_AMBIENT_DLCONTROL
Exit Sub
ErrProc:
Debug.Print "Err:ImplementSite:" & Err.Description
End Sub
下面给出这些接口的一些实现代码Private Function IDocHostShowUI_ShowMessage(ByVal hwnd As Long, ByVal lpszText As Long, ByVal lpszCaption As Long, ByVal dwType As Long, ByVal lpszHelpFile As Long, ByVal dwHelpContext As Long) As Long
'此接口只可以实现对window.alert方法进行控制,对prompt毫无用处
If bolIsInRecycle Then
IDocHostShowUI_ShowMessage = S_FALSE
Else
If Timer - m_PreDisableActiveXTime < 1 Then
m_PreDisableActiveXTime = m_PreDisableActiveXTime - 2
IDocHostShowUI_ShowMessage = S_FALSE
Else
If GetAsyncKeyState(vbKeyControl) <> 0 Or bolClosing Then
If Not bolClosing Then
If Index = GetActiveBrowser Then
Call StatusChange(LoadResourceString(STRING_RESOURCE_58) & olelib.SysAllocString(lpszText))
End If
End If
IDocHostShowUI_ShowMessage = S_FALSE
Else
Err.Raise E_NOTIMPL
End If
End If
End If
End FunctionPrivate Sub IDocHostUIHandler_EnableModeless(ByVal fEnable As olelib.BOOL)
'ms-help://MS.MSDNQTR.2003APR.1033/DHTML/workshop/samples/author/dhtml/refs/showModalDialog.htm
If fEnable And m_bolOpenMenu Then
m_PreOperateTime = Timer
m_bolOpenMenu = False
If cBI.ContentFilter Then
mdiMainView.InstallFilter False, False
End If
End If
Err.Raise E_NOTIMPL
End SubPrivate Function IDocHostUIHandler_FilterDataObject(ByVal pDO As olelib.IDataObject) As olelib.IDataObject
Err.Raise E_NOTIMPL
End FunctionPrivate Function IDocHostUIHandler_GetDropTarget(ByVal pDropTarget As olelib.IDropTarget) As olelib.IDropTarget
'这里给出一个非常奇怪的例子,如果去除以下代码的第二行就可以拖放A,否则不可以,原网址为第二行
'
'
'
'目录