Création d'une fenêtre simple

Création d'une fenêtre simple

DialogBox

Voir version :

Pas de dépendances

Télécharger :

Plusieurs fichiers :
04_12_01_simpledialog.c
04_12_01_resource.h
04_12_01_resource.rc


04_12_01_simpledialog.c

#include <windows.h> #include <commctrl.h> #include "04_12_01_resource.h" #pragma comment(lib,"comctl32.lib") //--------------------------------------------------------------------- INT_PTR CALLBACK DlgFenetre(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CLOSE: EndDialog(hDlg, 0); return TRUE; } return FALSE; } int main() { int ret; InitCommonControls(); ret = DialogBox(0, MAKEINTRESOURCE(IDD_FENETRE), 0, DlgFenetre); return 0; }


04_12_01_resource.h

#define IDD_FENETRE 100


04_12_01_resource.rc

#include <windows.h> #include "04_12_01_resource.h" IDD_FENETRE DIALOG 100, 100, 50, 45 STYLE DS_MODALFRAME|WS_VISIBLE|WS_CAPTION|WS_SYSMENU CAPTION "Titre" FONT 8, "Helv" BEGIN LTEXT "Plouf", -1, 10, 10, 50, 40 END END


Commentaires

	J'entame ici un chapitre qui pourrait devenir immense si je m'y penche.
	Car la création de fenêtre sous Windows est tellement souple que le nombre d'options possibles est énorme.

	Les codes proposés proposeront quelques options, quelques tests à faire dans les commentaires (il faut tout lire si vous êtres curieux)
	mais surement pas tout.
	Je proposerai souvent des liens vers la doc, pour que vous voyiez et essayiez les autres options proposées.

	Ce programme comporte 3 fichiers. (avec comme préfixe le numéro du paragraphe, mais ça n'a pas d'importance)
	simpledialog.c : le fichier main.
	resource.rc    : fichier ressource.
	resource.h     : un .h

	Pour compiler le programme, mettez le .c dans votre projet, ainsi que le .h, comme d'habitude.
	Pour insérer le fichier .rc, cliquez droit sur le projet, faites "ajouter", puis vous trouverez, par type, le fichier .rc

	Notez le include de <commctrl.h>, "commoncontrol", qui sert à faire des fenêtres de contrôle Windows.

	Il sera nécessaire d'inclure la librairie comctl32. (.lib ou .a selon que vous êtes sous Visual C++ ou Code::blocks)

	Compilez le, et lancez le. Vous devriez avoir une petite fenêtre qui s'ouvre, avec juste marqué "plouf" dedans.

	Commençons les explications.

	Regardez le main. 
	Tout d'abord, on appelle une fonction InitCommonControls, qui va initialiser tous les contrôles windows pour dessiner les fenêtres.
	Tel SDL_Init pour SDL, appelez cette fonction si vous faites des fenêtres Windows.	

	DialogBox.
	Cette fonction prend 4 paramètres :
	- l'Handle de l'exe qui l'appeller. En mettant 0, on dit que la fenêtre créée n'appartient à personne
	- la ressource à utiliser (voir ci dessous)
	- l'Handle de la fenêtre mère : si vous vouliez que la fenêtre soit sous une autre. Ici, non, donc 0.
	- la fonction CALLBACK de la fenêtre. Il s'agit de la fonction qui sera appelée automatiquement lors de l'interraction avec notre fenêtre.
	
	Vous voyez que c'est la fonction juste au dessus : DlgFenetre

	Nous verrons l'explication de cette fonction juste après.

FICHIER RC :
************

	Maintenant, nous allons regarder le fichier ressource, c'est lui qui va définir à proprement parler l'allure de la fenêtre.

	Cliquez sur le fichier rc dans votre projet, au besoin cliquez droit et faites "afficher le code"

	Le fichier contient d'abord deux lignes de include : on inclus Windows, et on inclus notre .h, vous allez vite voir pourquoi.

	La première ligne est la suivante :

	IDD_FENETRE DIALOG 100, 100, 50, 45

	Elle veut littéralement dire : "je crée un DIALOG (donc une fenêtre de contrôle Windows ), 
		d'identifiant IDD_FENETRE, à la position  100,100,   de largeur 50, et de hauteur 45.

	Notez que ces valeurs sont en "dialog unit" et non en pixels.

	Si vous changez ces valeurs, vous mettez la fenêtre ailleurs, ou changez sa taille.
	Doc : 
	http://msdn.microsoft.com/en-us/library/windows/desktop/aa381002(v=vs.85).aspx

	Avant de continuer, regardez l'identifiant : 
		IDD_FENETRE.

	Vous remarquerez en ouvrant le fichier .h qu'il est défini ici (avec une valeur à 100), et si vous retournez dans le main, vous verrez
	que le deuxième paramètre de DialogBox le référence (via la macro MAKEINTRESOURCE qui nous dit finalement qu'on va chercher la ressource)
	C'est donc cet identifiant qui fait le lien entre notre main, et la ressource qu'on voit.

	Il est d'usage de commencer à référencer ses identifiants à la valeur 100. Si vous en faites davantage, vous utiliserez 101,102,etc...

	continuons avec les lignes :
	
	STYLE DS_MODALFRAME|WS_VISIBLE|WS_CAPTION|WS_SYSMENU
	CAPTION "Titre"
	FONT 8, "Helv"
	
	qui sont des paramètres à la suite de la première ligne (on est revenu à la ligne par soucis de propreté)

	La doc que j'ai mentionné explique chacun de ces paramètres.

	- Nous avons CAPTION qui est le titre. Facile à comprendre pour le changer.

	- Nous avons STYLE pour définir le style de la fenêtre.
	Il y en a deux types : ceux qui commencent par WS
	http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx
	Et ceux qui commencent par DS
	http://msdn.microsoft.com/en-us/library/aa932937.aspx

	On peut allègrement mélanger les deux styles (avec des |) comme il est d'ailleurs fait dans notre exemple.

	Notez que si vous mettez DS_CENTER (essayez), la fenêtre sera centrée au milieu de l'écran. Dans ce cas donc, 
	les paramètres de placement (100,100 dans notre exemple) sont inutiles.

	Notez que si vous enlevez WS_SYSMENU, la croix pour fermer la fenêtre disparait. (il faudra donc la fermer depuis la barre
	de tâches ou killer le processus)

	- nous avons aussi FONT qui permet de choisir la police pour la fenêtre, avec sa taille.
	Changez donc le 8 en 20 pour voir.

	Vous noterez d'ailleurs que les tailles sont proportionnelles à la taille de la font : la fenêtre est plus grande et placée plus
	loin si vous agrandissez les font : le "dialog unit" dépend de cette valeur.

	Vous pouvez changer de font en changeant de nom (essayez "Arial")
	Et vous pouvez rajouter gras, italic comme ici :
	http://msdn.microsoft.com/en-us/library/windows/desktop/aa381013(v=vs.85).aspx

	Nous y voila. La fenêtre est définie.

	Que met on dedans ?

	Et bien on mettra ce qu'il y a entre BEGIN et END.

	Et ici, une seule chose :

	 LTEXT "Plouf", -1, 10, 10, 30, 40

   On écrit "Plouf", on ne lui donne pas d'identifiant (-1), à la position 10,10 dans la fenêtre, largeur 30 et hauteur 40 pixels
   Et on aligne le texte à gauche (LTEXT). Vous pouvez essayer de l'aligner à droite (RTEXT) ou au centre (CTEXT)
   mais notez que la fenêtre est en "dialog unit", et non en pixels, donc la zone que vous décrivez en pixels n'a pas la même unité.
   Il faudra que je vois un peu mieux ça.
   
   Passons.

   Et bien ça y'est, nous avons défini notre fenêtre.

LA FONCTION CALLBACK :
**********************

   Revenons au main. 

   La fonction DialogBox est bloquante jusqu'à ce que la fenêtre soit détruite. Et en attendant, chaque interaction avec la fenêtre 
   appellera un évenement, et donc la fonction callback (ou vous traiterez les évênements)
   Si vous cliquez dedans, si vous cliquez sur le bouton de fermeture (la croix), et même si vous la survoler, la fonction est appelée.

   Et c'est la qu'on dira ce qu'on veut faire.

   Regardons la fonction :

   INT_PTR CALLBACK DlgFenetre(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

   Tout d'abord, la signature de la fonction, vous n'y touchez pas. Quand la fonction est appelée, c'est qu'on a un évênement, 
   et tous les paramètres sont remplis.
   Vous les récupérez ou pas, mais ils sont la.
   Si vous avez fait de la SDL, c'est comme la gestion d'évênement dans SDL.

   Le premier paramètre à voir est le paramètre msg qui sera le type d'évênement.
   Nous switchons en fonction de ce paramètre.

   Il existe plein de paramètres possibles :
   http://msdn.microsoft.com/en-us/library/windows/desktop/ff468922(v=vs.85).aspx

	Ici, nous n'en testerons qu'un seul : WM_CLOSE

	C'est l'évênement qui est appelé quand on clique sur la croix.
	Si il se passe cela, on ferme la fenêtre avec :

	EndDialog(hDlg, 0);

	hDlg est le handle de la fenêtre, qu'on a dans la fonction.

	Et le 0 est le code de retour souhaité, celui qu'on aura dans "ret" dans le main. Changez le pour voir, et regardez ret.

	Voila donc l'idée, le programme se termine donc quand on appuie sur la croix car il passe dans le case qui appelle EndDialog,
	ce qui fait rendre la main à DialogBox