|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
CONTENEUR ACTIVEX 100% API
Information sur la source
Description
J'ai le plaisir de partager avec vous, et en exclusivité sur cppfrance, une belle petite trouvaille. On m'a déja dit qu'il faut être maso pour réaliser un conteneur Activex sans faire appel aux MFC ou ATL. Eh bien, ce n'est plus le cas. En effet, il suffit d'ajouter cinq petites lignes de code, dans un projet win32, pour transformer n'importe quel contrôle (static, edit, bouton etc...) en conteneur Activex. Voici ces cinq petites lignes: 1 - typedef HRESULT (WINAPI *PFonc)(IUnknown*,HWND,IUnknown**); 2 - HINSTANCE hDLL = LoadLibrary("atl.dll"); 3 - PFonc AtlAxAttachControl = (PFonc) GetProcAddress(hDLL,"AtlAxAttachControl"); 4 - AtlAxAttachControl(pointeurInterface,hWndConteneur,0); 5 - FreeLibrary(hDLL); Comme vous le voyez, tout le secret réside dans l'utilisation de la fonction "AtlAxAttachControl" contenue dans "atl.dll". Je l'ai testé avec plus d'une vingtaine de contrôles Activex sans aucun problème. C'est tellement simple qu'on se demande pourquoi personne n'y avait pensé avant. Même Microsoft... Ce code source utilise l'Activex "WebBroser" pour afficher une page html grâce à l'interface "IWebBrowser2". Il s'agit de votre page de démarrage. Ca marche parfaitement sur Windows 98, 2000 et XP. J'aimerais bien savoir si cette méthode comporte des inconvénients. J'en ai pas trouvés après de longs tests. J'attends vos réactions.
Source
- #include <windows.h>
- #include <exdisp.h>
-
- // Déclaration du HWND de notre conteneur en global:
- HWND conteneur;
-
- /***************** Procédure de notre fenêtre principale *********************/
- LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
- {
- switch(messg)
- {
- case WM_SIZE:
- // Redimensionnement du conteneur quand la taille de la fenêtre change:
- MoveWindow(conteneur,0,0,LOWORD(lParam), HIWORD(lParam),1);
- break;
-
- case WM_CLOSE:
- // Détruire la fenêtre principale:
- DestroyWindow(hWnd);
- break;
-
- case WM_DESTROY:
- // Envoyer le message de sortie du programme:
- PostQuitMessage( 0 );
- break;
-
- default:
- //Retour:
- return( DefWindowProc( hWnd, messg, wParam, lParam ) );
- }
- return 0;
- }
- /***************************************************************************/
-
- /********************* Fonction WinMain ************************************************/
- int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
- {
- // Déclarer notre classe de fenêtre et définir ses membres:
- WNDCLASS wc;
- char NomClasse[] = "Conteneur";
- wc.lpszClassName = NomClasse;
- wc.hInstance = hInst;
- wc.lpfnWndProc = WndProc;
- wc.hCursor = LoadCursor( 0, IDC_ARROW );
- wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
- wc.lpszMenuName = 0;
- wc.hbrBackground = 0;
- wc.style = 0;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- // Enregistrer la classe de notre fenêtre:
- if (!RegisterClass(&wc)) return 0;
-
- // Créer notre fenêtre principale:
- HWND hWnd = CreateWindow( NomClasse,"Conteneur Activex",WS_OVERLAPPEDWINDOW,0,0,800,575, 0, 0, hInst,0);
- // Montrer la fenêtre:
- ShowWindow(hWnd, nCmdShow );
- UpdateWindow( hWnd );
-
- // Charger la DLL "atl.dll" pour notre programme:
- HINSTANCE hDLL = LoadLibrary("atl.dll");
- // Définir le type de pointeur pour la fonction "AtlAxAttachControl":
- typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
- // Récupérer l'adresse de la fonction "AtlAxAttachControl":
- PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
- // Obtenir les dimensions de notre fenêtre:
- RECT rect;
- GetClientRect(hWnd,&rect);
- // Créer l'EDIT qui servira de conteneur Activex:
- conteneur=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
- // Initialiser la librairie COM pour notre programme:
- CoInitialize(0);
- // Déclarer un pointeur sur l'interface IWebBrowser2:
- IWebBrowser2 *pIwb;
- // Créer une instance de l'objet WebBrowser et de l'interface IWebBrowser2:
- CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
- // Attacher l'objet WebBrowser à notre EDIT conteneur:
- AtlAxAttachControl(pIwb,conteneur,0);
- // Lancer la page de démarrage:
- pIwb->GoHome();
-
- // Boucle des messages:
- MSG Msg;
- while( GetMessage(&Msg, 0, 0, 0))
- {
- TranslateMessage( &Msg );
- DispatchMessage( &Msg );
- }
-
- // Libérer l'interface IWebBrowser2:
- pIwb->Release();
- // Fermer la librairie COM pour notre programme:
- CoUninitialize();
- // Fermer la DLL "atl.dll":
- FreeLibrary(hDLL);
- // Quitter le programme:
- return( Msg.wParam);
- }
- /******************************************************************************/
#include <windows.h>
#include <exdisp.h>
// Déclaration du HWND de notre conteneur en global:
HWND conteneur;
/***************** Procédure de notre fenêtre principale *********************/
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{
switch(messg)
{
case WM_SIZE:
// Redimensionnement du conteneur quand la taille de la fenêtre change:
MoveWindow(conteneur,0,0,LOWORD(lParam), HIWORD(lParam),1);
break;
case WM_CLOSE:
// Détruire la fenêtre principale:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
// Envoyer le message de sortie du programme:
PostQuitMessage( 0 );
break;
default:
//Retour:
return( DefWindowProc( hWnd, messg, wParam, lParam ) );
}
return 0;
}
/***************************************************************************/
/********************* Fonction WinMain ************************************************/
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{
// Déclarer notre classe de fenêtre et définir ses membres:
WNDCLASS wc;
char NomClasse[] = "Conteneur";
wc.lpszClassName = NomClasse;
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor( 0, IDC_ARROW );
wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
wc.lpszMenuName = 0;
wc.hbrBackground = 0;
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// Enregistrer la classe de notre fenêtre:
if (!RegisterClass(&wc)) return 0;
// Créer notre fenêtre principale:
HWND hWnd = CreateWindow( NomClasse,"Conteneur Activex",WS_OVERLAPPEDWINDOW,0,0,800,575, 0, 0, hInst,0);
// Montrer la fenêtre:
ShowWindow(hWnd, nCmdShow );
UpdateWindow( hWnd );
// Charger la DLL "atl.dll" pour notre programme:
HINSTANCE hDLL = LoadLibrary("atl.dll");
// Définir le type de pointeur pour la fonction "AtlAxAttachControl":
typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
// Récupérer l'adresse de la fonction "AtlAxAttachControl":
PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
// Obtenir les dimensions de notre fenêtre:
RECT rect;
GetClientRect(hWnd,&rect);
// Créer l'EDIT qui servira de conteneur Activex:
conteneur=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0);
// Initialiser la librairie COM pour notre programme:
CoInitialize(0);
// Déclarer un pointeur sur l'interface IWebBrowser2:
IWebBrowser2 *pIwb;
// Créer une instance de l'objet WebBrowser et de l'interface IWebBrowser2:
CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb);
// Attacher l'objet WebBrowser à notre EDIT conteneur:
AtlAxAttachControl(pIwb,conteneur,0);
// Lancer la page de démarrage:
pIwb->GoHome();
// Boucle des messages:
MSG Msg;
while( GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
// Libérer l'interface IWebBrowser2:
pIwb->Release();
// Fermer la librairie COM pour notre programme:
CoUninitialize();
// Fermer la DLL "atl.dll":
FreeLibrary(hDLL);
// Quitter le programme:
return( Msg.wParam);
}
/******************************************************************************/
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 29 janvier 2005 05:22:55 :
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
|