Implémentation d'un Navigateur Web Personnalisé avec les API Windows

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 }  

Étiquettes: Windows API C++ COM Web Browser Control IE Integration

Publié le 14 juin à 17h13