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

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