-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHtmlControl.h
88 lines (78 loc) · 2.96 KB
/
HtmlControl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#pragma once
#include <atlbase.h>
#include <atlwin.h>
#include <atltypes.h>
#include <string>
#include <map>
extern CComModule _Module;
#define CONNECT_JS_CALL_HANDLER(name, func) ConnectHandler(L#name, (CallbackFunction)&func)
#define CONNECT_JS_CALL_SIMPLE_HANDLER(name, func) ConnectHandler(L#name, (CallbackFunction)&func, true)
/**
* A wrapper for html based dialogs
*/
class HtmlControl : public CWindowImpl<HtmlControl>, public DWebBrowserEvents2
{
public:
HtmlControl(BSTR start);
virtual ~HtmlControl() {}
int DoModal(HWND parent = NULL);
HRESULT CallJS(BSTR func, DISPPARAMS* params, VARIANT* retval);
private:
HWND parent;
CComBSTR startPagePath;
CAxWindow wndIE;
private: // IDispatch methods
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef(void) { return 1; }
ULONG STDMETHODCALLTYPE Release(void) { return 1; }
STDMETHOD(GetTypeInfoCount)(UINT*) { return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; }
protected: // IDispatch methods used for calls from JS
STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR *rgszNames, UINT, LCID, DISPID *rgDispId);
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID, LCID, WORD, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO*, UINT*);
private: // default JS event handlers
void OnShow(DISPPARAMS*, VARIANT*);
void OnClose(DISPPARAMS*, VARIANT*);
void OnSetTitle(DISPPARAMS*, VARIANT*);
void OnDragWindow(DISPPARAMS*, VARIANT*);
void OnResizeWindow(DISPPARAMS*, VARIANT*);
void OnMinimizeWindow(DISPPARAMS*, VARIANT*);
void OnToggleMaximizeNormalWindow(DISPPARAMS*, VARIANT*);
void OnSetOpacity(DISPPARAMS* params, VARIANT*);
bool isMaximized;
private: // window message handlers
int MessageLoop();
BEGIN_MSG_MAP(HtmlControl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_SIZING, OnSizing)
END_MSG_MAP()
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnKeyDown(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnSizing(UINT, WPARAM, LPARAM, BOOL&);
public: // visual effects
static const int CutSize = 0;
private:
void RemoveFrame();
void FitToHost();
public: // js calls
typedef void (HtmlControl::*CallbackFunction)(DISPPARAMS* params, VARIANT* retval);
typedef const char* (HtmlControl::*SimpleCallbackFunction)(int argc, const char** argv);
protected:
// simple callback is defined as char* func(int argc, char* argv[])
void ConnectHandler(BSTR name, CallbackFunction func, bool simple = false);
private:
DISPID NameId(BSTR name) const;
HRESULT Invoke(DISPID id, DISPPARAMS* params, VARIANT* retval);
char* InPlaceWToA(BSTR bstr) const;
struct JsCallHandler
{
DISPID id;
union { CallbackFunction normal; SimpleCallbackFunction simple; } callback;
bool simple;
};
static const DISPID BASE_DIPSPID = 100000;
typedef std::map<std::wstring, JsCallHandler> JsHandlers;
JsHandlers jsHandlers;
};