Conteneur activex 100% api

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 / Exemple :


#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);
}
/******************************************************************************/

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.