source: trunk/Utilities/Miscellaneous/DispEventSample03/MainDialog.h @ 937

Last change on this file since 937 was 384, checked in by roman, 9 years ago
File size: 7.2 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2009
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: MainDlg.h 304 2012-01-10 06:18:54Z alax $
6
7#pragma once
8
9#pragma warning(disable: 4192)
10#pragma warning(disable: 4278)
11#import "libid:EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B" rename_namespace("IE") raw_interfaces_only raw_dispinterfaces
12#pragma warning(default: 4192)
13#pragma warning(default: 4278)
14
15#include <atlcrack.h>
16#include <atlmisc.h>
17
18////////////////////////////////////////////////////////////
19// CMainDialog
20
21class CMainDialog : 
22        public CAxDialogImpl<CMainDialog>,
23        public CDialogResize<CMainDialog>,
24        //public IDispEventImpl<IDC_EXPLORER1, CMainDialog, &__uuidof(IE::DWebBrowserEvents2), &__uuidof(IE::__SHDocVw), 1, 0>,
25        //public IDispEventImpl<IDC_EXPLORER2, CMainDialog, &__uuidof(IE::DWebBrowserEvents2), &__uuidof(IE::__SHDocVw), 1, 0>
26        public IDispEventImpl<IDC_EXPLORER1, CMainDialog, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
27        public IDispEventImpl<IDC_EXPLORER2, CMainDialog, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
28{
29public:
30        enum { IDD = IDD_MAIN };
31
32BEGIN_MSG_MAP_EX(CMainDialog)
33        CHAIN_MSG_MAP(CAxDialogImpl<CMainDialog>)
34        CHAIN_MSG_MAP(CDialogResize<CMainDialog>)
35        MSG_WM_INITDIALOG(OnInitDialog)
36        MSG_WM_DESTROY(OnDestroy)
37        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
38END_MSG_MAP()
39
40BEGIN_DLGRESIZE_MAP(CMainDialog)
41        DLGRESIZE_CONTROL(IDC_EXPLORER1, DLSZ_SIZE_X)
42        DLGRESIZE_CONTROL(IDC_EXPLORER2, DLSZ_SIZE_X | DLSZ_SIZE_Y)
43        DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X)
44        DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X)
45        DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X | DLSZ_MOVE_Y)
46END_DLGRESIZE_MAP()
47
48BEGIN_SINK_MAP(CMainDialog)
49        //SINK_ENTRY_EX(IDC_EXPLORER1, __uuidof(IE::DWebBrowserEvents2), 0x00FA, OnExplorer1BeforeNavigate2)
50        //SINK_ENTRY_EX(IDC_EXPLORER1, __uuidof(IE::DWebBrowserEvents2), 0x0103, OnExplorer1DocumentComplete)
51        //SINK_ENTRY_EX(IDC_EXPLORER2, __uuidof(IE::DWebBrowserEvents2), 0x00FA, OnExplorer2BeforeNavigate2)
52        //SINK_ENTRY_EX(IDC_EXPLORER2, __uuidof(IE::DWebBrowserEvents2), 0x0103, OnExplorer2DocumentComplete)
53        SINK_ENTRY_EX(IDC_EXPLORER1, DIID_DWebBrowserEvents2, 0x00FA, OnExplorer1BeforeNavigate2)
54        SINK_ENTRY_EX(IDC_EXPLORER1, DIID_DWebBrowserEvents2, 0x0103, OnExplorer1DocumentComplete)
55        SINK_ENTRY_EX(IDC_EXPLORER2, DIID_DWebBrowserEvents2, 0x00FA, OnExplorer2BeforeNavigate2)
56        SINK_ENTRY_EX(IDC_EXPLORER2, DIID_DWebBrowserEvents2, 0x0103, OnExplorer2DocumentComplete)
57END_SINK_MAP() 
58
59public:
60
61        ////////////////////////////////////////////////////////
62        // CDispatchEventSink
63
64        class ATL_NO_VTABLE CDispatchEventSink :
65                public CComObjectRootEx<CComSingleThreadModel>,
66                public CComCoClass<CDispatchEventSink>,
67                public IDispatch
68        {
69        public:
70
71        BEGIN_COM_MAP(CDispatchEventSink)
72                COM_INTERFACE_ENTRY(IDispatch)
73        END_COM_MAP()
74
75        public:
76        // CDispatchEventSink
77
78        // IDispatch
79                STDMETHOD(GetTypeInfoCount)(UINT* pnCount) throw()
80                {
81                        ATLTRACE(atlTraceCOM, 4, _T("...\n"));
82                        return E_NOTIMPL;
83                }
84                STDMETHOD(GetTypeInfo)(UINT nIndex, LCID nLocaleIdentifier, ITypeInfo** ppTypeInfo) throw()
85                {
86                        ATLTRACE(atlTraceCOM, 4, _T("...\n"));
87                        return E_NOTIMPL;
88                }
89                STDMETHOD(GetIDsOfNames)(REFIID InterfaceIdentifier, LPOLESTR* ppszNames, UINT nNameCount, LCID nLocaleIdentifier, DISPID* rgDispId) throw()
90                {
91                        ATLTRACE(atlTraceCOM, 4, _T("...\n"));
92                        return E_NOTIMPL;
93                }
94                STDMETHOD(Invoke)(DISPID dispIdMember, REFIID InterfaceIdentifier, LCID nLocaleIdentifier, WORD nFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) throw()
95                {
96                        ATLTRACE(atlTraceCOM, 4, _T("dispIdMember %d, nLocaleIdentifier %d, nFlags 0x%x\n"), dispIdMember, nLocaleIdentifier, nFlags);
97                        _ATLTRY
98                        {
99                                AtlMessageBox(GetActiveWindow(), _T("Hey that's body.onresize here!"), _T(""), MB_ICONINFORMATION | MB_OK);
100                        }
101                        _ATLCATCH(Exception)
102                        {
103                                return Exception;
104                        }
105                        return S_OK;
106                }
107        };
108
109private:
110        CAxWindow m_pExplorers[2];
111
112public:
113// CMainDialog
114        CMainDialog()
115        {
116                #if defined(_DEBUG)
117                        AtlTraceLoadSettings(NULL);
118                #endif // defined(_DEBUG)
119        }
120
121// Window message handlers
122        LRESULT OnInitDialog(HWND, LPARAM)
123        {
124                _Module.Lock();
125                m_pExplorers[0] = GetDlgItem(IDC_EXPLORER1);
126                m_pExplorers[1] = GetDlgItem(IDC_EXPLORER2);
127                //ATLENSURE_SUCCEEDED(AdviseSinkMap(TRUE));
128                //SetIcon(AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
129                //SetIcon(AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
130                ATLVERIFY(CenterWindow());
131                DlgResize_Init(TRUE);
132                for(SIZE_T nIndex = 0; nIndex < _countof(m_pExplorers); nIndex++)
133                {
134                        CComPtr<IWebBrowser> pWebBrowser;
135                        ATLENSURE_SUCCEEDED(m_pExplorers[nIndex].QueryControl(&pWebBrowser));
136                        static VARIANT g_vEmpty = { VT_EMPTY };
137                        ATLENSURE_SUCCEEDED(pWebBrowser->Navigate(CComBSTR(_T("http://alax.info")), &g_vEmpty, &g_vEmpty, &g_vEmpty, &g_vEmpty));
138                }
139                return TRUE;
140        }
141        LRESULT OnDestroy()
142        {
143                //ATLENSURE_SUCCEEDED(AdviseSinkMap(FALSE));
144                if(_Module.GetLockCount() == 1)
145                {
146                        _Module.m_dwTimeOut = 0L;
147                        _Module.m_dwPause = 0L;
148                }
149                _Module.Unlock();
150                return 0;
151        }
152        LRESULT OnCancel(UINT, INT nIdentifier, HWND)
153        {
154                ATLVERIFY(EndDialog(nIdentifier));
155                return 0;
156        }
157
158// Sink handlers
159        VOID STDMETHODCALLTYPE OnExplorer1BeforeNavigate2(IDispatch* pDispatch, VARIANT* pvLocation, VARIANT* pvFlags, VARIANT* pvTargetFrameName, VARIANT* pvPostData, VARIANT* pvHeaders, VARIANT_BOOL* pbCancel)
160        {
161                ATLTRACE2(atlTraceGeneral, 4, _T("(1) ...\n"));
162        }
163        VOID STDMETHODCALLTYPE OnExplorer1DocumentComplete(IDispatch* pDispatch, VARIANT* pvLocation)
164        {
165                ATLTRACE2(atlTraceGeneral, 4, _T("(1) *pvLocation \"%s\"\n"), (pvLocation && pvLocation->vt == VT_BSTR) ? (LPCTSTR) CString(pvLocation->bstrVal) : _T("???"));
166        }
167        VOID STDMETHODCALLTYPE OnExplorer2BeforeNavigate2(IDispatch* pDispatch, VARIANT* pvLocation, VARIANT* pvFlags, VARIANT* pvTargetFrameName, VARIANT* pvPostData, VARIANT* pvHeaders, VARIANT_BOOL* pbCancel)
168        {
169                ATLTRACE2(atlTraceGeneral, 4, _T("(2) ...\n"));
170        }
171        VOID STDMETHODCALLTYPE OnExplorer2DocumentComplete(IDispatch* pDispatch, VARIANT* pvLocation)
172        {
173                ATLTRACE2(atlTraceGeneral, 4, _T("(2) *pvLocation \"%s\"\n"), (pvLocation && pvLocation->vt == VT_BSTR) ? (LPCTSTR) CString(pvLocation->bstrVal) : _T("???"));
174                _ATLTRY
175                {
176                        CComPtr<IWebBrowser2> pWebBrowser2;
177                        ATLENSURE_SUCCEEDED(m_pExplorers[1].QueryControl(__uuidof(IWebBrowser2), (VOID**) &pWebBrowser2));
178                        CComPtr<IDispatch> pDocumentDispatch;
179                        ATLENSURE_SUCCEEDED(pWebBrowser2->get_Document(&pDocumentDispatch));
180                        CComQIPtr<IHTMLDocument2> pDocument = pDocumentDispatch;
181                        ATLENSURE_THROW(pDocument, E_NOINTERFACE);
182                        CComPtr<IHTMLElement> pBodyElementA;
183                        ATLENSURE_SUCCEEDED(pDocument->get_body(&pBodyElementA));
184                        CComPtr<IDispatch> pSinkDispatch;
185                        ATLENSURE_SUCCEEDED(CDispatchEventSink::CreateInstance(&pSinkDispatch));
186                        CComVariant vValue = pSinkDispatch;
187                        ATLENSURE_SUCCEEDED(reinterpret_cast<CComPtr<IDispatch>&>(pBodyElementA).PutPropertyByName(L"onresize", &vValue));
188                }
189                _ATLCATCHALL()
190                {
191                }
192        }
193};
Note: See TracBrowser for help on using the repository browser.