📄 webchild.h
字号:
void goto_url(LPCTSTR url);
void set_html_page(const String& html_txt);
void navigated(LPCTSTR url);
IWebBrowser* get_browser() {return _browser.get();}
protected:
SIfacePtr<IWebBrowser> _browser;
String _new_url;
String _new_html_txt;
bool _browser_initialized;
};
// MinGW defines a wrong FixedDWebBrowserEvents2 interface with virtual functions for DISPID calls, so we use our own, corrected version:
interface FixedDWebBrowserEvents2 : public IDispatch
{
#ifdef __GNUC__
virtual ~FixedDWebBrowserEvents2() {}
#endif
};
struct ANSUNC DWebBrowserEvents2Impl
: public IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl>, public SimpleComObject,
public DWebBrowserEvents2IF
{
typedef IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl> super;
DWebBrowserEvents2IF* _callback;
DWebBrowserEvents2Impl(BrowserNavigator& navigator)
: super(DIID_DWebBrowserEvents2),
_navigator(navigator)
{
_callback = this;
}
/* // IUnknown
STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (SUCCEEDED(super::QueryInterface(riid, ppv)))
return S_OK;
return E_NOINTERFACE;
} */
// IDispatch
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
{return E_NOTIMPL;}
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)
{return E_NOTIMPL;}
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
{return E_NOTIMPL;}
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr)
{
switch(dispIdMember) {
case DISPID_STATUSTEXTCHANGE:
_callback->StatusTextChange((BStr)Variant(pDispParams->rgvarg[0]));
break;
case DISPID_COMMANDSTATECHANGE:
_callback->CommandStateChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
break;
case DISPID_DOWNLOADBEGIN:
_callback->DownloadBegin();
break;
case DISPID_PROGRESSCHANGE: // sent when download progress is updated
_callback->ProgressChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWMOVE: // sent when main window has been moved
_callback->WindowMove();
break;
case DISPID_WINDOWRESIZE: // sent when main window has been sized
_callback->WindowResize();
break;
case DISPID_WINDOWACTIVATE: // sent when main window has been activated
_callback->WindowActivate();
break;
case DISPID_PROPERTYCHANGE: // sent when the PutProperty method is called
_callback->PropertyChange((BStr)Variant(pDispParams->rgvarg[0]));
break;
case DISPID_TITLECHANGE: // sent when the document title changes
_callback->TitleChange((BStr)Variant(pDispParams->rgvarg[0]));
break;
case DISPID_TITLEICONCHANGE: // sent when the top level window icon may have changed.
_callback->TitleIconChange((BStr)Variant(pDispParams->rgvarg[0]));
break;
// anything below here is not present in DWebBrowserEvents, only in DWebBrowserEvents2: ->
case DISPID_FRAMEBEFORENAVIGATE:
if (pDispParams->cArgs != 6)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
_callback->FrameBeforeNavigate(
(BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
(BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
(BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_FRAMENAVIGATECOMPLETE:
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->FrameNavigateComplete((BStr)Variant(pDispParams->rgvarg[0]));
break;
case DISPID_FRAMENEWWINDOW:
if (pDispParams->cArgs != 6)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
_callback->FrameNewWindow((BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
(BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
(BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_BEFORENAVIGATE2: // hyperlink clicked on
if (pDispParams->cArgs != 7)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
_callback->BeforeNavigate2(Variant(pDispParams->rgvarg[6]),
pDispParams->rgvarg[5], &pDispParams->rgvarg[4],
pDispParams->rgvarg[3], &pDispParams->rgvarg[2],
pDispParams->rgvarg[1], *V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_NEWWINDOW2: // sent when a new window should be created
if (pDispParams->cArgs != 2)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[1]) != (VT_DISPATCH|VT_BYREF))
return E_INVALIDARG;
_callback->NewWindow2(V_DISPATCHREF(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_NAVIGATECOMPLETE2:// UIActivate new document
if (pDispParams->cArgs != 2)
return E_INVALIDARG;
// notify the navigator
NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
_callback->NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONQUIT:
_callback->OnQuit();
break;
case DISPID_ONVISIBLE: // sent when the window goes visible/hidden
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnVisible(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONTOOLBAR: // sent when the toolbar should be shown/hidden
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnToolbar(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONMENUBAR: // sent when the menubar should be shown/hidden
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnMenubar(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONSTATUSBAR: // sent when the statusbar should be shown/hidden
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnStatusbar(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONFULLSCREEN: // sent when kiosk mode should be on/off
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnFullscreen(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_DOCUMENTCOMPLETE:// new document goes ReadyState_Complete
_callback->DocumentComplete();
break;
case DISPID_DOWNLOADCOMPLETE:
_callback->DownloadComplete();
break;
case DISPID_ONTHEATERMODE: // sent when theater mode should be on/off
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnTheatermode(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_ONADDRESSBAR: // sent when the address bar should be shown/hidden
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->OnAddressbar(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWSETRESIZABLE:// sent to set the style of the host window frame
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->WindowSetResizable(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWCLOSING: // sent before script window.close closes the window
if (pDispParams->cArgs != 2)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
_callback->WindowClosing(Variant(pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWSETLEFT: // sent when the put_left method is called on the WebOC
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->WindowSetLeft(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWSETTOP: // sent when the put_top method is called on the WebOC
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->WindowSetTop(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWSETWIDTH: // sent when the put_width method is called on the WebOC
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->WindowSetWidth(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_WINDOWSETHEIGHT: // sent when the put_height method is called on the WebOC
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->WindowSetHeight(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_CLIENTTOHOSTWINDOW:// sent during window.open to request conversion of dimensions
{
long cx, cy;
if (pDispParams->cArgs != 2)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_I4|VT_BYREF))
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[1]) != (VT_I4|VT_BYREF))
return E_INVALIDARG;
cx = *V_I4REF(&pDispParams->rgvarg[1]);
cy = *V_I4REF(&pDispParams->rgvarg[0]);
_callback->ClientToHostWindow(cx, cy);
break;
}
case DISPID_SETSECURELOCKICON:// sent to suggest the appropriate security icon to show
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->SetSecureLockIcon(Variant(pDispParams->rgvarg[0]));
break;
case DISPID_FILEDOWNLOAD: { // Fired to indicate the File Download dialog is opening
if (pDispParams->cArgs != 1) //@@ every time 2 ?!
return E_INVALIDARG;
Variant var(pDispParams->rgvarg[0]);
_callback->FileDownload(var);}
break;
case DISPID_NAVIGATEERROR: // Fired to indicate the a binding error has occured
if (pDispParams->cArgs != 5)
return E_INVALIDARG;
if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
return E_INVALIDARG;
_callback->NavigateError(Variant(pDispParams->rgvarg[4]), Variant(pDispParams->rgvarg[3]),
Variant(pDispParams->rgvarg[2]), Variant(pDispParams->rgvarg[1]),
*V_BOOLREF(&pDispParams->rgvarg[0]));
break;
case DISPID_PRIVACYIMPACTEDSTATECHANGE:// Fired when the user's browsing experience is impacted
if (pDispParams->cArgs != 1)
return E_INVALIDARG;
_callback->PrivacyImpactedStateChange(Variant(pDispParams->rgvarg[0]));
break;
default:
return NOERROR;
}
return S_OK;
}
protected:
BrowserNavigator& _navigator;
void NavigateComplete2(IDispatch* pDisp, const Variant& url)
{
String adr = (BStr)url;
_navigator.navigated(adr);
}
};
/// encapsulation of Web control in MDI child windows
struct WebChildWindow : public IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> >,
public DWebBrowserEvents2Impl
{
typedef IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> > super;
typedef DWebBrowserEvents2Impl web_super;
WebChildWindow(HWND hwnd, const WebChildWndInfo& info);
static WebChildWindow* create(const FileChildWndInfo& info)
{
ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
WINDOW_CREATOR_INFO(WebChildWindow,WebChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0);
return static_cast<WebChildWindow*>(child);
}
// DWebBrowserEvents2Impl overides ->
void BeforeNavigate2(IDispatch* pDisp, const Variant& url, const Variant& flags,
const Variant& targetFrameName, const Variant& postData,
const Variant& headers, VARIANT_BOOL& cancel)
{
//String adr = (BStr)url;
}
void NavigateComplete2(IDispatch* pDisp, const Variant& url)
{
web_super::NavigateComplete2(pDisp, url);
set_url(String(BStr(url)));
}
void StatusTextChange(const BStr& text)
{
_statusText = text;
SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str());
}
void ProgressChange(long Progress, long ProgressMax)
{
}
void WindowMove()
{
}
void WindowResize()
{
}
void WindowActivate()
{
}
void PropertyChange(const BStr& Property)
{
Variant value;
_control->GetProperty(Property, &value);
}
void CommandStateChange(long command/*CSC_NAVIGATEFORWARD, CSC_NAVIGATEBACK*/, bool enable)
{
}
void DownloadBegin()
{
}
void NewWindow2(IDispatch** ppDisp, VARIANT_BOOL& cancel)
{
//*ppDisp = ;
//cancel = TRUE;
}
void TitleChange(const BStr& text)
{
SetWindowText(_hwnd, String(text));
}
void TitleIconChange(const BStr& text)
{
}
void FrameBeforeNavigate(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& cancel)
{
}
void FrameNavigateComplete(const BStr& url)
{
}
void FrameNewWindow(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& processed)
{
}
void OnQuit()
{
}
void OnVisible(bool Visible)
{
}
void OnToolbar(bool Visible)
{
}
void OnMenubar(bool Visible)
{
}
void OnStatusbar(bool Visible)
{
}
void OnFullscreen(bool Visible)
{
}
void DocumentComplete()
{
}
void OnTheatermode(bool Visible)
{
}
void OnAddressbar(bool Visible)
{
}
void WindowSetResizable(bool Visible)
{
}
void WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL& cancel)
{
}
void WindowSetLeft(long Left)
{
}
void WindowSetTop(long Top)
{
}
void WindowSetWidth(long Width)
{
}
void WindowSetHeight(long Height)
{
}
void ClientToHostWindow(long& CX, long& CY)
{
}
void SetSecureLockIcon(long SecureLockIcon)
{
}
void FileDownload(Variant& cancel)
{
}
void NavigateError(IDispatch* pDisp, const Variant& url, const Variant& Frame, const Variant& StatusCode, VARIANT_BOOL& cancel)
{
}
void PrivacyImpactedStateChange(bool bImpacted)
{
}
protected:
BrowserNavigator _navigator;
auto_ptr<EventConnector> _connector;
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
virtual String jump_to_int(LPCTSTR url);
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -