Conteneur activex 100% api

Soyez le premier à donner votre avis sur cette source.

Vue 23 005 fois - Téléchargée 1 789 fois

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

Ajouter un commentaire

Commentaires

BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Quand simplicité rime avec efficacité, en voilà une parfaite demonstration qui sera utile à beaucoup de gens.
EXCELLENT !!!
cs_supergrey
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010
-
Ca marche nickel !
cs_Urgo
Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1 -
Superbe exemple tu nous délivres ici! 10/10

Par contre comment éviter les problèmes de cliglotements lors du redimensionnement de la fenêtre? (j'ai essayé de chercher sous 'flicker free", etc... mais rien de bien intéressant de trouvé!)
scolinks
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005
-
10 sur 10!
cs_eRoZion
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1 -
Et bé bravo ...
Je me souviens que ca fait un sacré bout de temps que t'es dessus (vous étiez deux d'ailleurs je crois) et qu'on t'avait pas mal découragé.

Ca peut être carrément utile.

10


eRoZion

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.