begin process at 2010 03 15 10:28:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > C/C++ SOUS WINDOWS TUTORIAL 3 : CREATION ET AFFICHAGE DE CONTRÔLES

C/C++ SOUS WINDOWS TUTORIAL 3 : CREATION ET AFFICHAGE DE CONTRÔLES


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :api, controle, bouton, button, wmcommand Niveau :Débutant Date de création :19/01/2006 Vu :9 329

Auteur : LaPatoshe

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Dans ce code, on va voir le système générique de création de contrôles. Pour agrémenter ce tuto d'un exemple, le control Button a été choisi. Ainsi, nous verrons d'une façon générale comment on crée et on gère un contrôle dans une appli Windows et plus spécifiquement le contrôle Button.

Source

  • C/C++ SOUS WINDOWS TUTORIAL 3 : Système de création et d'utilisation des contrôles
  • INTRODUCTION
  • Nous avons vu dans les tutoriaux précédents comment créer une fenêtre Windows, et comment écrire du texte dedans avec la gestion de l'évènement WM_PAINT.
  • Dans ce ouveau tutorial, nous allons voir comment créer des contrôles les afficher, et les utilise. Ce tutorial va être à la fois généraliste les contrôles se créant et se gérant tous d'une façon similaire, mais aussi spécialisé pour l'exmple dans la création et la gestion du contrôle button. Nous verrons au fil du temps que la création de contrôles et la gestion de leurs évènements présentent des divergences tant au point de vue paramètres utilisés qu'au point de vue de ce qu'il peuvent faire.
  • I) CREATION D'UN CONTROLE
  • Un contrôle s'identifie par son Handle (HWND) et se crée de la même façon qu'une feuille à savoir au moyen de la fonction CreateWindow. Ici, pas de déclaration de structure au préalable ce que nous avions fait pour la feuille au moyen de WNDCLASS. Pas besoin non plus de la fonction RegisterClass. l'API connait déjà nos contrôles et comment ils doivent apparaitre dans leur forme basique.
  • Ainsi, pour créer par exemple un controle Button nous allons avoir comme premier paramètre de CreateWindow la chaine "button". "button" est connu de l'API.
  • Notre contrôle Button, nous voulons qu'il contienne en texte (Caption) le mot Annuler par exemple. Notre deuxième paramètre de CreateWindow va donc être "Annuler".
  • Le troisième paramètre nous l'avions vu dans le premier tutorial correspond à la hérarchie de l'élément que nous créons. Une feuille est au premier rang donc a pour paramètre WS_OVERLAPPED_WINDOW par exemple. Un contrôle lui est rattaché à une feuille, donc est hiérarchiquement inférieur à elle. Notre troisième paramètre va donc être WS_CHILD. Ensuite, comme pour la feuille, arrivent les quatres paramètres de coordonées (position à gauche, position en haut, longueur, hauteur).
  • Puisque notre contrôle est hiérarchiquement inférieur à une feuille qui le contient, le huitième paramètre de CreateWindow va donc être le Handle de cette feuille. Donc hFenetre pour reprendre le nom du Handle de la fenêtre du tutorial 1. Ensuite, les paramètres restent pour notre exemple 0, hInstance et 0.
  • Voici donc notre fonction de création de bouton :
  • HWND hBouton;
  • hBouton = CreateWindow("button", "Annuler", WS_CHILD, 30, 30, 100, 30, hFenetre, 0, hInstance, 0);
  • Pour que le contrôle soit effectivement visible, comme pour l'affichage de la feuille, on conclut par :
  • ShowWindow (hBouton, nShowCmd);
  • Voilà, en rajoutant la déclaration de hBouton, en tête du programme et les deux lignes précédentes de création et d'affichage du bouton sur la feuille à la suite de la création de cette feuille, votre programme une fois lancé doit faire apparaitre en haut à gauche aux coordonnées 30,30 de votre feuille un bouton de commande Annuler.
  • Nota : Ce bouton de commande comme tous les contrôle qui sont crés sous Windows ne nécessitent pas de proczdure particulière pour être redessinés lors de l'invalidation de la feuille. Ils se redessinent avec leur contenu de façon automatique. Pas besoin de coder pour eux WM_PAINT.
  • 2) GESTION DES EVENEMENTS D'UN CONTROLE
  • C'est dans la boucle WinProc que nous allons gérer les évènements des contrôles créés.
  • Les évènements vont être divers et variés, utile et inutiles suivant les contrôles. Qu'est ce qu'on demande à un bouton de comande par exemple ? Qu'il conduise le programme sur une certaine voie lorsqu'on click dessus. Qu'est ce qu'on demanderait à un contrpole edit ? Par exemple que quelque chose se produise lorsque son texte change ou que l'on clique dedans. Je cite ces exemples volontairement, pour comprendre, qe le changement du texte d'un contrôle button n'est pas un évènement principal de ce contrôle. Ce serait normalement programmable, mais le bouton de commande est à la base créé pour réagir à un click sur lui.
  • Ce bouton de commande pour l'utiliser pour l'exemple dans sont rôle principal est géré par l'évènement WM_COMMAND. Ainsi, lorsque un click est effectué sur ce bouton, un message WM_COMMAND est envoyé à WinProc. Et ce message va contenir non pas dans son paramètre hWnd mais dans son paramètre lParam des informations sur le bouton qui vient de recevoir le message. Immaginons que notre feuille contienne plusieurs contrôles button, on ne pourrait pas savoir lors de l'envoie du message WM_COMMAND lequel a été cliqué. Cette information se trouve à l'intérieur du paramètre lParam. Et comme nous le savons, lParam n'est pas de type HWND et ne nous permet donc pas directement de le comparer avec les handles des boutons créés. Il va alors falloir le caster
  • Ainsi notre code d'évènement du click d'un bouton va apparaître ainsi:
  • case WM_COMMAND:
  • {
  • if((HWND) lParam == hBouton)
  • {
  • //Procédure à effectuer en cas d'appuie sur hBouton
  • }
  • return 0;
  • }
  • WM_COMMAND est l'évènement principal d'un Bouton. Il y en a d'autres tels que ceux qui sont communs à tous les contrôles. Citons par exemple les évènements qui renvoient l'état d'un controle (visible, invisible, valide, invalide...) Nous verrons ultérieurement la gestions de ces messages.
  • 3) COMPLEMENT
  • A noter autre chose qui concerne la création du contrôle Bouton et qui se retrouve dans la création d'autres contrôles mais de façon parfois différentes.
  • Un contrôle dispose d'options d'apparence. Un contrôle quel qu'il soit peut être à sa création valide ou non, disposer d'une bordure ou non, dans le cas du bouton être un bouton simple, un bouton d'option ou un bouton de case à cocher...
  • Toutes ces options nous le verrons au fil du temps sont à rajouter au paramètre d'apparence du contrôle. Par exemple pour un bouton d'option, on écrira WS_CHILD | BS_RADIOBUTTON.
  • Si on veut une bordure autour de ce bouton d'option, il faudra rajouter | WS_BORDER.
  • Toutes ces options sont décrites dans le SDK de la programmation Windows. A savoir :
  • Les options générales attribuables aux fenêtres et contrôles commencent par WS_
  • Les options d'apparence propres aux boutons commencent par BS_
  • Les options d'apparence propres aux zones d'édition commencent par ES_
  • ... etc...
  • Voici ci dessous le programme complet d'affichage d'un bouton Annuler. Le Programme se termine lorsqu'on clique sur ce bouton.
  • #include <windows.h>
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
  • LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  • bool stop = false;
  • HWND hFenetre; //Attention, on place cette déclaration ici et non dans WinMain pour la portée de la variable hFenetre lors du WM_PAINT
  • HWND hBouton;
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  • {
  • MSG MessagesAEnvoyer;
  • WNDCLASS Fenetre;
  • Fenetre.lpszMenuName =NULL;
  • Fenetre.cbClsExtra =0;
  • Fenetre.cbWndExtra =0;
  • Fenetre.hInstance = hInstance;
  • Fenetre.lpfnWndProc = WinProc;
  • Fenetre.lpszClassName = "FENETRE DE TYPE A MOI";
  • Fenetre.style = CS_VREDRAW | CS_HREDRAW;
  • Fenetre.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  • Fenetre.hIcon =(HICON) LoadIcon(hInstance, IDI_APPLICATION);
  • Fenetre.hCursor =(HCURSOR) LoadCursor(hInstance, IDC_ARROW);
  • RegisterClass(&Fenetre);
  • hFenetre = CreateWindow("FENETRE DE TYPE A MOI", "Voici la fenêtre", WS_OVERLAPPEDWINDOW, 200, 200, 300, 250, NULL, NULL, hInstance, NULL);
  • ShowWindow(hFenetre,nShowCmd);
  • hBouton = CreateWindow("button", "Annuler", WS_CHILD | WS_BORDER, 30, 30, 100, 30, hFenetre, 0, hInstance, 0);
  • ShowWindow(hBouton, nShowCmd);
  • InvalidateRect(hFenetre, 0, FALSE);
  • while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0))
  • {
  • TranslateMessage (&MessagesAEnvoyer);
  • DispatchMessage (&MessagesAEnvoyer);
  • }
  • return 0;
  • }
  • LRESULT CALLBACK WinProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • switch (uMsg)
  • {
  • case WM_DESTROY:
  • {
  • stop = true ;
  • PostQuitMessage(0);
  • return 0;
  • }
  • case WM_PAINT:
  • {
  • HDC hDC;
  • hDC = GetWindowDC(hWnd);
  • PAINTSTRUCT Ps;
  • hDC = BeginPaint(hWnd, &Ps);
  • TextOut (hDC, 10, 10, "Voici notre Phrase", strlen("Voici notre Phrase"));
  • EndPaint(hWnd, &Ps);
  • return 0;
  • }
  • case WM_COMMAND:
  • {
  • if((HWND) lParam == hBouton)
  • {
  • DestroyWindow(hFenetre);
  • return 0;
  • }
  • return 0;
  • }
  • }
  • return DefWindowProc(hWnd, uMsg, wParam, lParam);
  • }
C/C++ SOUS WINDOWS TUTORIAL 3 : Système de création et d'utilisation des contrôles


INTRODUCTION
Nous avons vu dans les tutoriaux précédents comment créer une fenêtre Windows, et comment écrire du texte dedans avec la gestion de l'évènement WM_PAINT.
Dans ce ouveau tutorial, nous allons voir comment créer des contrôles les afficher, et les utilise. Ce tutorial va être à la fois généraliste les contrôles se créant et se gérant tous d'une façon similaire, mais aussi spécialisé pour l'exmple dans la création et la gestion du contrôle button. Nous verrons au fil du temps que la création de contrôles et la gestion de leurs évènements présentent des divergences tant au point de vue paramètres utilisés qu'au point de vue de ce qu'il peuvent faire.

I) CREATION D'UN CONTROLE
Un contrôle s'identifie par son Handle (HWND) et se crée de la même façon qu'une feuille à savoir au moyen de la fonction CreateWindow. Ici, pas de déclaration de structure au préalable ce que nous avions fait pour la feuille au moyen de WNDCLASS. Pas besoin non plus de la fonction RegisterClass. l'API connait déjà nos contrôles et comment ils doivent apparaitre dans leur forme basique.
Ainsi, pour créer par exemple un controle Button nous allons avoir comme premier paramètre de CreateWindow la chaine "button". "button" est connu de l'API. 
Notre contrôle Button, nous voulons qu'il contienne en texte (Caption) le mot Annuler par exemple. Notre deuxième paramètre de CreateWindow va donc être "Annuler".
Le troisième paramètre nous l'avions vu dans le premier tutorial correspond à la hérarchie de l'élément que nous créons. Une feuille est au premier rang donc a pour paramètre WS_OVERLAPPED_WINDOW par exemple. Un contrôle lui est rattaché à une feuille, donc est hiérarchiquement inférieur à elle. Notre troisième paramètre va donc être WS_CHILD. Ensuite, comme pour la feuille, arrivent les quatres paramètres de coordonées (position à gauche, position en haut, longueur, hauteur). 
Puisque notre contrôle est hiérarchiquement inférieur à une feuille qui le contient, le huitième paramètre de CreateWindow va donc être le Handle de cette feuille. Donc hFenetre pour reprendre le nom du Handle de la fenêtre du tutorial 1. Ensuite, les paramètres restent pour notre exemple 0, hInstance et 0.
Voici donc notre fonction de création de bouton : 
HWND hBouton;
hBouton = CreateWindow("button", "Annuler", WS_CHILD, 30, 30, 100, 30, hFenetre, 0, hInstance, 0);

Pour que le contrôle soit effectivement visible, comme pour l'affichage de la feuille, on conclut par : 
ShowWindow (hBouton, nShowCmd);

Voilà, en rajoutant la déclaration de hBouton, en tête du programme et les deux lignes précédentes de création et d'affichage du bouton sur la feuille à la suite de la création de cette feuille, votre programme une fois lancé doit faire apparaitre en haut à gauche aux coordonnées 30,30 de votre feuille un bouton de commande Annuler.

Nota : Ce bouton de commande comme tous les contrôle qui sont crés sous Windows ne nécessitent pas de proczdure particulière pour être redessinés lors de l'invalidation de la feuille. Ils se redessinent avec leur contenu de façon automatique. Pas besoin de coder pour eux WM_PAINT.

2) GESTION DES EVENEMENTS D'UN CONTROLE
C'est dans la boucle WinProc que nous allons gérer les évènements des contrôles créés.
Les évènements vont être divers et variés, utile et inutiles suivant les contrôles. Qu'est ce qu'on demande à un bouton de comande par exemple ? Qu'il conduise le programme sur une certaine voie lorsqu'on click dessus. Qu'est ce qu'on demanderait à un contrpole edit ? Par exemple que quelque chose se produise lorsque son texte change ou que l'on clique dedans. Je cite ces exemples volontairement, pour comprendre, qe le changement du texte d'un contrôle button n'est pas un évènement principal de ce contrôle. Ce serait normalement programmable, mais le bouton de commande est à la base créé pour réagir à un click sur lui.

Ce bouton de commande pour l'utiliser pour l'exemple dans sont rôle principal est géré par l'évènement WM_COMMAND. Ainsi, lorsque un click est effectué sur ce bouton, un message WM_COMMAND est envoyé à WinProc. Et ce message va contenir non pas dans son paramètre hWnd mais dans son paramètre lParam des informations sur le bouton qui vient de recevoir le message. Immaginons que notre feuille contienne plusieurs contrôles button, on ne pourrait pas savoir lors de l'envoie du message WM_COMMAND lequel a été cliqué. Cette information se trouve à l'intérieur du paramètre lParam. Et comme nous le savons, lParam n'est pas de type HWND et ne nous permet donc pas directement de le comparer avec les handles des boutons créés. Il va alors falloir le caster
Ainsi notre code d'évènement du click d'un bouton va apparaître ainsi:

case WM_COMMAND:
{
      if((HWND) lParam == hBouton)
      {
            //Procédure à effectuer en cas d'appuie sur hBouton
      }
      return 0;
}

WM_COMMAND est l'évènement principal d'un Bouton. Il y en a d'autres tels que ceux qui sont communs à tous les contrôles. Citons par exemple les évènements qui renvoient l'état d'un controle (visible, invisible, valide, invalide...) Nous verrons ultérieurement la gestions de ces messages.

3) COMPLEMENT
A noter autre chose qui concerne la création du contrôle Bouton et qui se retrouve dans la création d'autres contrôles mais de façon parfois différentes.
Un contrôle dispose d'options d'apparence. Un contrôle quel qu'il soit peut être à sa création valide ou non, disposer d'une bordure ou non, dans le cas du bouton être un bouton simple, un bouton d'option ou un bouton de case à cocher...
Toutes ces options nous le verrons au fil du temps sont à rajouter au paramètre d'apparence du contrôle. Par exemple pour un bouton d'option, on écrira WS_CHILD | BS_RADIOBUTTON.
Si on veut une bordure autour de ce bouton d'option, il faudra rajouter | WS_BORDER. 
Toutes ces options sont décrites dans le SDK de la programmation Windows. A savoir : 
Les options générales attribuables aux fenêtres et contrôles commencent par WS_
Les options d'apparence propres aux boutons commencent par BS_
Les options d'apparence propres aux zones d'édition commencent par ES_
... etc...


Voici ci dessous le programme complet d'affichage d'un bouton Annuler. Le Programme se termine lorsqu'on clique sur ce bouton.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);

LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
bool stop = false; 

HWND hFenetre; //Attention, on place cette déclaration ici et non dans WinMain pour la portée de la variable hFenetre lors du WM_PAINT
HWND hBouton;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{

MSG MessagesAEnvoyer;

WNDCLASS Fenetre; 
Fenetre.lpszMenuName =NULL;
Fenetre.cbClsExtra  =0;
Fenetre.cbWndExtra =0;
Fenetre.hInstance = hInstance; 
Fenetre.lpfnWndProc = WinProc;
Fenetre.lpszClassName = "FENETRE DE TYPE A MOI";
Fenetre.style =  CS_VREDRAW | CS_HREDRAW; 
Fenetre.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
Fenetre.hIcon =(HICON)  LoadIcon(hInstance, IDI_APPLICATION);
Fenetre.hCursor =(HCURSOR)  LoadCursor(hInstance, IDC_ARROW);

RegisterClass(&Fenetre);

hFenetre = CreateWindow("FENETRE DE TYPE A MOI", "Voici la fenêtre", WS_OVERLAPPEDWINDOW, 200, 200, 300, 250, NULL, NULL, hInstance, NULL);
ShowWindow(hFenetre,nShowCmd);

hBouton = CreateWindow("button", "Annuler", WS_CHILD | WS_BORDER, 30, 30, 100, 30, hFenetre, 0, hInstance, 0);
ShowWindow(hBouton, nShowCmd);

InvalidateRect(hFenetre, 0, FALSE);


while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0))
{ 
	TranslateMessage (&MessagesAEnvoyer); 
	DispatchMessage (&MessagesAEnvoyer);
}

return 0; 
}


LRESULT CALLBACK WinProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_DESTROY:
		{
			stop = true ;
			PostQuitMessage(0);
			return 0;
		}
		case WM_PAINT:
		{
			HDC hDC;
			hDC = GetWindowDC(hWnd);
			PAINTSTRUCT Ps;
			hDC = BeginPaint(hWnd, &Ps);
			TextOut (hDC, 10, 10, "Voici notre Phrase", strlen("Voici notre Phrase"));
			EndPaint(hWnd, &Ps);
			return 0;
		}
		case WM_COMMAND:
		{
			if((HWND) lParam == hBouton)
			{
				DestroyWindow(hFenetre);
				return 0;
			}
		return 0;
		}

	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam); 
}



 Sources du même auteur

C/C++ SOUS WINDOWS SANS MFC - TUTORIAL 2 : ECRITURE DANS UNE...
Source avec Zip ENREGISTREMENT ET RESTITUTION DE TEXTE EN EDIT MULTILINE
Source avec Zip CRÉATION DE CONTROLES AVEC CLASSE ET LIBRAIRIE PERSO SANS MF...
Source avec Zip C/C++ SOUS WINDOWS SANS MFC TUTORIAL 1

 Sources de la même categorie

Source avec Zip Source avec une capture CALENDRIER (WIN64) par BruNews
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS par racpp
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI... par racpp
Source avec Zip Source avec une capture BROUILLAGE DES FICHIERS JAVASCRIPT ET CSS(WIN32) par gagah1
Source avec Zip Source avec une capture CHANGE CURSEUR par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CALENDRIER (WIN64) par BruNews
Source avec Zip Source avec une capture GHLINK : CONTROLE POUR LES LIENS (WIN32) par gagah1
Source avec Zip Source avec une capture [C++/WIN32] TYPEDEF_VIEWER (CONTROLES ETENDUS) par yann_lo_san
Source avec Zip Source avec une capture UNE CLASSE BOUTON BITMAP POUR C++/MFC (TRÈS SIMPLE À UTILISE... par yann_lo_san
Source avec une capture DESSIN D'UN BOUTON À ENFONCER EN ALLEGRO ( C ) par mds_138

Commentaires et avis

Commentaire de BruNews le 19/01/2006 23:34:14 administrateur CS

Encore ce GetWindowDC !!! Vire le, surtout sans ReleaseDC c'est une calamité.
Dans WM_COMMAND il est d'usage de faire un switch sur wParam pour déterminer le type de commande, encore faudrait-il que tu attribues un ID aux controles.
Les "feuilles" c'est chez VB, en Windowsien natif tout est fenêtre mais avec un ordre hiérarchique.
Une fenêtre devrait créer ses controles 'enfant' dans WM_CREATE et non dans le WinMain du prog.
Faudrait regrouper avec ta source précédente mais surtout bien étudier Petzold avant, il y a trop de choses à revoir pour laisser cela ainsi.

Commentaire de LaPatoshe le 20/01/2006 00:45:58


_ Le fait de créer les contrôles dans WM_CREATE est mieux à quel niveau ?
_ Si j'enlève GetWindowDC, par quoi puis je le remplacer ?
Pour ce qui est de WM_COMMAND, je ne me sers pas des ID, je n'en ai jamais vraiment eu besoin, c'est peut être un tort, mais bon.

Commentaire de BruNews le 20/01/2006 09:55:04 administrateur CS

Une fenêtre n'a pas forcément la durée de vie du processus, on en crée au fur et à mesure des besoins et on les détruit quand ne servent plus. WM_CREATE sert donc à initialiser tout ce dont la fenêtre a besoin.
Le hdc dans WM_PAINT est obtenu par BeginPaint(), GetWindowDC() n'a strictement rien à faire dans cet event, ne le remplacer par rien du tout.

Commentaire de katsankat le 20/01/2006 18:25:45

Pourquoi ne pas le poster en tant que tutorial plutôt que code?

Autre question à quoi sert le bool stop?

La dernière ligne: return DefWindowProc(hWnd, uMsg, wParam, lParam);
ne retourne nulle part.

Commentaire de LaPatoshe le 20/01/2006 19:58:47

merci Brunews pour ces précisions.
J'ai placé le tuto dans la catégorie Code, c'est vrai que sa place est dans les tutoriaux. C'est une mauvaise habitude que je vais tenter de corriger.
A+

Commentaire de katsankat le 21/01/2006 20:39:53

En quelle langue faut-il que je demande si le bool stop est obligatoire et à quoi sert returndefwindproc.

Commentaire de BruNews le 21/01/2006 20:46:38 administrateur CS

bool stop est seulement le reste d'une modif pas encore nettoyée, ne sert à rien.
DefWindowProc sert à repasser au système tous les messages que l'on ne traite pas spécifiquement, c'est la procédure par défaut pour les fenêtres créées par CreateWindow[Ex].

Commentaire de wxccxw le 23/01/2006 16:45:16

j'aime bcp mais excuse moi pourquoi ne pas avoir poster dans Tutoriaux sur le site ???

Commentaire de hugues7E5 le 29/01/2006 20:54:40

Toujours interressant, mais si il y a de si grosses erreurs comme le dit BruNews, il serait bon de les corriger... je vais essayer de comprendre par moi-meme le WM_CREATE!

continue dans es tuto, mais avec plus d'éxactitudes!

merci encore

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

controle du volume audio général [ par roxanic ] BonjourJe cherche a controler les bouton de volume.Pour le bouton Wave c'est OK. Mais je ne trouve pas le solution pour le curseur du volume général.M grayed toolbar button? [ par nahs ] Bonjours,Comment faire pour griser un bouton du toolbar et pour griser un item du menu contextuelle c'est à dire du menu qui apparé lorsqu'on clic sur Créer un bouton [ par kazimir34 ] Bonsoir,Je suis en train de faire une application win32, et j'aimerais bien que dès que je fais un clic gauche, un bouton soit créé a l'emplacement de Image sur bouton (API win32) [ par LordBob ] Bonjour a tous,voila j'essaie de mettre une image sur un bouton de mon dialog, je procede donc comme ceci:HANDLE hImage;...hImage = LoadImage(hInst, " Default Button marche pas [ par guimou ] Salut, j'ai un pb avec une dialogbox : c'est une boite toute simple pour taper son mot de passe, ya juste un edit en mode password, un bouton OK et un impossible ajouter controle [ par keerigan ] Bonsoir , Je desire creer un petite applis en C++ qui accede au port com et qui grace a des bouton sur l'interface envoie des messages sur celui-ci ju Bouton + Icône ... comment ? - API Windows [ par banane_rose ] bon bah voil&#224; tout est dans le titre , j'ai mon image pr&#234;te ( "Quit.bmp" 16x16 ) CODE COMPLET ICI je veux ajouter l'ic&#244;ne sur Quitter Button et DrawItem [ par kalimanu ] Bonjour à tous! Je suis en train de faire ma propre classe de bouton (classe qui hérite de CButton biensur je suis pas fou quand meme). Pour personnal [api] Bouton non cliquable [ par hoGan ] Bonjour, je me demandais comment cr&#233;er un bouton non cliquable, et pouvoir le rendre cliquable par la suite.. Voil&#224; ce que j'ai essay&#233;: [api] Image qui s'efface [ par hoGan ] Bonjour, voil&#224; ce que je voudrais faire: lorsque j'appuie sur un bouton, faire appara&#238;tre une image, et faire en sorte que celle-ci ne disp


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales