📄 webbrowser.c
字号:
InPlace_OnUIDeactivate,
InPlace_OnInPlaceDeactivate,
InPlace_DiscardUndoState,
InPlace_DeactivateAndUndo,
InPlace_OnPosRectChange
};
static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
{
return E_NOTIMPL;
}
static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
{
return 1;
}
static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
{
return 2;
}
static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
{
ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface);
*lphwnd = This->hwndWindow;
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
{
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
{
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
{
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
{
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
{
return E_NOTIMPL;
}
static const IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable =
{
Frame_QueryInterface,
Frame_AddRef,
Frame_Release,
Frame_GetWindow,
Frame_ContextSensitiveHelp,
Frame_GetBorder,
Frame_RequestBorderSpace,
Frame_SetBorderSpace,
Frame_SetActiveObject,
Frame_InsertMenus,
Frame_SetMenu,
Frame_RemoveMenus,
Frame_SetStatusText,
Frame_EnableModeless,
Frame_TranslateAccelerator
};
static HRESULT STDMETHODCALLTYPE Storage_QueryInterface(IStorage *This, REFIID riid, LPVOID *ppvObj)
{
return E_NOTIMPL;
}
static ULONG STDMETHODCALLTYPE Storage_AddRef(IStorage *This)
{
return 1;
}
static ULONG STDMETHODCALLTYPE Storage_Release(IStorage *This)
{
return 2;
}
static HRESULT STDMETHODCALLTYPE Storage_CreateStream(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_OpenStream(IStorage *This, const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_CreateStorage(IStorage *This, const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_OpenStorage(IStorage *This, const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_CopyTo(IStorage *This, DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_MoveElementTo(IStorage *This, const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_Commit(IStorage *This, DWORD grfCommitFlags)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_Revert(IStorage *This)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_EnumElements(IStorage *This, DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_DestroyElement(IStorage *This, const OLECHAR *pwcsName)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_RenameElement(IStorage *This, const WCHAR *pwcsOldName, const WCHAR *pwcsNewName)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_SetElementTimes(IStorage *This, const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_SetClass(IStorage *This, REFCLSID clsid)
{
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Storage_SetStateBits(IStorage *This, DWORD grfStateBits, DWORD grfMask)
{
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Storage_Stat(IStorage *This, STATSTG *pstatstg, DWORD grfStatFlag)
{
return E_NOTIMPL;
}
static const IStorageVtbl MyIStorageTable =
{
Storage_QueryInterface,
Storage_AddRef,
Storage_Release,
Storage_CreateStream,
Storage_OpenStream,
Storage_CreateStorage,
Storage_OpenStorage,
Storage_CopyTo,
Storage_MoveElementTo,
Storage_Commit,
Storage_Revert,
Storage_EnumElements,
Storage_DestroyElement,
Storage_RenameElement,
Storage_SetElementTimes,
Storage_SetClass,
Storage_SetStateBits,
Storage_Stat
};
static IStorage MyIStorage = { &MyIStorageTable };
BOOL InitWebBrowser(HHInfo *info, HWND hwndParent)
{
IOleClientSiteImpl *iOleClientSiteImpl;
IOleInPlaceObject *inplace;
IOleObject *browserObject;
IWebBrowser2 *webBrowser2;
HRESULT hr;
RECT rc;
iOleClientSiteImpl = hhctrl_alloc_zero(sizeof(IOleClientSiteImpl));
if (!iOleClientSiteImpl)
return FALSE;
iOleClientSiteImpl->ref = 1;
iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable;
iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable;
iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable;
iOleClientSiteImpl->hwndWindow = hwndParent;
iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable;
hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
(IOleClientSite *)iOleClientSiteImpl, &MyIStorage,
(void **)&browserObject);
info->client_site = (IOleClientSite *)iOleClientSiteImpl;
info->wb_object = browserObject;
if (FAILED(hr)) goto error;
/* make the browser object accessible to the IOleClientSite implementation */
iOleClientSiteImpl->pBrowserObject = browserObject;
GetClientRect(hwndParent, &rc);
hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE);
if (FAILED(hr)) goto error;
hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
(IOleClientSite *)iOleClientSiteImpl,
-1, hwndParent, &rc);
if (FAILED(hr)) goto error;
hr = IOleObject_QueryInterface(browserObject, &IID_IOleInPlaceObject, (void**)&inplace);
if (FAILED(hr)) goto error;
IOleInPlaceObject_SetObjectRects(inplace, &rc, &rc);
IOleInPlaceObject_Release(inplace);
hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2,
(void **)&webBrowser2);
if (SUCCEEDED(hr))
{
info->web_browser = webBrowser2;
return TRUE;
}
error:
ReleaseWebBrowser(info);
hhctrl_free(iOleClientSiteImpl);
return FALSE;
}
void ReleaseWebBrowser(HHInfo *info)
{
HRESULT hres;
if (info->web_browser)
{
IWebBrowser2_Release(info->web_browser);
info->web_browser = NULL;
}
if (info->client_site)
{
IOleClientSite_Release(info->client_site);
info->client_site = NULL;
}
if(info->wb_object) {
IOleInPlaceSite *inplace;
hres = IOleObject_QueryInterface(info->wb_object, &IID_IOleInPlaceSite, (void**)&inplace);
if(SUCCEEDED(hres)) {
IOleInPlaceSite_OnInPlaceDeactivate(inplace);
IOleInPlaceSite_Release(inplace);
}
IOleObject_SetClientSite(info->wb_object, NULL);
IOleObject_Release(info->wb_object);
info->wb_object = NULL;
}
}
void ResizeWebBrowser(HHInfo *info, DWORD dwWidth, DWORD dwHeight)
{
if (!info->web_browser)
return;
IWebBrowser2_put_Width(info->web_browser, dwWidth);
IWebBrowser2_put_Height(info->web_browser, dwHeight);
}
void DoPageAction(HHInfo *info, DWORD dwAction)
{
IWebBrowser2 *pWebBrowser2 = info->web_browser;
if (!pWebBrowser2)
return;
switch (dwAction)
{
case WB_GOBACK:
IWebBrowser2_GoBack(pWebBrowser2);
break;
case WB_GOFORWARD:
IWebBrowser2_GoForward(pWebBrowser2);
break;
case WB_GOHOME:
IWebBrowser2_GoHome(pWebBrowser2);
break;
case WB_SEARCH:
IWebBrowser2_GoSearch(pWebBrowser2);
break;
case WB_REFRESH:
IWebBrowser2_Refresh(pWebBrowser2);
case WB_STOP:
IWebBrowser2_Stop(pWebBrowser2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -