Internet Explorer est une fonctionnalité standard de Windows CE, mais de nombreux dévelopeurs souhaitent personnaliser le navigateur pour répondre à des besoins spécifiques.
J'ai étudié les eexmples fournis par Microsoft pour IE et partage maintenant le code modifié pour permettre à tous de se familiariser avec cette implémentation. Notez que le nom de classe IESIMPLE pour la fenêtre ne peut pas être modifié, comme indiqué dans les commentaires du code.
Fichier d'en-tête resuorce.h :
1 //
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //
4 //
5 // Utilisation de ce code source est soumise aux termes du contrat de licence
6 // final utilisateur (EULA) sous lequel vous avez licencié ce PRODUIT LOGICIEL.
7 // Si vous n'avez pas accepté les termes de l'EULA, vous n'êtes pas autorisé à
8 // utiliser ce code source. Pour une copie de l'EULA, veuillez consulter le
9 // fichier LICENSE.RTF sur votre support d'installation.
10 //
11 #define IDC_STATIC -1
12
13 #define IDR_ACCELERATOR 100
14
15 #define IDD_OPEN_DIALOG 1000
16
17 #define IDC_URL_EDIT 3000
18 #define IDC_BROWSE 3001
19 #define IDC_NEWWINDOW 3002
20
21 #define IDS_IE 20000
22 #define IDS_ADDRESS 20001
23 #define IDS_FILESCHEME 20002
24 #define IDS_HYPHEN 20003
25 #define IDS_BROWSEFILTER 20010
26
27 #define ID_VIEW_STOP 500
28 #define ID_VIEW_REFRESH 501
29 #define ID_GO_BACK 502
30 #define ID_GO_FORWARD 503
31 #define ID_FOCUS_URL 504
32 #define ID_OPEN 505
33 #define ID_GO_HOME 506
34 #define ID_GO_SEARCH 507
35 #define ID_FULLSCREEN 508
36 #define ID_INTERNET_OPTIONS 509
37 #define ID_FIND 510
38 #define ID_CLOSE 511
39 #define ID_ZOOMUP 512
40 #define ID_ZOOMDOWN 513
fichier d'en-tête navigateur.h :
1 //
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //
4 //
5 // Utilisation de ce code source est soumise aux termes du contrat de licence
6 // final utilisateur (EULA) sous lequel vous avez licencié ce PRODUIT LOGICIEL.
7 // Si vous n'avez pas accepté les termes de l'EULA, vous n'êtes pas autorisé à
8 // utiliser ce code source. Pour une copie de l'EULA, veuillez consulter le
9 // fichier LICENSE.RTF sur votre support d'installation.
10 //
11 /*++
12 CE CODE ET INFORMATION SONT FOURNIS "EN L'ÉTAT" SANS GARANTIE DE
13 AUCUNE SORTE, EXPRIMÉE OU IMPLIQUÉE, Y COMPRIS MAIS NON LIMITÉ AUX
14 GARANTIES IMPLICITES DE COMMERCIALISATION ET/ADAPTATION À UN
15 USAGE PARTICULIER.
16
17 Nom du module : navigateur.h
18
18 Résumé : Implémente la fenêtre principale, le conteneur pour le navigateur web
19
20 Fonctions :
21
22 Notes : Cette classe implémente le conteneur et son interaction avec le contrôle
23 navigateur, barre de commandes, barre d'état, etc.
24
25 --*/
26
27 #ifndef _NAVIGATEUR_H
28 #define _NAVIGATEUR_H_
29
30 #include "mshtmhst.h"
31 #include "interned.h"
32
33 #define MAX_URL 2048
34
34 class CFenetrePrincipale :
35 public IOleContainer,
36 public IOleClientSite,
37 public IOleInPlaceSite,
38 public IServiceProvider,
39 public DWebBrowserEvents2,
40 public IDocHostUIHandler,
41 public IDocHostShowUI, // msgbox, fenêtre d'aide
42 public IHTMLOMWindowServices // pour les événements de déplacement, redimensionnement
43 {
44
45 public:
46 CFenetrePrincipale();
47 ~CFenetrePrincipale();
48
49 BOOL Creer();
50
51 // Méthodes IUnknown
52 STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv)
53 {
54 if ((riid == IID_IOleContainer) || (riid == IID_IUnknown))
55 {
56 *ppv = (IOleContainer *) this;
57 }
58 else if (riid == IID_IOleClientSite)
59 {
60 *ppv = (IOleClientSite *)this;
61 }
62 else if (riid == IID_IOleInPlaceSite)
63 {
64 *ppv = (IOleInPlaceSite *)this;
65 }
66 else if (riid == IID_IOleWindow)
67 {
68 *ppv = (IOleWindow *)this;
69 }
70 else if ((riid == DIID_DWebBrowserEvents2) || (riid == IID_IDispatch))
71 {
72 *ppv = (DWebBrowserEvents2 *)this;
73 }
74 else if(riid == IID_IServiceProvider)
75 {
76 *ppv = (IServiceProvider *)this;
77 }
78 else if (riid == IID_IDocHostUIHandler)
79 {
80 *ppv = (IDocHostUIHandler *)this;
81 }
82 else if (riid == IID_IDocHostShowUI)
83 {
84 *ppv = (IDocHostShowUI *)this;
85 }
86 else if (riid == IID_IHTMLOMWindowServices)
87 {
88 *ppv = (IHTMLOMWindowServices *)this;
89 }
90 else
91 {
92 *ppv = NULL;
93 return E_NOINTERFACE;
94 }
95 AddRef();
96 return S_OK;
97 }
98
99 STDMETHOD_(ULONG, AddRef) (void)
100 {
101 InterlockedIncrement((LONG*)&m_unRefs);
102 return m_unRefs;
103 }
104
105 STDMETHOD_(ULONG, Release) (void)
106 {
107 ULONG ulRefs = m_unRefs;
108 if (InterlockedDecrement((LONG*)&m_unRefs) == 0)
109 {
110 delete this;
111 return 0;
112 }
113 return ulRefs - 1;
114 }
115
116 // Méthodes IOleContainer
117 STDMETHOD(ParseDisplayName)(IBindCtx *, LPOLESTR, ULONG *, IMoniker **) { return E_NOTIMPL;}
118 STDMETHOD(EnumObjects)(DWORD, IEnumUnknown **)
119 {
120 return E_NOTIMPL;
121 }
122 STDMETHOD(LockContainer)(BOOL) { return S_OK;}
123
124 // Méthodes IOleClientSite
125 STDMETHOD(SaveObject) (void) { return E_NOTIMPL;}
126 STDMETHOD(GetMoniker) (DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER * ppmk) { return E_NOTIMPL;}
127 STDMETHOD(GetContainer) (LPOLECONTAINER * ppContainer)
128 {
129 return E_NOINTERFACE;
130 }
131 STDMETHOD(ShowObject) (void) { return E_NOTIMPL;}
132 STDMETHOD(OnShowWindow) (BOOL fShow) { return E_NOTIMPL;}
133 STDMETHOD(RequestNewObjectLayout) (void) { return E_NOTIMPL;}
134
135 // Méthodes IOleWindow
136 STDMETHOD(GetWindow)(HWND *phwnd)
137 {
138 *phwnd = m_hWndPrincipale;
139 return S_OK;
140 }
141 STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) { return E_NOTIMPL;}
142
143 // Méthodes IOleInPlaceSite
144 STDMETHOD(CanInPlaceActivate) (void) { return S_OK;}
145 STDMETHOD(OnInPlaceActivate) (void)
146 {
147 m_bActifEnPlace = TRUE;
148 return S_OK;
149 }
150
151 STDMETHOD(OnUIActivate) (void) { return E_NOTIMPL;}
152 STDMETHOD(GetWindowContext) (
153 LPOLEINPLACEFRAME FAR * lplpFrame,
154 LPOLEINPLACEUIWINDOW FAR * lplpDoc,
155 LPRECT lprcPosRect,
156 LPRECT lprcClipRect,
157 LPOLEINPLACEFRAMEINFO lpFrameInfo)
158 {
159
160 GetClientRect(m_hWndPrincipale, lprcPosRect);
161 GetClientRect(m_hWndPrincipale, lprcClipRect);
162
163 return S_OK;
164 }
165
166 STDMETHOD(Scroll) (SIZE scrollExtent) { return E_NOTIMPL;}
167 STDMETHOD(OnUIDeactivate) (BOOL fUndoable) { return E_NOTIMPL;}
168 STDMETHOD(OnInPlaceDeactivate) (void)
169 {
170 m_bActifEnPlace = FALSE;
171 return S_OK;
172 }
173
174 STDMETHOD(DiscardUndoState) (void) { return E_NOTIMPL;}
175 STDMETHOD(DeactivateAndUndo) (void) { return E_NOTIMPL;}
176 STDMETHOD(OnPosRectChange) (LPCRECT lprcPosRect) { return E_NOTIMPL;}
177
178 // IServiceProvider
179
180 STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObj)
181 {
182 if(guidService == IID_IHTMLOMWindowServices)
183 {
184 return QueryInterface(riid, ppvObj);
185 }
186 else
187 return E_FAIL;
188 }
189
190 // Méthodes DWebBrowserEvents
191 // Méthodes IDispatch
192 STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo) { return E_NOTIMPL;}
193
194 STDMETHOD(GetTypeInfo)(UINT itinfo,LCID lcid,ITypeInfo FAR* FAR* pptinfo) { return E_NOTIMPL;}
195
196 STDMETHOD(GetIDsOfNames)(REFIID riid,OLECHAR FAR* FAR* rgszNames,UINT cNames,
197 LCID lcid, DISPID FAR* rgdispid) { return E_NOTIMPL;}
198
199 STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid,LCID lcid,WORD wFlags,
200 DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult,
201 EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr);
202
203 // Méthodes IDocHostUIHandler
204 STDMETHOD(EnableModeless)(BOOL fEnable) { return E_NOTIMPL; }
205 STDMETHOD(FilterDataObject)(IDataObject *pDO, IDataObject **ppDORet) { return E_NOTIMPL; }
206 STDMETHOD(GetDropTarget)(IDropTarget *pDropTarget, IDropTarget **ppDropTarget) { return E_NOTIMPL; }
207 STDMETHOD(GetExternal)(IDispatch **ppDispatch) { return E_NOTIMPL; }
208 STDMETHOD(GetHostInfo)(DOCHOSTUIINFO *pInfo);
209 STDMETHOD(GetOptionKeyPath)(LPOLESTR *pchKey, DWORD dw) { return E_NOTIMPL; }
210 STDMETHOD(HideUI)(void) { return E_NOTIMPL; }
211 STDMETHOD(OnDocWindowActivate)(BOOL fActivate) { return E_NOTIMPL; }
212 STDMETHOD(OnFrameWindowActivate)(BOOL fActivate) { return E_NOTIMPL; }
213 STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow) { return E_NOTIMPL; }
214 STDMETHOD(ShowContextMenu)(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved) { return E_NOTIMPL; }
215 STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
216 IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame,
217 IOleInPlaceUIWindow *pDoc) { return E_NOTIMPL; }
218 STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID *pgudCmdGroup, DWORD nCmdID) { return E_NOTIMPL; }
219 STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut) { return E_NOTIMPL; }
220 STDMETHOD(UpdateUI)(void) { return E_NOTIMPL; }
221
222 // Méthodes IDocHostShowUI
223 STDMETHOD(ShowHelp)( HWND hwnd, LPOLESTR pszHelpFile, UINT uCommand,
224 DWORD dwData, POINT ptMouse, IDispatch *pDispatchObjectHit)
225 { return E_NOTIMPL; }
226
227
228 STDMETHOD(ShowMessage)( HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType,
229 LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT *plResult)
230 {
231 int iRes = MessageBox(hwnd, lpstrText, lpstrCaption, dwType);
232 if(plResult)
233 *plResult = iRes;
234 return S_OK;
235 }
236
237 // Méthodes IHTMLOMWindowServices
238 STDMETHOD(deplacerVers)( LONG x, LONG y);
239 STDMETHOD(deplacerDe)( LONG x, LONG y);
240 STDMETHOD(redimensionnerA)( LONG x,LONG y);
241 STDMETHOD(redimensionnerDe)( LONG x, LONG y);
242
243
244 public:
245 BOOL PreTranslateMessage(LPMSG pMsg);
246 VOID Fermer();
247 HWND GetWindow() { return m_hWndPrincipale;}
248 LRESULT GererCommande(WPARAM wParam, LPARAM lParam);
249
250 HANDLE m_hEvenement;
251 IWebBrowser2 *m_pNavigateur;
252
253
254
255 static LRESULT CALLBACK ProcFenetrePrincipale(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
256
257 protected:
258
259
260
261 //Ajout pour les boîtes de dialogue HTML Find
262 HRESULT RechercherChaine();
263
264 VOID CFenetrePrincipale::ChangerTaillePolice(BOOL fInit);
265
266 BOOL EnregistrerFenetrePrincipale();
267 HWND CreerNavigateur();
268 HRESULT Activer(IOleObject *pObject);
269 HRESULT InitialiserEvenements();
270
271
272 public:
273 LPTSTR m_lpszUrl;
274 BOOL m_bVide;
275 BOOL m_bPleinEcran;
276 RECT m_rcFenetre;
277 protected:
278 HACCEL m_hTblAccel; //un handle vers la table des raccourcis
279 HWND m_hWndPrincipale; //la fenêtre principale
280
281 ULONG m_unRefs; //compteur de références pour les interfaces supportées par le conteneur
282
283 HWND m_hWndNavigateur; //handle vers la fenêtre du navigateur
284
285 IOleObject *m_pObjet;
286 IConnectionPoint *m_pCP;
287 IOleInPlaceActiveObject *m_pObjetActif;
288 BOOL m_bActifEnPlace;
289 DWORD m_dwCookieEvenement;
290
291 TCHAR m_tcTitre[MAX_URL]; //titre du document actuel
292 HWND m_hWndProgression; // barre de progression
293 RECT m_rcProgression;
294
295 int m_iZoom;
296 int m_iCompteurDLC;
297
298 };
299
300 #endif //_NAVIGATEUR_H_
fichier source navigateur.cpp :
1 /*++
2
3 Nom du module : navigateur.cpp
4
5 Résumé : Implémente la fenêtre principale, le conteneur pour le navigateur web
6
7 Fonctions :
8
9 Notes : La majeure partie du code se trouve ici. Le conteneur et son interaction avec le contrôle
10 navigateur, barre de commandes, barre d'état, etc.
11
12 --*/
13 #include <windows.h>
14 // Inclure les définitions d'automatisation...
15 #include <exdisp.h>
16 #include <exdispid.h>
17 #include <mshtmdid.h> // AMBIENT_DLCONTROL
18
19 #include <objbase.h>
20
21 #include <tchar.h>
22
23 #include <wininet.h>
24 #include <afdfunc.h> //ras stuff
25 #include <pkfuncs.h> // GetOwnerProcess
26 #include <mshtml.h>
27 #include <commctrl.h>
28 #include <commdlg.h>
29 #include "Navigateur.h"
30 #include "resource.h"
31
32 #define INITGUID
33 #include "initguid.h"
34 #include <hshell.h>
35
36 #define DEMARRER_PLEIN_ECRAN // Supprimer cette ligne si vous ne voulez pas que NAVIGATEUR soit en plein écran au démarrage
37
38 DEFINE_GUID(CLSID_WebBrowser, 0x8856F961L, 0x340A, 0x11D0, 0xA9, 0x6B, 0x00, 0xC0, 0x4F, 0xD7, 0x05, 0xA2);
39 DEFINE_GUID(IID_IWebBrowser, 0xEAB22AC1L, 0x30C1, 0x11CF, 0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B);
40 DEFINE_GUID(IID_IWebBrowser2, 0xD30C1661L, 0xCDAF, 0x11D0, 0x8A, 0x3E, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E);
41 DEFINE_GUID(DIID_DWebBrowserEvents, 0xEAB22AC2L, 0x30C1, 0x11CF, 0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B);
42 DEFINE_GUID(DIID_DWebBrowserEvents2, 0x34A715A0L, 0x6587, 0x11D0, 0x92, 0x4A, 0x00, 0x20, 0xAF, 0xC7, 0xAC, 0x4D);
43 DEFINE_GUID(IID_IWebBrowserApp, 0x0002DF05L, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
44
45 const GUID SID_SDocHost = { 0xc6504990, 0xd43e, 0x11cf, { 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a}};
46
47 #define MAX(a,b) (a > b) ? a : b
48 #define MIN(a,b) (a > b) ? b : a
49
50 LONG glNbThreads = 0;
51 HWND ghWndAdresseEdit= NULL;
52 HANDLE ghEvenementSortie = NULL;
53 HINSTANCE g_hInstance = NULL;
54 DWORD g_dwTaillePileFenetrePrincipale = 0x20000;
55
56 void ObtenirOptionsProxy();
57
58
59 static HRESULT RechercherChaine();
60 HRESULT GererNouvelleFenetre2(LPTSTR lpszUrl, DISPPARAMS FAR* pdparams);
61 BOOL EnregistrerFenetrePrincipale();
62
63
64 DWORD WINAPI NouvelleFenetre(LPVOID pParam)
65 {
66 CFenetrePrincipale *pWnd = (CFenetrePrincipale *)pParam;
67 MSG msg;
68 BOOL fRet;
69
70 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
71
72 fRet = pWnd->Creer();
73
74 SetEvent(pWnd->m_hEvenement);
75
76 if(!fRet)
77 {
78 pWnd->m_pNavigateur = NULL;
79 return 0;
80 }
81
82 while(GetMessage( &msg, NULL, 0, 0 ) )
83 {
84 if(msg.message == WM_QUIT)
85 break;
86
87 if(!pWnd->PreTranslateMessage(&msg) && !(msg.message == WM_CHAR && msg.wParam == VK_TAB))
88 {
89 TranslateMessage(&msg);
90 DispatchMessage(&msg);
91 }
92 }
93
94 pWnd->Release();
95
96 CoUninitialize();
97
98 InterlockedDecrement(&glNbThreads);
99 SetEvent(ghEvenementSortie);
100
101 return msg.wParam;
102 }
103
104 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nCmdShow)
105 {
106 INITCOMMONCONTROLSEX iccsex;
107 HKEY hKey;
108 DWORD dwSize = sizeof(DWORD);
109 MSG msg;
110
111 // HKCU est là où les paramètres IE\Main sont stockés
112 if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Internet Explorer\\Main"), 0, 0, &hKey))
113 {
114 RegQueryValueEx(hKey, TEXT("StackRes"), NULL, NULL, (LPBYTE)&g_dwTaillePileFenetrePrincipale, &dwSize);
115 RegCloseKey(hKey);
116 }
117
118 // fournir une taille de pile par défaut si celle donnée est trop petite ou trop grande.
119 if(g_dwTaillePileFenetrePrincipale < 0x10000 || g_dwTaillePileFenetrePrincipale > 0x80000)
120 {
121 // valeur par défaut de 128k
122 g_dwTaillePileFenetrePrincipale = 0x20000;
123 }
124 RETAILMSG(1,(L"NAVIGATEUR Utilise la taille de pile: 0x%x\r\n", g_dwTaillePileFenetrePrincipale));
125
126 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
127 if(FAILED(hr))
128 {
129 return FALSE;
130 }
131
132 if(!EnregistrerFenetrePrincipale())
133 {
134 return FALSE;
135 }
136
137 ghEvenementSortie = CreateEvent(NULL, FALSE, FALSE, NULL);
138 if(!ghEvenementSortie)
139 {
140 return FALSE;
141 }
142
143 iccsex.dwSize = sizeof(INITCOMMONCONTROLSEX);
144 iccsex.dwICC = ICC_COOL_CLASSES;
145
146 InitCommonControlsEx(&iccsex);
147
148 g_hInstance = hInst;
149
150 // Créer une file de messages sur ce thread
151 PeekMessage(&msg, NULL, 0,0,PM_NOREMOVE);
152
153 if(FAILED(GererNouvelleFenetre2(lpCmdLine, NULL)))
154 {
155 goto Cleanup;
156 }
157
158 while(glNbThreads > 0)
159 {
160 WaitForSingleObject(ghEvenementSortie, INFINITE);
161 }
162
163 Cleanup:
164 CoUninitialize();
165
166 RETAILMSG(1, (L"NAVIGATEUR quitté. La ligne de commande était: %s\r\n",lpCmdLine ? lpCmdLine : L""));
167
168 return TRUE;
169 }
170
171
172 CFenetrePrincipale::CFenetrePrincipale()
173 {
174 m_unRefs = 1;
175 m_hWndPrincipale = NULL;
176 m_pNavigateur = NULL;
177 m_pObjet = NULL;
178 m_pCP = NULL;
179 m_lpszUrl = NULL;
180 m_bPleinEcran = FALSE;
181 m_bVide = FALSE;
182 m_tcTitre[0] = 0;
183
184 m_iZoom = 2; // zoom par défaut
185 m_iCompteurDLC = 0; // compteur pour les téléchargements terminés
186
187 }
188
189 CFenetrePrincipale::~CFenetrePrincipale()
190 {
191 RETAILMSG(1,(L"NAVIGATEUR Sortant de ~CFenetrePrincipale\r\n"));
192
193 if(m_pNavigateur)
194 m_pNavigateur->Release();
195 }
196
197 BOOL EnregistrerFenetrePrincipale()
198 {
199 WNDCLASS wc;
200 wc.style = 0;
201 wc.lpfnWndProc = (WNDPROC)CFenetrePrincipale::ProcFenetrePrincipale;
202 wc.cbClsExtra = 0;
203 wc.cbWndExtra = 0;
204 wc.hInstance = g_hInstance;
205 wc.hIcon = NULL; // LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IE));
206 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
207 wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
208 wc.lpszMenuName = NULL;
209 wc.lpszClassName = TEXT("NAVIGATEUR");
210
211 if(!(RegisterClass(&wc)))
212 return FALSE;
213
214 return TRUE;
215 }
216
217
218 BOOL CFenetrePrincipale::Creer()
219 {
220 RECT rcZone;
221 DWORD dwTick;
222
223 DWORD dwStyle = WS_VISIBLE | WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU;
224 /*|WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX*/
225 DWORD dwExStyle = 0/*WS_EX_OVERLAPPEDWINDOW*/;
226
227 HMENU hMenu = NULL;
228
229 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcZone, 0);
230
231 m_hWndPrincipale = ::CreateWindowEx(dwExStyle,
232 TEXT("NAVIGATEUR"), // Attention - ne pas modifier ce nom, sinon la création de la fenêtre échoue
233 (WCHAR *)LoadString(g_hInstance, IDS_IE, NULL, 0),
234 dwStyle,
235 rcZone.left + 20,
236 rcZone.top + 20,
237 rcZone.right - rcZone.left - 40,
238 rcZone.bottom - rcZone.top - 30,
239 NULL, hMenu, g_hInstance, 0);
240 if(!m_hWndPrincipale)
241 {
242 return FALSE;
243 }
244
245 SetWindowLong(m_hWndPrincipale, GWL_USERDATA, (DWORD)this);
246 GetWindowRect(m_hWndPrincipale, &m_rcFenetre);
247
248 // créer une barre de progression
249 m_rcProgression.left = 5;
250 m_rcProgression.right = m_rcProgression.left + (m_rcFenetre.right - m_rcFenetre.left)/3;
251 m_rcProgression.top = 5;
252 m_rcProgression.bottom = m_rcProgression.top + 15;
253
254 m_hWndProgression = CreateWindowEx(WS_EX_NOACTIVATE, PROGRESS_CLASS, _T(""), WS_CHILD|PBS_SMOOTH|WS_BORDER,
255 m_rcProgression.left, m_rcProgression.top, m_rcProgression.right-m_rcProgression.left, m_rcProgression.bottom-m_rcProgression.top,
256 m_hWndPrincipale, NULL, g_hInstance, NULL);
257 if(m_hWndProgression)
258 {
259 SendMessage(m_hWndProgression, PBM_SETRANGE32, 0, 1000);
260 }
261 // /barre de progression
262
263 dwTick = GetTickCount();
264 if(!(m_hWndNavigateur = CreerNavigateur()))
265 return FALSE;
266 RETAILMSG(1,(L"Créer navigateur tick count: %d\r\n",GetTickCount() - dwTick)); // environ 2 secondes
267
268 // LONG lStyle = GetWindowLong(_hWndNavigateur, GWL_STYLE);
269 // SetWindowLong(_hWndNavigateur, GWL_STYLE, lStyle|WS_BORDER);
270
271 SetFocus(m_hWndPrincipale);
272
273 m_hTblAccel = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
274
275 #ifdef DEMARRER_PLEIN_ECRAN
276 GererCommande( ID_FULLSCREEN, 0 );
277 #endif
278
279 return TRUE;
280 }
281
282
283
284 void ObtenirOptionsProxy()
285 {
286 INTERNET_PER_CONN_OPTION_LIST iOptionList;
287 INTERNET_PER_CONN_OPTION iOptions[3];
288 ULONG uSize = sizeof(iOptionList);
289
290 iOptionList.dwSize = uSize;
291 iOptionList.pszConnection = NULL;
292 iOptionList.dwOptionCount = 3;
293 iOptionList.pOptions = iOptions;
294
295 // définir le type de proxy direct ou serveur proxy
296 iOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
297 iOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
298 iOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
299
300 if(InternetQueryOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION ,(LPVOID)(&iOptionList),&uSize))
301 {
302 GlobalFree(iOptionList.pOptions[1].Value.pszValue);
303 GlobalFree(iOptionList.pOptions[2].Value.pszValue);
304 }
305 }
306
307 HWND CFenetrePrincipale::CreerNavigateur()
308 {
309 HRESULT hr;
310 IUnknown *pUnk = NULL;
311 IOleObject *pObjet = NULL;
312
313 if(!m_pNavigateur)
314 {
315 ObtenirOptionsProxy();
316 hr = CoCreateInstance(CLSID_WebBrowser, NULL,
317 CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
318 IID_IUnknown, (LPVOID *)(&pUnk));
319 if(FAILED(hr))
320 return FALSE;
321
322 hr = pUnk->QueryInterface(IID_IOleObject, (LPVOID *)(&pObjet));
323 if(FAILED(hr))
324 goto Cleanup;
325
326 DWORD dwFlags;
327 hr = pObjet->GetMiscStatus(DVASPECT_CONTENT, &dwFlags);
328 if(FAILED(hr))
329 goto Cleanup;
330
331 if(dwFlags & OLEMISC_SETCLIENTSITEFIRST)
332 {
333 IOleClientSite *pClientSite;
334 hr = QueryInterface(IID_IOleClientSite, (LPVOID *)(&pClientSite));
335 if(FAILED(hr))
336 goto Cleanup;
337
338 hr = pObjet->SetClientSite(pClientSite);
339 pClientSite->Release();
340 if(FAILED(hr))
341 goto Cleanup;
342 }
343
344 hr = Activer(pObjet);
345 if(FAILED(hr))
346 goto Cleanup;
347
348 hr = m_pObjet->QueryInterface(IID_IWebBrowser2, (void **)&m_pNavigateur);
349 if(FAILED(hr))
350 goto Cleanup;
351
352 // Vérifier s'il y a une url dans lpszUrl
353 hr = pUnk->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)(&m_pObjetActif));
354 if(FAILED(hr))
355 m_pObjetActif = NULL;
356
357 hr = S_FALSE;
358
359 if(m_bVide)
360 {
361 // Test: m_lpszUrl = L"http://www.google.com";
362
363 BSTR bstrURL = SysAllocString(m_lpszUrl);
364 if(bstrURL && bstrURL[0])
365 m_pNavigateur->Navigate(bstrURL, NULL, NULL, NULL, NULL);
366 else
367 m_pNavigateur->GoHome();
368
369 SysFreeString(bstrURL);
370
371 }
372 hr = InitialiserEvenements();
373 }
374
375 Cleanup:
376 if(pUnk)
377 pUnk->Release();
378 if(pObjet)
379 pObjet->Release();
380
381 IOleWindow *pWnd = NULL;
382 HWND hwndNavigateur = NULL;
383
384 if(m_pNavigateur)
385 {
386 hr = m_pNavigateur->QueryInterface(IID_IOleWindow, (LPVOID *)(&pWnd));
387 if(FAILED(hr))
388 return NULL;
389 }
390
391 if(pWnd)
392 {
393 hr = pWnd->GetWindow(&hwndNavigateur);
394 pWnd->Release();
395 }
396 return hwndNavigateur;
397 }
398
399 HRESULT CFenetrePrincipale::Activer(IOleObject *pObjet)
400 {
401 m_pObjet = pObjet;
402 m_pObjet->AddRef();
403
404 RECT rc;
405 ::GetClientRect(m_hWndPrincipale, &rc);
406
407 HRESULT hr;
408 hr = m_pObjet->DoVerb( OLEIVERB_UIACTIVATE, NULL, this, 0, m_hWndPrincipale, &rc);
409
410 if(FAILED(hr))
411 goto Cleanup;
412
413 Cleanup:
414 return hr;
415 }
416
417 HRESULT CFenetrePrincipale::InitialiserEvenements()
418 {
419 HRESULT hr;
420 IConnectionPointContainer *pCPCont = NULL;
421 DWebBrowserEvents *pEvenements = NULL;
422
423 if(!m_pNavigateur)
424 return S_FALSE;
425 hr = m_pNavigateur->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPCont);
426 if(FAILED(hr))
427 return S_FALSE;
428 hr = pCPCont->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pCP);
429 if(FAILED(hr))
430 {
431 m_pCP = NULL;
432 goto Cleanup;
433 }
434
435 hr = QueryInterface(DIID_DWebBrowserEvents2, (LPVOID *)(&pEvenements));
436 if(FAILED(hr))
437 goto Cleanup;
438 hr = m_pCP->Advise(pEvenements, &(m_dwCookieEvenement));
439 if(FAILED(hr))
440 goto Cleanup;
441
442
443 Cleanup:
444 if(pCPCont)
445 pCPCont->Release();
446 if(pEvenements)
447 pEvenements->Release();
448 return hr;
449 }
450
451
452
453 HRESULT GererNouvelleFenetre2(LPTSTR lpszUrl, DISPPARAMS FAR* pdparams)
454 {
455 HANDLE hThread;
456 CFenetrePrincipale *pNouvFen;
457 IDispatch *pDispatch;
458 HRESULT hr = S_OK;
459 DWORD dwThreadID = 0;
460
461 pNouvFen = new CFenetrePrincipale;
462
463 if(!pNouvFen)
464 {
465 return E_OUTOFMEMORY;
466 }
467
468 pNouvFen->m_lpszUrl = lpszUrl;
469 if(!pdparams)
470 pNouvFen->m_bVide = TRUE;
471
472 pNouvFen->m_hEvenement = CreateEvent(NULL, FALSE, FALSE, NULL);
473
474 if(!pNouvFen->m_hEvenement)
475 {
476 }
477
478 InterlockedIncrement(&glNbThreads);
479
480 hThread = CreateThread(NULL, g_dwTaillePileFenetrePrincipale, NouvelleFenetre, (LPVOID)pNouvFen, STACK_SIZE_PARAM_IS_A_RESERVATION, &dwThreadID);
481 if(!hThread)
482 {
483 delete pNouvFen;
484 InterlockedDecrement(&glNbThreads);
485 return E_OUTOFMEMORY;
486 }
487 RETAILMSG(1,(L"[GererNouvelleFenetre2]Créer thread,ID est: 0x%x\r\n",dwThreadID));
488
489 WaitForSingleObject(pNouvFen->m_hEvenement, INFINITE);
490 CloseHandle(hThread);
491 if(pdparams)
492 {
493 if(pNouvFen->m_pNavigateur)
494 {
495 hr = pNouvFen->m_pNavigateur->QueryInterface(IID_IDispatch, (LPVOID *)(&pDispatch));
496 }
497 else
498 {
499 hr = E_FAIL;
500 pDispatch = NULL;
501 }
502
503 *(pdparams->rgvarg[0].pboolVal) = 0;
504 *(pdparams->rgvarg[1].ppdispVal) = pDispatch;
505 }
506 return hr;
507 }
508
509
510 STDMETHODIMP CFenetrePrincipale::GetHostInfo(DOCHOSTUIINFO *pInfo)
511 {
512
513 pInfo->cbSize = sizeof(DOCHOSTUIINFO);
514 //pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_FLAT_SCROLLBAR;
515 //pInfo->dwFlags |= DOCHOSTUIFLAG_SCROLL_NO;
516
517 return S_OK;
518
519 }
520
521 STDMETHODIMP CFenetrePrincipale::Invoke (
522 DISPID dispidMember,
523 REFIID riid,
524 LCID lcid,
525 WORD wFlags,
526 DISPPARAMS FAR* pdparams,
527 VARIANT FAR* pvarResult,
528 EXCEPINFO FAR* pexcepinfo,
529 UINT FAR* puArgErr
530 )
531 {
532 switch (dispidMember)
533 {
534 case DISPID_AMBIENT_DLCONTROL:
535 if(pvarResult)
536 {
537 V_VT(pvarResult) = VT_I4;
538 // toujours définir ces trois sauf s'ils doivent être désactivés
539 pvarResult->lVal = DLCTL_DLIMAGES|DLCTL_VIDEOS|DLCTL_BGSOUNDS;
540
541 // mettre le navigateur en mode téléchargement uniquement
542 // pvarResult->lVal |= DLCTL_DOWNLOADONLY;
543 }
544 break;
545
546 case DISPID_STATUSTEXTCHANGE:
547 {
548 }
549 break;
550
551 case DISPID_SETSECURELOCKICON:
552 {
553 }
554 break;
555
556 case DISPID_PROGRESSCHANGE:
557 {
558 LONG lProgMax = pdparams->rgvarg[0].lVal;
559 LONG lProg = pdparams->rgvarg[1].lVal;
560 UINT nPos = (lProg == -1) ? 999 : ((lProg-1)%1000);
561
562 SendMessage(m_hWndProgression, PBM_SETPOS, nPos, 0);
563 }
564 break;
565
566 // notification pour le téléchargement de fichier
567 case DISPID_FILEDOWNLOAD:
568 break;
569
570
571 case DISPID_NAVIGATECOMPLETE2:
572 break;
573
574 case DISPID_COMMANDSTATECHANGE:
575 break;
576
577 case DISPID_TITLECHANGE:
578 if(pdparams && pdparams->rgvarg[0].vt == VT_BSTR)
579 {
580 TCHAR szTitre[85];
581 int len = wcslen(pdparams->rgvarg[0].bstrVal);
582
583 _tcsncpy(m_tcTitre, pdparams->rgvarg[0].bstrVal, MAX_URL-1);
584 _tcsncpy(szTitre, pdparams->rgvarg[0].bstrVal, 80);
585 if(len > 80)
586 _tcscat(szTitre, L"...");
587
588 SetWindowText(m_hWndPrincipale, szTitre);
589 }
590 break;
591
592 case DISPID_ONQUIT:
593 PostMessage(m_hWndPrincipale, WM_CLOSE, 0, 0L);
594 break;
595
596 case DISPID_DOWNLOADBEGIN:
597 m_iCompteurDLC++;
598 SetWindowPos(m_hWndProgression, HWND_TOP, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
599 break;
600 case DISPID_DOWNLOADCOMPLETE:
601 case DISPID_DOCUMENTCOMPLETE:
602 m_iCompteurDLC--;
603 if(m_iCompteurDLC <= 0)
604 {
605 SetWindowPos(m_hWndProgression,NULL, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW);
606 ChangerTaillePolice(TRUE);
607 m_iCompteurDLC = 0;
608 }
609 break;
610
611 case DISPID_NEWWINDOW2:
612 //pdparams->rgvarg[1].boolVal = VARIANT_TRUE;
613 //break;
614 return GererNouvelleFenetre2(NULL, pdparams);
615 break;
616
617
618 case DISPID_PROPERTYCHANGE:
619 case DISPID_BEFORENAVIGATE2:
620 break;
621 default:
622 return DISP_E_MEMBERNOTFOUND;
623 }
624 return S_OK;
625 }
626
627
628 STDMETHODIMP CFenetrePrincipale::deplacerVers( LONG x, LONG y)
629 {
630 SetWindowPos(m_hWndPrincipale, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
631 return S_OK;
632 }
633
634 STDMETHODIMP CFenetrePrincipale::deplacerDe( LONG x, LONG y)
635 {
636 RECT rcFenetre;
637
638 GetWindowRect(m_hWndPrincipale, &rcFenetre);
639
640 SetWindowPos(m_hWndPrincipale, NULL, rcFenetre.left + x, rcFenetre.top + y, 0, 0,
641 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
642 return S_OK;
643 }
644
645
646 STDMETHODIMP CFenetrePrincipale::redimensionnerA( LONG x, LONG y)
647 {
648 // Nous ne voulons pas que la taille soit inférieure à 100 pour les fenêtres de niveau supérieur dans le navigateur
649 if(x < 100)
650 x = 100;
651
652 if(y < 100)
653 y = 100;
654
655 SetWindowPos(m_hWndPrincipale, NULL, 0, 0, x, y, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
656
657 return S_OK;
658 }
659
660 STDMETHODIMP CFenetrePrincipale::redimensionnerDe( LONG x, LONG y)
661 {
662 RECT rcFenetre;
663 long w, h;
664
665 GetWindowRect(m_hWndPrincipale, &rcFenetre);
666
667 w = rcFenetre.right - rcFenetre.left + x;
668 h = rcFenetre.bottom - rcFenetre.top + y;
669
670 if(w < 100)
671 w = 100;
672
673 if(h < 100)
674 h = 100;
675
676 SetWindowPos(m_hWndPrincipale, NULL, 0, 0, w, h, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
677 return S_OK;
678 }
679
680
681 EXTERN_C const GUID CGID_MSHTML;
682 extern "C" BOOL APIENTRY OuvrirURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam);
683
684 LRESULT CFenetrePrincipale::GererCommande(WPARAM wParam, LPARAM lParam)
685 {
686 UINT nID = LOWORD(wParam);
687 switch (nID)
688 {
689 case ID_INTERNET_OPTIONS:
690 {
691 SHELLEXECUTEINFO sei;
692 sei.cbSize = sizeof(sei);
693 sei.fMask = SEE_MASK_FLAG_NO_UI;
694 sei.hwnd = m_hWndPrincipale;
695 sei.lpVerb = NULL;
696 sei.lpFile = L"ctlpnl";
697 sei.lpParameters = L"inetcpl.cpl";
698 sei.lpDirectory = NULL;
699 sei.nShow = SW_SHOWNORMAL;
700
701 ShellExecuteEx(&sei);
702 }
703 break;
704 case ID_FIND:
705 RechercherChaine();
706 break;
707 case ID_GO_BACK:
708 m_pNavigateur->GoBack();
709 return 0;
710 case ID_GO_FORWARD:
711 m_pNavigateur->GoForward();
712 return 0;
713 case ID_GO_HOME:
714 m_pNavigateur->GoHome();
715 return 0;
716 case ID_GO_SEARCH:
717 m_pNavigateur->GoSearch();
718 return 0;
719 case ID_VIEW_REFRESH:
720 m_pNavigateur->Refresh();
721 return 0;
722 case ID_VIEW_STOP:
723 m_pNavigateur->Stop();
724 return 0;
725
726 case ID_ZOOMUP:
727 m_iZoom++;
728 if(m_iZoom > 4)
729 m_iZoom = 4;
730 ChangerTaillePolice(FALSE);
731 return 0;
732
733 case ID_ZOOMDOWN:
734 m_iZoom--;
735 if(m_iZoom < 0)
736 m_iZoom = 0;
737 ChangerTaillePolice(FALSE);
738 return 0;
739 case ID_CLOSE:
740 m_pNavigateur->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
741 return 0;
742 case ID_FOCUS_URL:
743 case ID_OPEN:
744 {
745 WCHAR *szURL = new TCHAR[MAX_URL];
746 if(szURL)
747 {
748 int nRet = 0;
749 BSTR bstrURL = NULL;
750 m_pNavigateur->get_LocationURL(&bstrURL);
751 nRet = StringCchCopy(szURL, MAX_URL, (LPCTSTR)bstrURL);
752 SysFreeString(bstrURL);
753
754 nRet = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_OPEN_DIALOG), m_hWndPrincipale, OuvrirURLDlgProc, (long)szURL);
755 bstrURL = SysAllocString(szURL);
756 if(nRet == 1)
757 {
758 m_pNavigateur->Navigate(bstrURL, NULL, NULL, NULL, NULL);
759 }
760 else if(nRet == 2)
761 {
762 GererNouvelleFenetre2(bstrURL,NULL);
763 }
764 SysFreeString(bstrURL);
765 delete[] szURL;
766 }
767 }
768 return 0;
769 case ID_FULLSCREEN:
770 {
771 DWORD dwStyle = GetWindowLong(m_hWndPrincipale, GWL_STYLE);
772 if(m_bPleinEcran)
773 {
774 dwStyle |= (WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME);
775 SetWindowLong(m_hWndPrincipale, GWL_STYLE, dwStyle);
776 SetWindowPos(m_hWndPrincipale,NULL, m_rcFenetre.left, m_rcFenetre.top, m_rcFenetre.right-m_rcFenetre.left, m_rcFenetre.bottom-m_rcFenetre.top, SWP_NOZORDER);
777 m_bPleinEcran = FALSE;
778 }
779 else
780 {
781 RECT rcZoneTravail;
782
783 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcZoneTravail, 0);
784 m_bPleinEcran = TRUE;
785 dwStyle &= ~(WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME);
786
787 SetWindowLong(m_hWndPrincipale, GWL_STYLE, dwStyle);
788 SetWindowPos(m_hWndPrincipale,NULL, rcZoneTravail.left, rcZoneTravail.top, rcZoneTravail.right-rcZoneTravail.left, rcZoneTravail.bottom-rcZoneTravail.top, SWP_NOZORDER);
789
790 }
791 }
792 return 0;
793 }
794 return 0;
795 }
796
797
798
799
800
801 EXTERN_C const GUID CGID_ShellDocView;
802
803 LRESULT CALLBACK CFenetrePrincipale::ProcFenetrePrincipale(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
804 {
805 CFenetrePrincipale *pFenPrinc = (CFenetrePrincipale*)GetWindowLong(hwnd, GWL_USERDATA);
806
807 if(pFenPrinc)
808 {
809 switch (message)
810 {
811 case WM_CLOSE:
812 case WM_DESTROY:
813 if(pFenPrinc)
814 pFenPrinc->Fermer();
815 SetWindowLong(hwnd, GWL_USERDATA, (DWORD)0);
816 ::PostQuitMessage(0);
817 break;
818 case WM_SETFOCUS:
819 if(pFenPrinc->m_pObjetActif)
820 {
821 pFenPrinc->m_pObjetActif->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE);
822 }
823 return 0;
824 case WM_SIZE:
825 {
826 RECT rcFen;
827 GetClientRect(hwnd, &rcFen);
828 SetWindowPos(pFenPrinc->m_hWndNavigateur,
829 NULL,
830 0,
831 0,
832 rcFen.right-rcFen.left,
833 rcFen.bottom - rcFen.top,
834 SWP_NOZORDER);
835 }
836 // FALL THROUGH
837 case WM_MOVE:
838 if(!pFenPrinc->m_bPleinEcran)
839 GetWindowRect(hwnd, &pFenPrinc->m_rcFenetre);
840 break;
841 case WM_COMMAND:
842 return pFenPrinc->GererCommande(wParam, lParam);
843 break;
844
845 case WM_NOTIFY:
846 break;
847
848 case WM_INITMENUPOPUP:
849 break;
850
851 case WM_SETTINGCHANGE:
852 if(wParam == SPI_SETWORKAREA)
853 {
854 if(pFenPrinc->m_bPleinEcran)
855 {
856 RECT rcZoneTravail;
857 // pas besoin de changer le style de fenêtre ici, juste ajuster pour la nouvelle zone de travail.
858 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcZoneTravail, 0);
859 SetWindowPos(pFenPrinc->m_hWndPrincipale,NULL, rcZoneTravail.left, rcZoneTravail.top, rcZoneTravail.right-rcZoneTravail.left, rcZoneTravail.bottom-rcZoneTravail.top, SWP_NOZORDER);
860 }
861 }
862 break;
863 default:
864 break;
865 }
866 }
867 return DefWindowProc(hwnd, message, wParam, lParam);
868 }
869
870 BOOL CFenetrePrincipale::PreTranslateMessage(LPMSG pMsg)
871 {
872 if(::TranslateAccelerator(m_hWndPrincipale, m_hTblAccel, pMsg)) //première tentative vers le frame principal
873 return TRUE;
874
875 //ensuite vers mshtml
876 if(m_pObjetActif && pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
877 {
878 HRESULT hr = m_pObjetActif->TranslateAccelerator(pMsg);
879 return (hr != S_FALSE);
880 }
881 return FALSE;
882 }
883
884 VOID CFenetrePrincipale::ChangerTaillePolice(BOOL fInit)
885 {
886 VARIANT vaSize;
887 vaSize.vt = VT_I4;
888
889 if(fInit) {
890 // Définir la valeur initiale
891 vaSize.vt = 0;
892 HRESULT hr = m_pNavigateur->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
893 NULL, &vaSize);
894 m_iZoom = vaSize.lVal;
895 } else {
896 vaSize.lVal = m_iZoom;
897 HRESULT hr = m_pNavigateur->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
898 &vaSize, NULL);
899 }
900 }
901
902 VOID CFenetrePrincipale::Fermer()
903 {
904 RETAILMSG(1,(L"NAVIGATEUR CFenetrePrincipale::Fermer"));
905
906 // Dire au shell de mourir
907 SendMessage(m_hWndNavigateur, WM_CLOSE, 0,0);
908
909
910 if(m_pObjetActif)
911 {
912 m_pObjetActif->Release();
913 }
914 m_pObjetActif = NULL;
915 if(m_pCP)
916 {
917 m_pCP->Unadvise(m_dwCookieEvenement);
918 m_pCP->Release();
919 }
920 m_pCP = NULL;
921 if(m_pObjet)
922 {
923 m_pObjet->Close(FALSE);
924 m_pObjet->Release();
925 }
926 m_pObjet = NULL;
927 if(m_pNavigateur)
928 m_pNavigateur->Release();
929 m_pNavigateur = NULL;
930
931 }
932
933
934
935
936 HRESULT CFenetrePrincipale::RechercherChaine()
937 {
938 LPDISPATCH pDisp = NULL;
939 LPOLECOMMANDTARGET pCmdTarg = NULL;
940 HRESULT sts = S_OK;
941 VARIANTARG var;
942
943 #define GOERROR_S(bNotCond) {if(!(bNotCond)) goto errorS; }
944
945 if(!m_pNavigateur)
946 return S_OK;
947 sts = m_pNavigateur->get_Document(&pDisp);
948 GOERROR_S(pDisp);
949 sts = pDisp->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pCmdTarg);
950 GOERROR_S(pCmdTarg);
951
952 var.vt = VT_I4;
953 var.lVal = 0;
954 sts = pCmdTarg->Exec(
955 NULL,
956 OLECMDID_FIND,
957 MSOCMDEXECOPT_PROMPTUSER,
958 NULL,
959 &var);
960
961 errorS:
962 if(pCmdTarg)
963 pCmdTarg->Release(); // release document's command target
964 if(pDisp)
965 pDisp->Release(); // release document's dispatch interface
966 return sts;
967 }
968
969
970
971
972 BOOL GererParcourir(HWND hwndOwner, WCHAR *szURL);
973
974 extern "C" BOOL APIENTRY OuvrirURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
975 {
976
977 WCHAR *szURL = (WCHAR *)GetWindowLong(hDlg,DWL_USER);
978 int nRet = 4;
979
980 switch(message)
981 {
982
983 case WM_INITDIALOG:
984 {
985 if(!lParam)
986 {
987 EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
988 EnableWindow(GetDlgItem(hDlg, IDC_BROWSE), FALSE);
989 }
990 else
991 {
992 szURL = (WCHAR *)lParam;
993 SetWindowLong(hDlg, DWL_USER, (LONG)szURL);
994 SendMessage(GetDlgItem(hDlg, IDC_URL_EDIT), EM_LIMITTEXT, MAX_URL-1, 0);
995 if(szURL[0])
996 {
997
998 SetDlgItemText(hDlg, IDC_URL_EDIT, szURL);
999 }
1000 }
1001
1002 }
1003 return TRUE;
1004
1005 case WM_COMMAND:
1006 switch (LOWORD(wParam))
1007 {
1008
1009 case IDOK:
1010 {
1011 GetDlgItemText(hDlg, IDC_URL_EDIT, szURL, MAX_URL-1);
1012 BOOL bNouvFen = SendMessage(GetDlgItem(hDlg, IDC_NEWWINDOW), BM_GETCHECK, 0L, 0L);
1013 nRet = (bNouvFen) ? 2 : 1;
1014 }
1015 case IDCANCEL:
1016 EndDialog(hDlg, nRet);
1017 return TRUE;
1018
1019
1020 case IDC_BROWSE:
1021 if(GererParcourir(hDlg, szURL))
1022 {
1023 SetDlgItemText(hDlg, IDC_URL_EDIT, szURL);
1024 }
1025
1026 default:
1027 return (TRUE);
1028 }
1029 break;
1030
1031 case WM_DESTROY:
1032 SetWindowLong(hDlg, DWL_USER, 0);
1033 break;
1034
1035 }
1036 return (FALSE);
1037
1038
1039 }
1040
1041
1042 extern HINSTANCE g_hInstance;
1043 BOOL GererParcourir(HWND hwndOwner, WCHAR *szURL)
1044 {
1045
1046 OPENFILENAME ofn;
1047 WCHAR wchFiltre[MAX_PATH];
1048 WCHAR wchFichier[MAX_PATH+8];
1049 int cbLen;
1050
1051
1052 // Initialiser la structure ofn
1053 memset(&ofn, 0, sizeof(ofn));
1054 ofn.lStructSize = sizeof(ofn);
1055 ofn.hwndOwner = hwndOwner;
1056 ofn.Flags = OFN_FILEMUSTEXIST |
1057 OFN_PATHMUSTEXIST |
1058 OFN_OVERWRITEPROMPT |
1059 OFN_HIDEREADONLY;
1060
1061 cbLen = LoadString(g_hInstance, IDS_BROWSEFILTER,
1062 wchFiltre, MAX_PATH-2);
1063
1064 if(cbLen>0)
1065 {
1066 for (; cbLen >= 0; cbLen--)
1067 {
1068 if(wchFiltre[cbLen]== L'@')
1069 {
1070 wchFiltre[cbLen] = 0;
1071 }
1072 }
1073 }
1074 else
1075 {
1076 return FALSE;
1077 }
1078
1079
1080 ofn.lpstrFilter = wchFiltre;
1081 ofn.nFilterIndex = 1;
1082 wcscpy(wchFichier, L"file://");
1083
1084 ofn.lpstrFile = wchFichier+wcslen(wchFichier); // préfixer la chaîne avec "file://"
1085 ofn.nMaxFile = MAX_PATH;
1086 if(GetOpenFileName(&ofn))
1087 {
1088 wcsncpy(szURL, wchFichier, MAX_URL-1);
1089 return TRUE;
1090 }
1091
1092 return FALSE;
1093
1094 }