Laboratoire #B

Transcription

Laboratoire #B
Université du Québec
École de technologie supérieure
Département de génie de la production automatisée
Édition
2001
GPA-789 ANALYSE ET CONCEPTION ORIENTÉES OBJET
LABORATOIRE #B
GPA789  Analyse et conception orientées objet
LABORATOIRE #B
Auteur: Tony Wong, Ph.D. ing.
Département de génie de la production automatisée
École de technologie supérieure
courriel: tony.wong@etsmtl.ca
 2000 – 2002 DÉPARTEMENT DE GÉNIE DE LA PRODUCTION AUTOMATISÉE. TOUS DROITS RÉSERVÉS.
Table des matières
Introduction .............................................................................................................. 1
Objectifs pédagogiques........................................................................................... 1
Contenu du laboratoire............................................................................................ 2
Spécifications de l’interface graphique .............................................................. 2
Présentation de l’interface graphique ................................................................ 2
Éléments de l’interface graphique dans MFC ................................................. 10
Panneau de dialogue ................................................................................. 11
Contrôle intitulé DISQUES......................................................................... 12
Contrôle intitulé Dossiers ........................................................................... 12
Contrôle intitulé Fichiers............................................................................. 13
Contrôle intitulé Traitement ........................................................................ 14
Contrôle intitulé Action ............................................................................... 14
Quelques conseils............................................................................................ 15
Travaux à effectuer................................................................................................ 16
Liste des manipulations ................................................................................... 17
Manipulation #1 .......................................................................................... 17
Manipulation #2 .......................................................................................... 19
Manipulation #3 ......................................................................................... 20
Manipulation #4 .......................................................................................... 26
Manipulation #5 .......................................................................................... 26
Manipulation #6 .......................................................................................... 27
Manipulation #7 .......................................................................................... 29
Manipulation #8 .......................................................................................... 31
 2000 – 2002 DÉPARTEMENT DE GÉNIE DE LA PRODUCTION AUTOMATISÉE. TOUS DROITS RÉSERVÉS.
Manipulation #9 .......................................................................................... 32
Manipulation #10........................................................................................ 35
Contenu du rapport................................................................................................ 35
Annexe................................................................................................................... 36
LABORATOIRE #B  XTRACTCOMMGUI
Section
1
Laboratoire #B
Programmation MFC  Interface graphique pour XtractComm
Introduction
Le programme XtractComm a été développé dans le premier laboratoire de ce cours.
Sa fonction consistait à saisir, par la ligne de commande, un nom de fichier d’entrée et
un nom de fichier de sortie. Le fichier d’entrée doit être un fichier source en langage
C ou C++. Le fichier de sortie, après l’exécution du programme XtractComm,
contiendra les commentaires relevés dans le fichier source d’entrée. Le programme
XtractComm fonctionne en mode console. Il ne peut traiter qu’un seul fichier source
à la fois. Son utilisation est donc difficile et peu efficace.
Dans ce deuxième laboratoire, nous allons créer une interface graphique Windows
pour le programme XtractComm. La création de cette interface graphique sera
réalisée à l’aide du cadre de travail (Framework) MFC (Microsoft Foundation Library). Le
MFC réalise l’encapsulation des éléments de l’interface graphique à l’aide de classes
C++. Ainsi, les boutons, les fenêtres, et les menus, etc. sont représentés par des
classes appropriées de MFC. Le traitement des événements et des messages
normalement associé à la programmation Windows est remplacé par des tables de
messages et des fonctions membres dédiées. Ce sont les tables de messages qui
associent les messages et événements à des fonctions membres appropriées de
différentes classes MFC. Ces fonctions membres agissent donc comme des
gestionnaires de messages et événements (message and event handlers).
L’interface graphique de XtractComm sera appelée XtractCommGUI (XtractComm
Graphical User Interface). Elle permettra aux utilisateurs de sélectionner les fichiers à
traiter d’une manière visuelle. Les utilisateurs pourront sélectionner un ensemble de
fichiers à l’aide de la souris et les soumettre à XtractComm par l’activation d’un simple
bouton.
Objectifs pédagogiques
Les objectifs pédagogiques de ce laboratoire sont énumérés ci-dessous en ordre
décroissant d’importance:
‰
Apprendre la structure d’une application Windows utilisant le MFC.
PAGE B-1
LABORATOIRE #B  XTRACTCOMMGUI
‰
Comprendre le principe de programmation à l’aide d’un cadre de travail orientéobjet (le MFC).
‰
Acquérir une bonne expérience dans l’utilisation des bibliothèques de classes.
‰
Connaître les éléments de l’interface graphique Win32.
‰
Familiariser avec l’environnement de développement Visual C++.
Contenu du laboratoire
Cette section présente les explications détaillées de ce laboratoire. Lisez attentivement
l’exposé ci-dessous puisqu’il vous aidera certainement dans la réalisation du projet de
programmation.
Spécifications de l’interface graphique
Les caractéristiques de cette interface graphique sont :
1. Visualisation de contenu des disques de l’ordinateur. Les disques réseaux doivent
également être visibles par l’utilisateur. La présentation graphique de cette
visualisation doit être semblable à celle de l’explorateur Windows.
2. Présentation d’une liste de disques disponibles. La sélection d’un disque dans
cette liste doit provoquer l’affichage de son contenu dans l’interface graphique.
3. Affichage du contenu des dossiers dans une fenêtre séparée. Les utilisateurs
pourront alors choisir les fichiers à traiter à l’aide de la souris. De plus, les
utilisateurs doivent pouvoir sélectionner plus d’un fichier à la fois. Seuls les
fichiers portant l’extension .h, .hpp, .c, .cpp seront affichés dans cette fenêtre.
4. Activation de l’XtractComm à l’aide d’un simple bouton. Les fichiers sélectionnés
par l’utilisateur seront traités par XtractComm un par un à l’arrière plan.
5. Activation d’une barre de progression pour indiquer l’avancement des travaux
effectué par le programme XtractComm.
6. Présentation d’un panneau de message indiquant le nom et le numéro de la
version du programme XtractCommGUI.
Présentation de l’interface graphique
La présentation présentée dans la Figure 1 est une présentation suggérée pour
l’interface graphique de XtractComm. La base de l’interface est un panneau de
dialogue (Dialog Box). La liste de sélection des disques est placée juste au-dessus de la
fenêtre des dossiers.
PAGE B-2
LABORATOIRE #B  XTRACTCOMMGUI
Sélection des disques
Barre de progression
Présentation des dossiers du
disque sélectionné
*
Affichage des fichiers à
sélectionner
Figure 1 Présentation suggérée de l'interface graphique.
Dans la fenêtre des dossiers, une arborescence (CTreeCtrl) est utilisée pour présenter
les dossiers du disque sélectionné. Le premier disque rigide est toujours sélectionné
par défaut puisqu’il est le seul disque permanent de l’ordinateur.
À droite de la fenêtre des dossiers est une fenêtre montrant les fichiers (CListCtrl)
contenus dans le dossier sélectionné. Noter que seuls, les fichiers .c, .cpp, .h et
.hpp sont affichés dans cette fenêtre. La raison en est simple, les fichiers qui seront
traités par XtractComm sont ceux qui contiennent du code source C/C++. Il est
donc inutile d’afficher les autres fichiers. Les utilisateurs peuvent choisir un ou
plusieurs fichiers apparaissant dans cette fenêtre.
PAGE B-3
LABORATOIRE #B  XTRACTCOMMGUI
Le bouton libellé « Action » sert à enclencher l’extraction des commentaires contenus
dans les fichiers sélectionnés. Pendant, l’extraction des commentaires, la barre de
progression est activée par le programme pour montrer l’avancement des travaux
d’ExtractComm.
Puisque l’extraction des commentaires est réalisée par XtractComm, nous devons
effectuer des appels de système pour invoquer ce programme et lui assigner les
paramètres d’entrée nécessaires. Enfin, chaque invocation d’XtractComm extrait les
commentaires d’un fichier source. Il y aura donc autant d’invocations que de fichiers
sélectionnés par l’utilisateur.
Éléments de l’interface graphique dans MFC
Cette section présente les différents éléments de l’interface graphique à utiliser dans le
cadre de travail MFC. Vous devez consulter l’aide en-ligne de MFC pour
connaître tous les détails des classes mentionnées. Un nombre de pages d’aide
sont disponibles dans l’annexe de ce document.
Dans le jargon MFC (et de la programmation Windows en général), un élément
d’interface qui effectue des actions est appelé un élément de contrôle ou
simplement un contrôle. Dorénavant, le mot contrôle signifiera un élément graphique
tel un bouton, une liste de sélection, etc. Voici les éléments de contrôle de
l’application XtractCommGUI.
Objet CPicture inséré directement à l'aide de
l'éditeur de ressource
Objet de type CComboBox
Objet de type CListCtrl
Objet de type CTreeCtrl Objet de type CProgressCtrl
Objet de type CButton
PAGE B-10
LABORATOIRE #B  XTRACTCOMMGUI
Noter également que les contrôles de l’interface graphique XtractCommGUI sont
sélectionnés et manipulés à l’aide de l’éditeur de ressources de Visual C++. Après la
création du projet, vous pouvez sélectionner l’onglet « ResourceView » pour faire
afficher les ressources utilisées par le programme. Double cliquer sur le panneau de
dialogue (généré lors de la création du projet) pour démarrer l’éditeur de ressources.
Panneau de dialogue
Le panneau de dialogue sert de cadre pour les contrôles de XtractCommGUI. Vous
devez redimensionner la taille de ce panneau pour maintenir une bonne proportion
visuelle. Veuillez nommer ce panneau de dialogue par CXtractCommGUIDlg.
Normalement, ce nom est ajusté automatiquement par le AppWizard de Visual C++
et il joue le rôle de nom de classe de notre panneau de dialogue (classe dérivée de
CDialog).
C’est dans cette classe créée par le AppWizard que nous ajouterons le codage
nécessaire pour faire fonctionner notre programme. La classe CXtractCommGUIDlg
est dérivée de CDialog (voir le fichier généré XtractCommGUIDlg.h dans le
répertoire du projet). Un ensemble de fonctions prédéfinies sont automatiquement
ajoutées par le AppWizard dans la classe CXtractCommGUIDlg lors de la création des
fichiers CXtractCommGUIDlg.h et CXtractCommGUIDlg.h.
Ainsi, lorsque nous ajoutons d’un élément de contrôle dans ce panneau de dialogue à
l’aide de l’éditeur de ressource, nous devons également déclarer son existence dans la
déclaration de la classe CXtractCommGUIDlg.
Pour ce laboratoire, nous devons déclarer, dans la classe XtractCommGUIDlg, les
objets énumérés dans le Tableau 1. Voir la liste des manipulations afin de réaliser
cette tâche.
Objet de classe
CButton
CProgressCtrl
*
Rôle
Le bouton libellé « Action ».
La barre de progression pour indiquer l’avancement des
travaux.
CListCtrl
La liste des noms de fichiers contenus dans le dossier
sélectionné.
CTreeCtrl
La liste des dossiers du disque sélectionné mais
présentée sous forme d’arborescence.
CComboBox
La boîte de sélection pour la sélection d’un des disques
reliés à l’ordinateur (disques locaux ou disques réseaux).
Tableau 1 Objets à accès publics correspondants aux contrôles de l'interface graphique.
Nous aurons également deux autres objets pour les besoins internes du panneau de
dialogue.
PAGE B-11
LABORATOIRE #B  XTRACTCOMMGUI
Objet de classe
CString
CImageList
*
Rôle
Une chaîne de caractères représentant le chemin
courant. Le chemin courant est le chemin du dossier
sélectionné par l’utilisateur.
Une liste d’images utilisées dans la présentation des
dossiers du disque sélectionné. Les images montrant un
dossier ouvert et un dossier fermé sont entreposés dans
un objet de cette classe.
Tableau 2 Objets de support à accès privés de la classe CXtractCommGUIDlg.
Les sous-sections suivantes expliqueront le rôle de ces objets dans la globalité de
l’interface graphique XtractCommGUI.
Contrôle intitulé DISQUES
Ce contrôle est une boîte combo (de classe CComboBox de MFC). Il sert à montrer les
unités disques disponibles. L’algorithme utilisé pour la détection des unités
disques (locaux et réseaux) attachés à l’ordinateur est réalisé dans une
bibliothèque DLL que vous pourrez télécharger du site web de ce cours. Ce
contrôle est un objet de la classe CComboBox. On doit installer un gestionnaire de
message pour gérée la notification générée par l’objet de classe CComboBox .
‰
Cette notification est envoyée par l’objet lors de la sélection
d’un article dans la boîte combo.
CBN_SELCHANGE
À la réception de ce message, on doit mettre à jour la présentation des dossiers de
l’arborescence puisque l’utilisateur a sélectionné un autre disque.
*
Figure 2 La représentation graphique d'un objet de classe CComboBox.
Contrôle intitulé Dossiers
Ce contrôle donne une arborescence (de classe CTreeCtrl de MFC) des dossiers du
disque sélectionné. Il sert à montrer les dossiers contenus dans l’unité de disque
sélectionné dans le contrôle CComboBox. L’algorithme utilisé pour la fouille des
dossiers d’un disque sélectionné est réalisé dans une bibliothèque DLL que
PAGE B-12
LABORATOIRE #B  XTRACTCOMMGUI
vous pourrez télécharger du site web de ce cours. Ce contrôle est un objet de la
classe CTreeCtrl, il a besoin d’un objet de la classe CImageList pour afficher les
images représentant les dossiers du disque sélectionné. Dans ce laboratoire, nous
utiliserons un objet de la classe CTreeCtrl pour représenter les dossiers d’une unité
de disque. Ainsi, l’objet de support (classe CImageList) doit contenir une image
montrant un dossier ouvert et une autre pour représenter un dossier fermé. Nous
devons dessiner ces images à l’aide de l’éditeur de ressources de Visual C++. Nous
devons gérer les notifications générées par l’objet de classe CTreeCtrl :
‰
TVN_ITEMEXPANDING Répondre à cette notification lors de la sélection dans la
zone +/- de l’arbre des dossiers. Cette notification nous indiquer que l’utilisateur
désire étendre un dossier pour voir ses sous-dossiers.
‰
TVN_SELCHANGED
Répondre à cette notification lors de la sélection d’un dossier
dans l’arborescence des dossiers. Cette notification nous indiquer que l’utilisateur
désire visualiser le contenu des fichiers dans le dossier sélectionné.
Note : Nous devons utiliser le macro ON_NOTIFY pour installer les gestionnaires de
ces deux notifications.
Image du dossier "ouvert"
Image du dossier "fermé"
Figure 3 La représentation graphique d’un objet de classe CtreeCtrl. Observer l’image dossier ouvert et dossier fermé.
Contrôle intitulé Fichiers
Ce contrôle donne une liste de fichiers (de classe CListCtrl de MFC) du dossier
sélectionné. Il sert à montrer les fichiers ligne par ligne. Le rôle de ce contrôle
ressemble à celui utilisé dans l’explorateur Windows. Nous devons filtrer les fichiers
et ne conserver que ceux portant l’extension .h, .hpp, .c et .cpp. De plus, nous
devons montrer certaines caractéristiques supplémentaires des fichiers. Par exemple,
la taille, la date de la modification, les attributs, etc. Donc, nous devons utiliser une
représentation graphique en colonnes (semblable à l’explorateur Windows).
PAGE B-13
LABORATOIRE #B  XTRACTCOMMGUI
Ce contrôle de l’interface graphique doit permettre la sélection multiple et nous
pouvons répondre à la notification suivante qui sera générée par l’objet de classe
CListCtrl :
‰
Cette notification est générée par l’objet de classe CListCtrl lors de
la sélection par la souris d’un nom de fichier par l’utilisateur.
NM_CLICK
La représentation
graphique de l'objet de
classe CListCtrl est
organisé en colonnes
*
Figure 4 La représentation graphique de l'objet de classe CListCtrl.
Contrôle intitulé Traitement
Ce contrôle montre une barre de progression (de classe CProgressCtrl de MFC).
Cette barre de progression ne génère pas de notifications. Nous contrôlerons son
affichage par le biais de son objet associé.
*
Figure 5 La représentation graphique de l'objet de classe CProgressCtrl.
Contrôle intitulé Action
Ce contrôle est un bouton poussoir (de classe CButton de MFC). Lorsque l’utilisateur
appuie sur ce bouton, le programme démarre XtractComm pour traiter les fichiers
sélectionnés dans le contrôle intitulé Fichiers. La notification à traiter est :
‰
BN_CLICKED.
Répondre à cette notification pour démarrer la procédure
d’extraction des commentaires. Les fichiers sources à traiter sont ceux
sélectionnés dans le contrôle Fichiers. Utiliser l’indicateur libellé Traitement
pour montrer aux utilisateurs l’avancement des travaux.
PAGE B-14
LABORATOIRE #B  XTRACTCOMMGUI
*
Figure 6 La représentation graphique de l'objet de classe CButton.
Quelques conseils
‰
Placer le programme exécutable XtractComm.exe dans le répertoire Debug et
dans le répertoire principal de ce projet. De cette façon, vous pourrez tester le
programme XtractCommGUI à l’intérieur et à l’extérieur de l’environnement
Visual C++.
‰
Ne pas éditer ou enlever les commentaires ajoutés par le AppWizard de Visual
C++.
‰
Utiliser le ClassWizard pour ajouter vos classes et objets (variables membres et
fonctions membres) dans le projet.
‰
L’initialisation des contrôles s’effectue dans la fonction OnInitDialog() de la
classe CXtractCommGUIDlg.
‰
Les fonctions systèmes Win32 CreateProcess(), WaitForSingleObject()
GetExitCodeProcess() et CloseHandle() sont utilisées pour démarrer et
terminer XtractComm.exe afin d’extraire les commentaires des fichiers sources.
Ces fonctions systèmes sont expliquées dans les sections subséquentes de
ce document.
‰
Utiliser les classes contenues dans la bibliothèque XtractUtil.dll pour obtenir
les informations suivantes :
1. La description des disques attachés à l’ordinateur. Les disques peuvent être
locaux, réseaux, amovibles, non amovibles, etc.
2. Le nom des dossiers d’un disque et le nom des sous-dossiers dans un dossier
quelconque.
3. Le nom, la taille, la date de création, la date de la dernière écriture, la date du
dernier accès des fichiers d’un dossier.
L’utilisation de cette bibliothèque est indiquée dans le manuel accompagnant le
fichier XtractUtil.dll.
PAGE B-15
LABORATOIRE #B  XTRACTCOMMGUI
Section
2
Laboratoire #B
Programmation MFC  Interface graphique pour XtractComm
Travaux à effectuer
La réalisation de l’interface graphique du programme XtractCommGUI nécessite la
maîtrise des classes MFC et de l’environnement de développement de Visual C++.
Puisqu’il n’est pas possible de résumer tous les détails de MFC et de VC++ dans ce
manuel, vous devez consulter au besoin l’aide en-ligne de l’environnement de
développement (MSDN Library). Pour obtenir l’aide en-ligne : i) Cliquer sur le bouton
; ii) Déplacer le curseur sur le mot clé (de C++ ou MFC) puisque appuyer sur la
touche F1 du clavier. Dans les deux cas, vous obtiendrez l’interface de l’aide en-ligne.
La figure ci-dessous montre les différentes zones d’édition de l’interface que vous
pourrez utiliser pour obtenir de l’information.
Les différents manuels
de l'aide en-ligne
Rechercher un mot clé, une
instruction, une commande, etc.
Rechercher un mot clé, une
phrase dans tous les documents
de l'aide en-ligne.
Placer les documents
intéressants dans cet onglet pour
faciliter leur repérage.
*
Figure 7 Zones d'édition de l'aide en-ligne.
La création de XtractCommGUI nécessite une grande utilisation de AppWizard et de
ClassWizard. Donc, prenez le temps de se familiariser avec deux outils de
l’environnement de développement Visual C++.
PAGE B-16
LABORATOIRE #B  XTRACTCOMMGUI
Liste des manipulations
Manipulation #1
Créer le projet de programmation pour XtractCommGUI. Le projet doit être de type
« MFC AppWizard (exe) ». Les paramètres de ce projet sont montrés dans les figures
suivantes. Note : Ce projet crée un programme de type « Dialog-based ».
PAGE B-17
LABORATOIRE #B  XTRACTCOMMGUI
PAGE B-18
LABORATOIRE #B  XTRACTCOMMGUI
Voici la signification des fichiers générés
par AppWizard pour ce projet de
programmation.
Ces fichiers sont nécessaires
pour la pré-compilation des fichiers d’entête.
StdAfx.*
Ces
fichiers
contiennent la déclaration et la définition
d’une
classe
nommée
CXtractCommGUIApp
dérivée
de
CWinApp.
Un
objet
de
classe
CXtractCommGUIApp est également créé pour effectuer l’enregistrement de
l’application auprès du système Windows. Enfin, le fichier XtractCommGUI.rc
contient les ressources Windows utilisées par l’application.
XtractCommGUI.*
XtractCommGUIDlg.* Ces fichiers contiennent la déclaration et la définition de la
classe CXtractCommGUIDlg. Cette classe dérivée de la classe CDialog de MFC sera
associée au panneau de dialogue de l’application. Rappelez-vous que cette application
utilise un panneau de dialogue comme cadre de base.
Ce fichier contient l’identification numérique des contrôles de
l’application. L’identification des contrôles sera donnée dans les manipulations
subséquentes. L’environnement VC++ est responsable de générer la valeur
numérique correspondante et il l’enregistre dans ce fichier.
Resource.h
Manipulation #2
Dans l’éditeur de ressources (par l’onglet ResourceView) sélectionner le panneau de
dialogue de l’application. Ce panneau de dialogue créé par AppWziard porte
l’identification IDD_XTRACTCOMMGUI_DIALOG.
Positionner les éléments de l’interface graphique sur ce panneau de dialogue. La figure
suivante vous donner un exemple. Prévoyez une taille suffisamment grande pour que
les contrôles soient facilement visibles.
PAGE B-19
LABORATOIRE #B  XTRACTCOMMGUI
Manipulation #3
À l’aide de l’éditeur des ressources, régler les propriétés
du panneau de dialogue et des contrôles. Pour activer le
panneau des propriétés d’un élément graphique,
déplacer le curseur sur l’élément désiré puis appuyer sur
le bouton droit. Ensuite sélection l’option Properties.
Par la même occasion, vous constaterez que le menu
flottant dispose également une option pour exécuter le
ClassWizard et une option pour ajouter des
gestionnaires d’événements dans le programme
(Events…). Ces options seront utilisées dans les manipulations subséquentes de ce
laboratoire. Pour le moment, simplement choisir l’option Properties de ce menu
flottant et entrer les paramètres indiqués.
PAGE B-20
LABORATOIRE #B  XTRACTCOMMGUI
Pour le panneau de dialogue du programme
Pour la zone d’édition Combo
PAGE B-21
LABORATOIRE #B  XTRACTCOMMGUI
Pour l’arborescence des dossiers
PAGE B-22
LABORATOIRE #B  XTRACTCOMMGUI
Pour la liste des fichiers
Pour l’indicateur de progression
PAGE B-23
LABORATOIRE #B  XTRACTCOMMGUI
Pour le bouton Action
Pour le logo de l’application
D’abord créer une ressource bitmap de votre choix. La ressource peut être créée
directement dans l’éditeur de ressource
en suivant les étapes indiquées.
Dans
l’onglet
« ResourceView »,
sélectionner le dossier Bitmap. Cliquer
sur le bouton droit et choisir l’option
Insert
Bitmap.
Donner une
identification appropriée à ce Bitmap
(exemple : IDB_LOGO).
PAGE B-24
LABORATOIRE #B  XTRACTCOMMGUI
Double-cliquer sur l’identification
du bitmap et créer un dessin
approprié pour le logo dans
l’espace réservé.
Vous pouvez agrandir l’espace du
bitmap au besoin.
Activer le panneau des propriétés
du logo (Objet CPicture) une
fois la création du bitmap
terminée. Entrer les paramètres suivants dans le panneau des propriétés.
Pour les textes statiques
PAGE B-25
LABORATOIRE #B  XTRACTCOMMGUI
Manipulation #4
Pour permettre à l’utilisateur de naviguer à travers les contrôles par la touche TAB,
nous devons établir l’ordre de déplacement du « focus ».
Un contrôle peut recevoir l’entrée et interagir avec l’utilisateur s’il possède le focus.
Utiliser l’option Tab Order du menu Layout pour établir cet ordre. Vous établissez
l’ordre du déplacement en cliquant sur le contrôle.
Note : Lorsqu’un contrôle est accompagné de son libellé en texte statique, l’ordre du
texte statique doit précédé l’ordre du contrôle. Par exemple, le libellé « Fichiers
sources C/C++: » est en 5e position et le contrôle de type CListCtrl est en 6e
position.
Manipulation #5
Pour la représentation graphique de l’arborescence des dossiers, nous devons créer
une image bitmap pour identifier un dossier « fermé » et un dossier « ouvert ».
Normalement un dossier est en état fermé. Quand un utilisateur sélectionne un
dossier, nous devons présenter un dossier en état ouvert pour indiquer sa sélection.
Ces deux images du dossier sont contenues dans un seul bitmap. L’image bitmap sera
encapsulée dans un objet de classe CImageList puis associer à l’objet de
l’arborescence.
‰
Suivre les mêmes étapes que la création de l’image logo dans l’éditeur de
ressources.
‰
Donner le nom IDB_IMAGE_DOSSIERS à la ressource bitmap.
PAGE B-26
LABORATOIRE #B  XTRACTCOMMGUI
‰
Donner la taille 30 pixels par 12 pixels à l’image bitmap. Puisque ce bitmap
contient deux images (dossier ouvert, dossier fermé). La taille de chacune des
images est 15 pixel par 6 pixels.
Note : Cette image bitmap sera encapsulée dans un objet de classe
CImageList. Cette dernière sera passée en paramètre dans un objet de classe
CTreeCtrl associé à la représentation graphique de l’arborescence des
dossiers.
Manipulation #6
Les éléments de l’interface graphique sont maintenant établis. Il nous faut créer des
objets MFC pour mettre en fonction ces éléments graphiques. À noter que les
messages et notifications sont générés par des objets MFC. Donc, il existe une
séparation d’implantation entre la représentation graphique d’un contrôle apparaissant
à l’écran de l’ordinateur et leur fonctionnement dans le programme. Dans le
programme, nous interagissons avec le contrôle via son objet associé. L’utilisateur,
quant à lui, interagir avec le programme via la représentation graphique des contrôles.
La classe représentant le panneau de dialogue de notre
application
Notification, générée par le
bouton libellé Action, que
nous voulons gérer.
PAGE B-27
LABORATOIRE #B  XTRACTCOMMGUI
Activer le ClassWizard pour créer les objets associés aux contrôles du programme.
Pour ce faire, appuyer sur les touches ctrl-w. Le panneau des paramètres de
ClassWizard apparaîtra. Sélectionner l’onglet « Member Variables ». C’est dans cet
onglet que l’on indique à ClassWizard, le nom et le type des variables membres (lire
objets) qui seront associés à autres contrôles de l’application.
‰
Cliquer sur la ligne correspondante à l’identificateur ID_ACTION. Rappelez-vous
que ID_ACTION est l’identificateur du bouton libellé Action. Note :
L’identification de chacun des contrôles est donnée dans la manipulation
#3.
‰
Ensuite Cliquer sur le bouton « Add Variable ». Puisque donner le nom de l’objet
m_BoutonAction dans la zone d’édition.
Pour le bouton identifié par
ID_ACTION, donner le nom
m_BoutonAction dans la
zone « Member variable
name ».
Sélectionner
« Control » dans la liste
« Category ». Sélectionner la
classe « CButton » dans la
liste « Variable type ».
Donc, pour créer un objet MFC, il est nécessaire de donner le nom de l’objet (ex :
m_ButtonAction). Par convention de MFC, les variables membres sont préfixées de
m_ pour indiquer qu’elles sont membres d’une classe. La catégorie sert à indiquer si
l’objet est manipulé par sa valeur de retour seulement. Une variable membre qui est
représentée par valeur doit passer par le mécanisme DDX (Dynamic Data eXchange)
pour effectuer ses mises à jour. Noter que le DDX n’existe que dans les panneaux de
dialogue. Nous devons choisir la catégorie « Control » puisque nous devons pouvoir
effectuer nous-mêmes les mises à jours par programmation. Enfin, le type de la
variable membre sert à indiquer la classe MFC qui est le type de la variable à créer.
‰
Effectuer la même opération pour tous les contrôles de l’application. Sélectionner
le fichier XtractCommGUIDlg.h après la création des variables membres de
l’interface graphique. Dans la déclaration de la classe CXtratCommGUIDlg, vous
devez retrouver les entrées suivantes :
//{{AFX_DATA(CXtractCommGUIDlg)
enum { IDD = IDD_XTRACTCOMMGUI_DIALOG };
PAGE B-28
LABORATOIRE #B  XTRACTCOMMGUI
CButton m_BoutonAction;
CProgressCtrl m_BarreProgression;
CListCtrl
m_lcFichiers;
CtreeCtrl
m_ArbreDossiers;
CComboBox
m_cbDisque;
//}}AFX_DATA
Manipulation #7
La classe représentant le panneau de dialogue de notre
application
Notification, générée par le
bouton libellé Action, que
nous voulons gérer.
Les objets MFC sont créés, nous devons maintenant instaurer les gestionnaires de
messages et de notifications.
‰
Activer le ClassWizard par les touches ctrl-w. Sélectionner l’onglet « Message
Map ». Sélectionner ID_ACTION dans la liste « Object IDs ». Sélectionner la
notification BN_CLICKED dans la liste « Messages ». Cette notification est envoyée
au programme lorsque l’utilisateur appuie sur le bouton libellé Action. Nous
indiquons par cette procédure que nous désirons gérer cette notification. Enfin,
cliquer sur le bouton « Add Function » et donner un nom approprié aux
fonctions membres.
‰
Répéter la même procédure pour gérer les notifications suivantes :
PAGE B-29
LABORATOIRE #B  XTRACTCOMMGUI
L’arborescence des dossiers
Notification à gérer :
1. TVN_ITEMEXPANDING. Cette notification est générée lorsque l’utilisateur
clique sur la zone +/- de l’arborescence.
2. TVN_SELCHNAGED. Cette notification est générée lorsque l’utilisateur
sélectionne un autre dossier.
La liste de description des disques
Notification à gérer :
1. CBN_SELCHANGE. Cette notification est générée lorsque l’utilisateur
sélectionne un autre disque dans la boîte combo.
La liste des fichiers
Notification à gérer :
1. MN_CLICK. Cette notification est générée lorsque l’utilisateur sélectionne un
fichier de la liste.
À noter que la barre de progression ainsi que l’image logo ne produisent pas de
notification. Par contre, nous contrôlerons la barre de progression directement
par programmation. Vous devriez retrouver les ajouts suivants dans les fichiers
XtractCommGUIDlg.h et XtractCommGUIDlg.cpp à la fin de cette
manipulation.
Dans le fichier XtractCommGUIDlg.h :
// Generated message map functions
//{{AFX_MSG(CXtractCommGUIDlg)
virtual BOOL OnInitDialog();
virtual void OnOK();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnSelchangeComboDisque();
afx_msg void OnItemexpandingArbreDossiers(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchangedArbreDossiers(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnAction();
afx_msg void OnClickFichierInfo(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
Dans le fichier XtractCommGUIDlg.cpp :
BEGIN_MESSAGE_MAP(CXtractCommGUIDlg, CDialog)
//{{AFX_MSG_MAP(CXtractCommGUIDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELCHANGE(IDC_COMBO_DISQUE, OnSelchangeComboDisque)
PAGE B-30
LABORATOIRE #B  XTRACTCOMMGUI
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_ARBRE_DOSSIERS, OnItemexpandingArbreDossiers)
ON_NOTIFY(TVN_SELCHANGED, IDC_ARBRE_DOSSIERS, OnSelchangedArbreDossiers)
ON_BN_CLICKED(ID_ACTION, OnAction)
ON_NOTIFY(NM_CLICK, IDC_FICHIER_INFO, OnClickFichierInfo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
En résumé, cette manipulation consiste à créer des fonctions membres dans la classe
CXtractCommGUIDlg pour gérer les notifications par les contrôles de l’interface
graphique.
Note : Le ClassWizard génère les entrées dans la carte de messages et insère
les prototypes des fonctions membres dans le fichier source approprié.
Cependant, le corps de ces fonctions membres demeure vide et c’est à vous de
programmer le fonctionnement de ces fonctions membres qui agissent
comme gestionnaires de notification.
Manipulation #8
Pour réaliser l’objectif de ce projet de programmation, vous aurez besoin d’une
bibliothèque DLL appelé XtractUtil.dll. Dans cette bibliothèque vous
retrouverez deux classes :
1. GestionDisques : Cette classe repère pour vous les unités de disques attachés à
l’ordinateur. Vous devez placer dans la boîte combo (m_ArbreDossiers), la
description des disques retournée par un objet de cette classe.
2. GestionFichiers : Cette classe repère les fichiers contenus dans un dossier
d’un disque. Vous devez placer dans la liste des fichiers (m_lcFichiers), les
caractéristiques des fichiers retournées par un objet de cette classe.
De plus, cette bibliothèque DLL contient les structures de données et les signaux
d’exception nécessaires à son fonctionnement.
‰
Télécharger la bibliothèque XtractUtil.dll à partir du site web du cours
GPA789. Comprendre l’utilisation des classes de cette bibliothèque en faisant une
lecture complète de son manuel d’utilisation. Vous pouvez aussi télécharger le
code source de cette bibliothèque afin de comprendre son fonctionnement
interne.
‰
Insérer la bibliothèque dans le projet de programmation en cours. Pour ce faire,
1. Utiliser WinZip pour décompresser le fichier XtractUtil.zip.
2. Copier le fichier XtractUtil.h dans le dossier principal du projet.
3. Copier le fichier XtractUtil.lib dans le dossier principal du projet.
4. Copier le fichier XtractUtil.dll dans le dossier « Debug » et/ou
« Release » de votre projet.
PAGE B-31
LABORATOIRE #B  XTRACTCOMMGUI
5. Insérer le fichier XtractUtil.h dans le projet de programmation par le biais
de l’onglet « FileView ».
6. Insérer le fichier XtractUtil.lib dans le projet de programmation par le
biais de l’onglet « FileView ». Ce fichier contient tous les symboles (i.e.
variables, fonctions, classes, etc.) exportés et utilisables de la bibliothèque
DLL.
‰
À la fin de cette manipulation vous devez avoir une organisation de l’onglet
« FileView » semblable à celle-ci :
Fichiers à insérer
dans le projet
Manipulation #9
Il est temps d’effectuer la programmation proprement dite de l’application
XtractCommGUI. Vous devez vous familiariser avec les différents objets MFC utilisés.
Pour ce faire, consulter la documentation en ligne de Visual C++. Les pages insérées
dans l’annexe de ce document est un bon point de départ.
À noter que vous pouvez ajouter des fonctions membres dans la classe
pour aider à la réaliser de l’application. Autrement dit, il est
possible d’ajouter des fonctions membres dans les sections publique, protégée
et privée de la classe CXtractCommGUIDlg en plus des fonctions membres
ajoutées par le ClassWizard.
CXtractCommGUIDlg
Par contre, vous devez ajouter manuellement les fonctions membres qui ne sont pas
gestionnaires de notifications. Le ClassWizard n’est utile que pour instaurer les
gestionnaires de messages et notifications MFC.
‰
Le tableau ci-dessous peut vous aider à mieux comprendre le rôle des fonctions
membres générées pour la classe CXtractCommGUIDlg par le ClassWizard.
PAGE B-32
LABORATOIRE #B  XTRACTCOMMGUI
Fonction générée
Rôle
OnInitDialog()
Cette fonction membre est exécutée par le MFC tout
juste avant l’affichage graphique du panneau de
dialogue. Vous devez réaliser toutes vos initialisations
des contrôles dans cette fonction :
1. Charger l’image bitmap représentant un dossier
ouvert et un dossier fermé dans un objet de classe
CImageList.
2. Passer l’objet de classe CImageList dans l’objet
de classe CTreeCtrl (i.e. m_ArbreDossiers).
3. Régler les colonnes de la liste des fichiers (i.e.
m_lcFichiers).
4. Placer la description des disques dans le combo,
sélectionner par programmation un disque par
défaut, afficher les dossiers du disque par défaut
et afficher les fichiers trouvés dans la liste des
fichiers.
OnSelchangeComboDisque()
OnSelchangedArbreDossiers()
Cette fonction membre est exécutée par le MFC
lorsque l’utilisateur sélectionne un autre disque de la
boîte combo.
1. Prendre le disque sélectionné de la boîte combo.
2. Mettre à jour l’arborescence des dossiers.
3. Mettre à jour la liste des fichiers.
Cette fonction membre est exécutée par le MFC
lorsque l’utilisateur sélectionne un autre dossier de
l’arborescence.
1. Former le chemin courant.
2. Mettre à jour la liste des fichiers.
OnItemexpandingArbreDossiers()
Cette fonction membre est exécutée par le MFC
lorsque l’utilisateur sélectionne la zone +/- d’un dossier.
1. Former le chemin courant.
2. Mettre à jour la partie de l’arborescence
sélectionnée par l’utilisateur (montrer les sous
dossiers).
3. Mettre à jour la liste des fichiers.
OnClickFichierInfo()
Cette fonction membre est exécutée par le MFC
lorsque l’utilisateur sélectionne un fichier de la liste des
fichiers.
1. Simplement remettre à zéro la barre de
progression si le programme n’est pas en
traitement.
PAGE B-33
LABORATOIRE #B  XTRACTCOMMGUI
OnAction()
Cette fonction membre est exécutée par le MFC
lorsque l’utilisateur clique sur le bouton Action.
Pour chaque fichier sélectionné de la liste :
1. Exécuter XtractComm.exe en lui donnant comme
paramètre le fichier sélectionné et un nom de
fichier de sortie.
2. Faire avancer la barre de progression pour
indiquer l’état des opérations effectuées.
programmation utilise le programme XtractComm.exe,
‰
Puisque ce projet de
copier ce programme exécutable dans le dossier principal du projet.
‰
Pour exécuter un programme à partir d’un autre (ce qui est notre cas), utiliser les
fonctions systèmes Win32 énumérées ci-dessous. Consulter la documentation enligne pour comprendre leur utilisation.
1. CreateProcess() : Cette fonction système vous permettra exécuter
n’importe quel programme Win32 sous forme d’un processus. Il existe un
grand nombre de paramètres à fournir. Voici l’usage recommandé de cette
fonction Win32 :
if( !CreateProcess( Prog, /* Nom du programme */
CmdLine.GetBuffer(CmdLine.GetLength()), /* Ligne de commande */
NULL,
/* Process handle non heritable */
NULL,
/* Thread handle non heritable. */
FALSE,
/* handle heritage est FALSE */
DETACHED_PROCESS, /* Tâche sans console ni fenêtre. */
NULL,
/* Utilise l'environment du parent */
NULL,
/* Utilise le répertoire de départ du parent */
&si,
/* Pointeur à la structure STARTUPINFO */
&pi )
/* Pointeur à la structure PROCESS_INFORMATION */
) {
// Message d’erreur
} else {
// tout va bien continuer le travail …
}
2. WaitForSingleObject() : Lorsque le processus est créé par
CreateProcess(), vous devez attendre la fin de l’exécution du processus
avant d’en créer un autre (si l’utilisateur a sélectionné plus d’un fichier source
à traiter). Cette fonction Win32 bloquera tant et aussi longtemps que le
processus est en exécution. L’identificateur (i.e. PID) du processus est
nécessaire pour cette fonction Win32.
3. GetExitCodeProcess() : Lorsque le processus termine son exécution, il
retourne un statut de retour (voir le code source du programme XtractComm
pour connaître la signification de ses valeurs de retour). Vous pouvez obtenir
la valeur de retour d’un processus par cette fonction Win32.
4. CloseHandle() : Fermer la communication avec le processus. Cette
fonction est nécessaire pour libérer les ressources (mémoire, structure de
données systèmes, etc.) utilisées par le processus.
PAGE B-34
LABORATOIRE #B  XTRACTCOMMGUI
C’est à l’aide de ces fonctions systèmes que nous pourrons exécuter
XtractComm.exe silencieusement en arrière plan.
Note : Toutes ces fonctions systèmes exigent des paramètres. Vous devez
consulter l’aide en-ligne pour bien comprendre la signification des ces
paramètres avant de les utiliser. Une erreur de programmation peut
entraîner le blocage de votre ordinateur !
Manipulation #10
Enfin, tester le programme réalisé. Valider XtractCommGUI par des fichiers sources.
Tester le fonctionnement de la boîte combo, de l’arborescence des dossiers, de la liste
des fichiers (avec des sélections multiples), le bouton Action ainsi que la barre de
progression.
Contenu du rapport
La durée de ce laboratoire est de trois semaines. Vous devez remettre un rapport à
la 4e semaine. Le contenu du rapport est donné ci-dessous :
1. Introduction L’exposé du problème consiste à reprendre la description du
laboratoire tout en précisant les difficultés et les problèmes pouvant survenir
à la réalisation de ce projet de programmation. Ne pas recopier la
description de ce laboratoire!
2. Description fonctionnelle Décrire les étapes nécessaires à la résolution du
problème. Les étapes sont celles menant à la réalisation de XtractCommGUI.
3. Résultat/Discussion Présenter les résultats obtenus, les notes et remarques
pertinentes. Proposer les améliorations possibles dans un développement
futur.
4. Conclusion Reprendre la présentation du rapport mais en ordre
chronologique inversé. Ne pas présenter vos résultats dans cette section. Ils
doivent être présentés dans la section Résultat/Discussion.
5. Code source Présenter le code source dans une section dédiée à la fin du
rapport.
Vous devez remettre une disquette contenant le programme exécutable et
tous ses fichiers de support.
PAGE B-35
LABORATOIRE #B  XTRACTCOMMGUI
Annexe
PAGE B-36
CButton
Page 1 sur 2
CButton
The CButton class provides the functionality of Windows button controls. A button control
is a small, rectangular child window that can be clicked on and off. Buttons can be used
alone or in groups and can either be labeled or appear without text. A button typically
changes appearance when the user clicks it.
Typical buttons are the check box, radio button, and pushbutton. A CButton object can
become any of these, according to the button style specified at its initialization by the
Create member function.
In addition, the CBitmapButton class derived from CButton supports creation of button
controls labeled with bitmap images instead of text. A CBitmapButton can have separate
bitmaps for a button's up, down, focused, and disabled states.
You can create a button control either from a dialog template or directly in your code. In
both cases, first call the constructor CButton to construct the CButton object; then call
the Create member function to create the Windows button control and attach it to the
CButton object.
Construction can be a one-step process in a class derived from CButton. Write a
constructor for the derived class and call Create from within the constructor.
If you want to handle Windows notification messages sent by a button control to its parent
(usually a class derived from CDialog), add a message-map entry and message-handler
member function to the parent class for each message.
Each message-map entry takes the following form:
ON_Notification( id, memberFxn )
where id specifies the child window ID of the control sending the notification and
memberFxn is the name of the parent member function you have written to handle the
notification.
The parent’s function prototype is as follows:
afx_msg void memberFxn( );
Potential message-map entries are as follows:
Map entry
Sent to parent when...
ON_BN_CLICKED
The user clicks a button.
ON_BN_DOUBLECLICKED
The user double-clicks a button.
If you create a CButton object from a dialog resource, the CButton object is automatically
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../_mfc_cbutton.ht
28/01/01
CButton
Page 2 sur 2
destroyed when the user closes the dialog box.
If you create a CButton object within a window, you may need to destroy it. If you create
the CButton object on the heap by using the new function, you must call delete on the
object to destroy it when the user closes the Windows button control. If you create the
CButton object on the stack, or it is embedded in the parent dialog object, it is destroyed
automatically.
#include <afxwin.h>
Class Members | Base Class | Hierarchy Chart
See Also CWnd, CComboBox, CEdit, CListBox, CScrollBar, CStatic, CBitmapButton,
CDialog
Send feedback to MSDN. Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../_mfc_cbutton.ht
28/01/01
CComboBox
Page 1 sur 3
CComboBox
The CComboBox class provides the functionality of a Windows combo box.
A combo box consists of a list box combined with either a static control or edit control. The
list-box portion of the control may be displayed at all times or may only drop down when
the user selects the drop-down arrow next to the control.
The currently selected item (if any) in the list box is displayed in the static or edit control.
In addition, if the combo box has the drop-down list style, the user can type the initial
character of one of the items in the list, and the list box, if visible, will highlight the next
item with that initial character.
The following table compares the three combo-box styles.
Style
When is list box visible?
Static or edit control?
Simple
Always
Edit
Drop-down
When dropped down
Edit
Drop-down list
When dropped down
Static
You can create a CComboBox object from either a dialog template or directly in your code.
In both cases, first call the constructor CComboBox to construct the CComboBox object;
then call the Create member function to create the control and attach it to the
CComboBox object.
If you want to handle Windows notification messages sent by a combo box to its parent
(usually a class derived from CDialog), add a message-map entry and message-handler
member function to the parent class for each message.
Each message-map entry takes the following form:
ON_Notification( id, memberFxn )
where id specifies the child-window ID of the combo-box control sending the notification
and memberFxn is the name of the parent member function you have written to handle the
notification.
The parent’s function prototype is as follows:
afx_msg void memberFxn( );
The order in which certain notifications will be sent cannot be predicted. In particular, a
CBN_SELCHANGE notification may occur either before or after a CBN_CLOSEUP
notification.
Potential message-map entries are the following:
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99O.../_mfc_ccombobox.ht
28/01/01
CComboBox
Page 2 sur 3
ON_CBN_CLOSEUP (Windows 3.1 and later.) The list box of a combo box has
closed. This notification message is not sent for a combo box that has the
CBS_SIMPLE style.
ON_CBN_DBLCLK The user double-clicks a string in the list box of a combo box.
This notification message is only sent for a combo box with the CBS_SIMPLE style.
For a combo box with the CBS_DROPDOWN or CBS_DROPDOWNLIST style, a doubleclick cannot occur because a single click hides the list box.
ON_CBN_DROPDOWN The list box of a combo box is about to drop down (be
made visible). This notification message can occur only for a combo box with the
CBS_DROPDOWN or CBS_DROPDOWNLIST style.
ON_CBN_EDITCHANGE The user has taken an action that may have altered the
text in the edit-control portion of a combo box. Unlike the CBN_EDITUPDATE
message, this message is sent after Windows updates the screen. It is not sent if the
combo box has the CBS_DROPDOWNLIST style.
ON_CBN_EDITUPDATE The edit-control portion of a combo box is about to display
altered text. This notification message is sent after the control has formatted the text
but before it displays the text. It is not sent if the combo box has the
CBS_DROPDOWNLIST style.
ON_CBN_ERRSPACE The combo box cannot allocate enough memory to meet a
specific request.
ON_CBN_SELENDCANCEL (Windows 3.1 and later.) Indicates the user’s selection
should be canceled. The user clicks an item and then clicks another window or control
to hide the list box of a combo box. This notification message is sent before the
CBN_CLOSEUP notification message to indicate that the user’s selection should be
ignored. The CBN_SELENDCANCEL or CBN_SELENDOK notification message is
sent even if the CBN_CLOSEUP notification message is not sent (as in the case of a
combo box with the CBS_SIMPLE style).
ON_CBN_SELENDOK The user selects an item and then either presses the ENTER
key or clicks the DOWN ARROW key to hide the list box of a combo box. This
notification message is sent before the CBN_CLOSEUP message to indicate that the
user’s selection should be considered valid. The CBN_SELENDCANCEL or
CBN_SELENDOK notification message is sent even if the CBN_CLOSEUP
notification message is not sent (as in the case of a combo box with the
CBS_SIMPLE style).
ON_CBN_KILLFOCUS The combo box is losing the input focus.
ON_CBN_SELCHANGE The selection in the list box of a combo box is about to be
changed as a result of the user either clicking in the list box or changing the selection
by using the arrow keys. When processing this message, the text in the edit control
of the combo box can only be retrieved via GetLBText or another similar function.
GetWindowText cannot be used.
ON_CBN_SETFOCUS The combo box receives the input focus.
If you create a CComboBox object within a dialog box (through a dialog resource), the
CComboBox object is automatically destroyed when the user closes the dialog box.
If you embed a CComboBox object within another window object, you do not need to
destroy it. If you create the CComboBox object on the stack, it is destroyed automatically.
If you create the CComboBox object on the heap by using the new function, you must call
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99O.../_mfc_ccombobox.ht
28/01/01
CComboBox
Page 3 sur 3
delete on the object to destroy it when the Windows combo box is destroyed.
#include <afxwin.h>
Class Members | Base Class | Hierarchy Chart
Sample MFC Sample CTRLBARS
See Also CWnd, CButton, CEdit, CListBox, CScrollBar, CStatic, CDialog
Send feedback to MSDN. Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99O.../_mfc_ccombobox.ht
28/01/01
CDialog
Page 1 sur 2
CDialog
The CDialog class is the base class used for displaying dialog boxes on the screen. Dialog
boxes are of two types: modal and modeless. A modal dialog box must be closed by the
user before the application continues. A modeless dialog box allows the user to display the
dialog box and return to another task without canceling or removing the dialog box.
A CDialog object is a combination of a dialog template and a CDialog-derived class. Use
the dialog editor to create the dialog template and store it in a resource, then use
ClassWizard to create a class derived from CDialog.
A dialog box, like any other window, receives messages from Windows. In a dialog box, you
are particularly interested in handling notification messages from the dialog box’s controls
since that is how the user interacts with your dialog box. ClassWizard browses through the
potential messages generated by each control in your dialog box, and you can select which
messages you wish to handle. ClassWizard then adds the appropriate message-map entries
and message-handler member functions to the new class for you. You only need to write
application-specific code in the handler member functions.
If you prefer, you can always write message-map entries and member functions yourself
instead of using ClassWizard.
In all but the most trivial dialog box, you add member variables to your derived dialog class
to store data entered in the dialog box’s controls by the user or to display data for the user.
ClassWizard browses through those controls in your dialog box that can be mapped to data
and prompts you to create a member variable for each control. At the same time, you
choose a variable type and permissible range of values for each variable. ClassWizard adds
the member variables to your derived dialog class.
ClassWizard then writes a data map to automatically handle the exchange of data between
the member variables and the dialog box’s controls. The data map provides functions that
initialize the controls in the dialog box with the proper values, retrieve the data, and
validate the data.
To create a modal dialog box, construct an object on the stack using the constructor for
your derived dialog class and then call DoModal to create the dialog window and its
controls. If you wish to create a modeless dialog, call Create in the constructor of your
dialog class.
You can also create a template in memory by using a DLGTEMPLATE data structure as
described in the Win32 SDK documentation. After you construct a CDialog object, call
CreateIndirect to create a modeless dialog box, or call InitModalIndirect and DoModal to
create a modal dialog box.
ClassWizard writes the exchange and validation data map in an override of
CWnd::DoDataExchange that ClassWizard adds to your new dialog class. See the
DoDataExchange member function in CWnd for more on the exchange and validation
functionality.
Both the programmer and the framework call DoDataExchange indirectly through a call to
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../_mfc_cdialog.ht
28/01/01
CDialog
Page 2 sur 2
CWnd::UpdateData.
The framework calls UpdateData when the user clicks the OK button to close a modal
dialog box. (The data is not retrieved if the Cancel button is clicked.) The default
implementation of OnInitDialog also calls UpdateData to set the initial values of the
controls. You typically override OnInitDialog to further initialize controls. OnInitDialog is
called after all the dialog controls are created and just before the dialog box is displayed.
You can call CWnd::UpdateData at any time during the execution of a modal or modeless
dialog box.
If you develop a dialog box by hand, you add the necessary member variables to the
derived dialog-box class yourself, and you add member functions to set or get these values.
For more on ClassWizard, see Using ClassWizard in the Visual C++ Programmer's Guide.
Call CWinApp::SetDialogBkColor to set the background color for dialog boxes in your
application.
A modal dialog box closes automatically when the user presses the OK or Cancel buttons or
when your code calls the EndDialog member function.
When you implement a modeless dialog box, always override the OnCancel member
function and call DestroyWindow from within it. Don’t call the base class
CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible
but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes
in order to delete this, since modeless dialog boxes are usually allocated with new. Modal
dialog boxes are usually constructed on the frame and do not need PostNcDestroy
cleanup.
For more information on CDialog, see the article Dialog Box Topics in Visual C++
Programmer's Guide.
#include <afxwin.h>
Class Members | Base Class | Hierarchy Chart
Samples MFC Sample DBFETCH | MFC Sample DLGCBR32 | MFC Sample DLGTEMPL |
MFC Sample EXTBIND | MFC Sample FTPTREE | MFC Sample HELLO | MFC Sample
MDIBIND | MFC Sample VCTERM
Send feedback to MSDN. Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../_mfc_cdialog.ht
28/01/01
CProgressCtrl
Page 1 sur 1
CProgressCtrl
A “progress bar control” is a window that an application can use to indicate the progress of
a lengthy operation. It consists of a rectangle that is gradually filled, from left to right, with
the system highlight color as an operation progresses.
The CProgressCtrl class provides the functionality of the Windows common progress bar
control. This control (and therefore the CProgressCtrl class) is available only to programs
running under Windows 95 and Windows NT version 3.51 and later.
A progress bar control has a range and a current position. The range represents the entire
duration of the operation, and the current position represents the progress the application
has made toward completing the operation. The window procedure uses the range and the
current position to determine the percentage of the progress bar to fill with the highlight
color and to determine the text, if any, to display within the progress bar. Because the
range and current position values are expressed as signed integers, the possible range of
current position values is from -217483648 to 217483647 inclusive.
For more information on using CProgressCtrl, seeControl Topics andUsing CProgressCtrl in
the Visual C++ Programmer’s Guide.
#include <afxcmn.h>
Class Members | Base Class | Hierarchy Chart
Samples MFC Sample CMNCTRL2 | MFC Sample FIRE
Send feedback to MSDN.Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99.../_mfc_cprogressctrl.ht
28/01/01
CTreeCtrl
Page 1 sur 1
CTreeCtrl
A “tree view control” is a window that displays a hierarchical list of items, such as the
headings in a document, the entries in an index, or the files and directories on a disk. Each
item consists of a label and an optional bitmapped image, and each item can have a list of
subitems associated with it. By clicking an item, the user can expand and collapse the
associated list of subitems.
The CTreeCtrl class provides the functionality of the Windows common tree view control.
This control (and therefore the CTreeCtrl class) is available only to programs running
under Windows 95 and Windows NT versions 3.51 and later.
For more information on using CTreeCtrl, seeControl Topics,Using CTreeCtrl in the Visual
C++ Programmer’s Guide,andTree View Control Reference in the Platform SDK.
#include <afxcmn.h>
Class Members | Base Class | Hierarchy Chart
Samples MFC Sample CMNCTRL1 | MFC Sample FIRE | MFC Sample FTPTREE
See Also CImageList
Send feedback to MSDN.Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../_mfc_ctreectrl.ht
28/01/01
CListCtrl
Page 1 sur 3
CListCtrl
The CListCtrl class encapsulates the functionality of a “list view control,” which displays a
collection of items each consisting of an icon (from an image list) and a label. In addition to
an icon and label, each item can have information displayed in colums to the right of the
icon and label. This control (and therefore the CListCtrl class) is available only to programs
running under Windows 95 and Windows NT version 3.51 and later.
The following is a brief overview of the CListCtrl class. For a detailed, conceptual
discussion, seeUsing CListCtrl andControl Topics in the Visual C++ Programmer’s Guide.
Views
List view controls can display their contents in four different ways, called “views.”
Icon view
Each item appears as a full-sized icon (32 x 32 pixels) with a label below it. The user
can drag the items to any location in the list view window.
Small icon view
Each item appears as a small icon (16 x 16 pixels) with the label to the right of it.
The user can drag the items to any location in the list view window.
List view
Each item appears as a small icon with a label to the right of it. Items are arranged in
columns and cannot be dragged to any location in the list view window.
Report view
Each item appears on its own line, with additional information arranged in columns to
the right. The leftmost column contains the small icon and label, and subsequent
columns contain subitems as specified by the application. An embedded header
control (class CHeaderCtrl) implements these columns. For more information on the
header control and columns in a report view, seeUsing CListCtrl: Adding Columns to
the Control (Report View).
The style of the control’s current list view determines the current view. For more
information on these these styles and their usage, see Using CListCtrl: Changing List
Control Styles.
Extended Styles
CListCtrl
In addition to the standard list styles, class
supports a large set of extended
styles, providing enriched functionality. Some examples of this functionality include:
Hover selection
When enabled, allows automatic selection of an item when the cursor remains over
the item for a certain period of time.
Virtual list views
DWORD
When enabled, allows the control to support up to
items. This is possible by
placing the overhead of managing item data on the application. Except for the item
selection and focus information, all item information must be managed by the
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../_mfc_clistctrl.ht
28/01/01
CListCtrl
Page 2 sur 3
application. For more information, see Using CListCtrl: Virtual List Controls.
One– and two– click activation
When enabled, allows hot tracking (automatic highlighting of the item text) and one–
or two– click activation of the highlighted item.
Drag and drop column ordering
When enabled, allows drag-and-drop reordering of columns in a list view control. Only
available in report view.
For information on using these new extended styles, see Using CListCtrl: Changing List
Control Styles.
Items and Subitems
Each item in a list view control consists of an icon (from an image list), a label, a current
state, and an application-defined value (referred to as “item data”). One or more subitems
can also be associated with each item. A “subitem” is a string that, in report view, can be
displayed in a column to the right of an item’s icon and label. All items in a list view control
must have the same number of subitems.
CListCtrl
Class
provides several functions for inserting, deleting, finding, and modifying
these items. For more information, see CListCtrl::GetItem, CListCtrl::InsertItem, and
CListCtrl::FindItem, Using CListCtrl: Adding Items to the Control, and Using CListCtrl:
Scrolling, Arranging, Sorting, and Finding in List Controls.
By default, the list view control is responsible for storing an item's icon and text attributes.
However, in addition to these item types, class
supports “callback items.” A
“callback item” is a list view item for which the application — rather than the control —
stores the text, icon, or both. A callback mask is used to specify which item attributes (text
and/or icon) are supplied by the application. If an application uses callback items, it must
be able to supply the text and/or icon attributes on demand. Callback items are helpful
when your application already maintains some of this information. For more information,
see CListCtrl::GetCallBackMask and Using CListCtrl: Callback Items and the Callback Mask.
CListCtrl
Image Lists
The icons, header item images, and application– defined states for list view items are
contained in several image lists (implemented by class CImageList), which you create and
assign to the list view control. Each list view control can have up to four different types of
image lists:
Large icon
Used in the icon view for full-sized icons.
Small icon
Used in the small icon, list, and report views for smaller versions of the icons used in
the icon view.
Application-defined state
Contains state images, which are displayed next to an item’s icon to indicate an
application-defined state.
Header item
Used in the report view for small images that appear in each header control item.
By default, a list view control destroys the image lists assigned to it when it is destroyed;
however, the developer can customize this behavior by destroying each image list when it
is no longer used, as determined by the application. For more information, see Using
CListCtrl: List Items and Image Lists and Using CListCtrl: List Items and Image Lists.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../_mfc_clistctrl.ht
28/01/01
CListCtrl
Page 3 sur 3
#include <afxcmn.h>
Class Members | Base Class | Hierarchy Chart
Samples
MFC Sample DAOTABLE | MFC Sample HTTPSVR | MFC Sample LISTHDR |
MFC Sample ROWLIST | MFC Sample DBVLIST
See Also
CImageList
Send feedback to MSDN. Look here for MSDN Online resources.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../_mfc_clistctrl.ht
28/01/01
CreateProcess
Page 1 sur 6
Platform SDK: DLLs, Processes, and Threads
CreateProcess
The CreateProcess function creates a new process and its primary thread. The new process runs the
specified executable file.
To create a process that runs in a different security context, use the CreateProcessAsUser or
CreateProcessWithLogonW function.
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine,
// command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
// handle inheritance flag
DWORD dwCreationFlags,
// creation flags
LPVOID lpEnvironment,
// new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
Parameters
lpApplicationName
Pointer to a null-terminated string that specifies the module to execute.
The string can specify the full path and file name of the module to execute or it can specify a partial
name. In the case of a partial name, the function uses the current drive and current directory to
complete the specification. The function will not use the search path.
The lpApplicationName parameter can be NULL. In that case, the module name must be the first white
space-delimited token in the lpCommandLine string. If you are using a long file name that contains a
space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise,
the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name".
This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the
following order:
c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe
The specified module can be a Win32-based application. It can be some other type of module (for
example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer.
Windows NT/2000: If the executable module is a 16-bit application, lpApplicationName should be
NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its
arguments. A 16-bit application is one that executes as a VDM or WOW process.
lpCommandLine
Pointer to a null-terminated string that specifies the command line to execute. The system adds a null
character to the command line, trimming the string if necessary, to indicate which file was actually
used.
Windows NT/2000: The Unicode version of this function, CreateProcessW, will fail if this parameter
is a const string.
The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by
lpApplicationName as the command line.
If both lpApplicationName and lpCommandLine are non-NULL, *lpApplicationName specifies the
module to execute, and *lpCommandLine specifies the command line. The new process can use
GetCommandLine to retrieve the entire command line. C runtime processes can use the argc and
argv arguments. Note that it is a common practice to repeat the module name as the first token in the
command line.
If lpApplicationName is NULL, the first white-space – delimited token of the command line specifies the
module name. If you are using a long file name that contains a space, use quoted strings to indicate
where the file name ends and the arguments begin (see the explanation for the lpApplicationName
parameter). If the file name does not contain an extension, .exe is appended. If the file name ends in
a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file
name does not contain a directory path, the system searches for the executable file in the following
sequence:
1. The directory from which the application loaded.
2. The current directory for the parent process.
3. Windows 95/98: The Windows system directory. Use the GetSystemDirectory function to
get the path of this directory.
Windows NT/2000: The 32-bit Windows system directory. Use the GetSystemDirectory
function to get the path of this directory. The name of this directory is System32.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
CreateProcess
4.
5.
Page 2 sur 6
Windows NT/2000: The 16-bit Windows system directory. There is no Win32 function that
obtains the path of this directory, but it is searched. The name of this directory is System.
The Windows directory. Use the GetWindowsDirectory function to get the path of this
directory.
6. The directories that are listed in the PATH environment variable.
SECURITY_ATTRIBUTES
Windows NT/2000: lpSecurityDescriptor
lpProcessAttributes
Pointer to a
structure that determines whether the returned handle can be
inherited by child processes. If lpProcessAttributes is NULL, the handle cannot be inherited.
The
member of the structure specifies a security
descriptor for the new process. If lpProcessAttributes is NULL, the process gets a default security
descriptor.
SECURITY_ATTRIBUTES
Windows NT/2000: lpSecurityDescriptor
lpThreadAttributes
Pointer to a
structure that determines whether the returned handle can be
inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited.
The
member of the structure specifies a security
descriptor for the main thread. If lpThreadAttributes is NULL, the thread gets a default security
descriptor.
bInheritHandles
Indicates whether the new process inherits handles from the calling process. If TRUE, each inheritable
open handle in the calling process is inherited by the new process. Inherited handles have the same
value and access privileges as the original handles.
dwCreationFlags
Specifies additional flags that control the priority class and the creation of the process. The following
creation flags can be specified in any combination, except as noted.
Value
CREATE_BREAKAWAY_
FROM_JOB
Meaning
Windows 2000: The child processes of a process
associated with a job are not associated with the job.
If the calling process is not associated with a job, this
flag has no effect. If the calling process is associated
with a job, the job must set the
JOB_OBJECT_BREAKAWAY_OK limit or
will fail.
CreateProcess
CREATE_DEFAULT_
ERROR_MODE
The new process does not inherit the error mode of
the calling process. Instead,
gives
the new process the current default error mode. An
application sets the current default error mode by
calling
.
This flag is particularly useful for multi-threaded shell
applications that run with hard errors disabled.
The default behavior for
is for the
new process to inherit the error mode of the caller.
Setting this flag changes that default behavior.
CreateProcess
SetErrorMode
CreateProcess
CREATE_FORCE_DOS
Windows NT/2000: This flag is valid only when
starting a 16-bit bound application. If set, the system
will force the application to run as an MS-DOS-based
application rather than as an OS/2-based application.
CREATE_NEW_CONSOLE
The new process has a new console, instead of
inheriting the parent's console. This flag cannot be
used with the DETACHED_PROCESS flag.
CREATE_NEW_
PROCESS_GROUP
The new process is the root process of a new process
group. The process group includes all processes that
are descendants of this root process. The process
identifier of the new process group is the same as the
process identifier, which is returned in the
lpProcessInformation parameter. Process groups are
used by the
function to
enable sending a CTRL+C or CTRL+BREAK signal to a
group of console processes.
GenerateConsoleCtrlEvent
CREATE_NO_WINDOW
CREATE_SEPARATE_
WOW VDM
Windows NT/2000: This flag is valid only when
starting a console application. If set, the console
application is run without a console window.
Windows NT/2000: This flag is valid only when
starting a 16-bit Windows-based application. If set,
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
CreateProcess
WOW_VDM
CREATE_SHARED_
WOW_VDM
Page 3 sur 6
starting a 16 bit Windows based application. If set,
the new process runs in a private Virtual DOS
Machine (VDM). By default, all 16-bit Windows-based
applications run as threads in a single, shared VDM.
The advantage of running separately is that a crash
only terminates the single VDM; any other programs
running in distinct VDMs continue to function
normally. Also, 16-bit Windows-based applications
that are run in separate VDMs have separate input
queues. That means that if one application stops
responding momentarily, applications in separate
VDMs continue to receive input. The disadvantage of
running separately is that it takes significantly more
memory to do so. You should use this flag only if the
user requests that 16-bit applications should run in
them own VDM.
Windows NT/2000: The flag is valid only when
starting a 16-bit Windows-based application. If the
DefaultSeparateVDM switch in the Windows section of
WIN.INI is TRUE, this flag causes the
function to override the switch and run the new
process in the shared Virtual DOS Machine.
CreateProcess
CREATE_SUSPENDED
The primary thread of the new process is created in a
suspended state, and does not run until the
function is called.
CREATE_UNICODE_
ENVIRONMENT
Indicates the format of the lpEnvironment parameter.
If this flag is set, the environment block pointed to by
lpEnvironment uses Unicode characters. Otherwise,
the environment block uses ANSI characters.
DEBUG_PROCESS
If this flag is set, the calling process is treated as a
debugger, and the new process is debugged. The
system notifies the debugger of all debug events that
occur in the process being debugged.
If you create a process with this flag set, only the
calling thread (the thread that called
) can call the
function.
This flag is not valid if the new
process is a 16-bit application.
ResumeThread
CreateProcess
Windows 95/98:
WaitForDebugEvent
DEBUG_ONLY_THIS_
PROCESS
If this flag is not set and the calling process is being
debugged, the new process becomes another process
being debugged by the calling process's debugger. If
the calling process is not a process being debugged,
no debugging-related actions occur.
DETACHED_PROCESS
For console processes, the new process does not
have access to the console of the parent process. The
new process can call the
function at a
later time to create a new console. This flag cannot
be used with the CREATE_NEW_CONSOLE flag.
AllocConsole
The dwCreationFlags parameter also controls the new process's priority class, which is used to
determine the scheduling priorities of the process's threads. If none of the following priority class flags
is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the
creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS. In this case, the
child process receives the default priority class of the calling process. One of the following flags can be
specified:
Priority
ABOVE_NORMAL_
PRIORITY_CLASS
BELOW_NORMAL_
PRIORITY_CLASS
Meaning
Windows 2000: Indicates a process that has priority
higher than NORMAL_PRIORITY_CLASS but lower than
HIGH_PRIORITY_CLASS.
Windows 2000: Indicates a process that has priority
higher than IDLE_PRIORITY_CLASS but lower than
NORMAL_PRIORITY_CLASS.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
CreateProcess
Page 4 sur 6
HIGH_PRIORITY_CLASS
Indicates a process that performs time-critical tasks.
The threads of a high-priority class process preempt
the threads of normal-priority or idle-priority class
processes. An example is the Task List, which must
respond quickly when called by the user, regardless of
the load on the system. Use extreme care when using
the high-priority class, because a CPU-bound
application with a high-priority class can use nearly all
available cycles.
IDLE_PRIORITY_CLASS
Indicates a process whose threads run only when the
system is idle and are preempted by the threads of
any process running in a higher priority class. An
example is a screen saver. The idle priority class is
inherited by child processes.
NORMAL_PRIORITY_
CLASS
Indicates a normal process with no special scheduling
needs.
REALTIME_PRIORITY_
CLASS
Indicates a process that has the highest possible
priority. The threads of a real-time priority class
process preempt the threads of all other processes,
including operating system processes performing
important tasks. For example, a real-time process that
executes for more than a very brief interval can cause
disk caches not to flush or cause the mouse to be
unresponsive.
lpEnvironment
Pointer to an environment block for the new process. If this parameter is NULL, the new process uses
the environment of the calling process.
An environment block consists of a null-terminated block of null-terminated strings. Each string is in
the form:
name=value
Because the equal sign is used as a separator, it must not be used in the name of an environment
variable.
If an application provides an environment block, rather than passing NULL for this parameter, the
current directory information of the system drives is not automatically propagated to the new process.
For a discussion of this situation and how to handle it, see the following Remarks section.
An environment block can contain either Unicode or ANSI characters. If the environment block pointed
to by lpEnvironment contains Unicode characters, set the dwCreationFlags field's
CREATE_UNICODE_ENVIRONMENT flag. Otherwise, do not set this flag.
Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one
more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for
the last string, two more to terminate the block.
lpCurrentDirectory
Pointer to a null-terminated string that specifies the current drive and directory for the child process.
The string must be a full path and file name that includes a drive letter. If this parameter is NULL, the
new process will have the same current drive and directory as the calling process. This option is
provided primarily for shells that need to start an application and specify its initial drive and working
directory.
lpStartupInfo
Pointer to a STARTUPINFO structure that specifies how the main window for the new process should
appear.
lpProcessInformation
Pointer to a PROCESS_INFORMATION structure that receives identification information about the
new process.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
The CreateProcess function is used to run a new program. The WinExec and LoadModule functions are
still available, but they are implemented as calls to CreateProcess.
In addition to creating a process, CreateProcess also creates a thread object. The thread is created with
an initial stack whose size is described in the image header of the specified program's executable file. The
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
CreateProcess
Page 5 sur 6
thread begins execution at the image's entry point.
When created, the new process and the new thread handles receive full access rights. For either handle, if
a security descriptor is not provided, the handle can be used in any function that requires an object handle
to that type. When a security descriptor is provided, an access check is performed on all subsequent uses
of the handle before access is granted. If access is denied, the requesting process cannot use the handle
to gain access to the thread.
The process is assigned a 32-bit process identifier. The identifier is valid until the process terminates. It
can be used to identify the process, or specified in the OpenProcess function to open a handle to the
process. The initial thread in the process is also assigned a 32-bit thread identifier. The identifier is valid
until the thread terminates and can be used to uniquely identify the thread within the system. These
identifiers are returned in the PROCESS_INFORMATION structure.
When specifying an application name in the lpApplicationName or lpCommandLine strings, it doesn't
matter whether the application name includes the file name extension, with one exception: an MS-DOS –
based or Windows-based application whose file name extension is .com must include the .com extension.
The calling thread can use the WaitForInputIdle function to wait until the new process has finished its
initialization and is waiting for user input with no input pending. This can be useful for synchronization
between parent and child processes, because CreateProcess returns without waiting for the new process
to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to
find a window associated with the new process.
The preferred way to shut down a process is by using the ExitProcess function, because this function
sends notification of approaching termination to all DLLs attached to the process. Other means of shutting
down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads
of the process are terminated without an opportunity to execute any additional code (including the thread
termination code of attached DLLs).
ExitProcess, ExitThread, CreateThread, CreateRemoteThread, and a process that is starting (as the
result of a call by CreateProcess) are serialized between each other within a process. Only one of these
events at a time can happen in an address space, and the following restrictions apply.
During process startup and DLL initialization routines, new threads can be created, but they do not
begin execution until DLL initialization is finished for the process.
Only one thread at a time can be in a DLL initialization or detach routine.
The ExitProcess function does not return until there are no threads are in their DLL initialization or
detach routines.
The created process remains in the system until all threads within the process have terminated and all
handles to the process and any of its threads have been closed through calls to CloseHandle. The handles
for both the process and the main thread must be closed through calls to CloseHandle. If these handles
are not needed, it is best to close them immediately after the process is created.
When the last thread in a process terminates, the following events occur:
All objects opened by the process are implicitly closed.
The process's termination status (which is returned by GetExitCodeProcess) changes from its initial
value of STILL_ACTIVE to the termination status of the last thread to terminate.
The thread object of the main thread is set to the signaled state, satisfying any threads that were
waiting on the object.
The process object is set to the signaled state, satisfying any threads that were waiting on the object.
If the current directory on drive C is \MSVC\MFC, there is an environment variable called =C: whose value
is C:\MSVC\MFC. As noted in the previous description of lpEnvironment, such current directory information
for a system's drives does not automatically propagate to a new process when the CreateProcess
function's lpEnvironment parameter is non-NULL. An application must manually pass the current directory
information to the new process. To do so, the application must explicitly create the =X environment
variable strings, get them into alphabetical order (because the system uses a sorted environment), and
then put them into the environment block specified by lpEnvironment. Typically, they will go at the front of
the environment block, due to the previously mentioned environment block sorting.
One way to obtain the current directory variable for a drive X is to call GetFullPathName("X:",. .). That
avoids an application having to scan the environment block. If the full path returned is X:\, there is no
need to pass that value on as environment data, since the root directory is the default current directory for
drive X of a new process.
The handle returned by the CreateProcess function has PROCESS_ALL_ACCESS access to the process
object.
The current directory specified by the lpcurrentDirectory parameter is the current directory for the child
process. The current directory specified in item 2 under the lpCommandLine parameter is the current
directory for the parent process.
Windows NT/2000: When a process is created with CREATE_NEW_PROCESS_GROUP specified, an
implicit call to SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process; this means
that the new process has CTRL+C disabled. This lets good shells handle CTRL+C themselves, and
selectively pass that signal on to sub-processes. CTRL+BREAK is not disabled, and may be used to
interrupt the process/process group.
Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
CreateProcess
Page 6 sur 6
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000.
See Also
Processes and Threads Overview, Process and Thread Functions, AllocConsole, CloseHandle,
CreateProcessAsUser, CreateProcessWithLogonW, CreateRemoteThread, CreateThread,
ExitProcess, ExitThread, GenerateConsoleCtrlEvent, GetCommandLine, GetEnvironmentStrings,
GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory,
GetWindowsDirectory, LoadModule, OpenProcess, PROCESS_INFORMATION, ResumeThread,
SECURITY_ATTRIBUTES, SetConsoleCtrlHandler, SetErrorMode, STARTUPINFO,
TerminateProcess, WaitForInputIdle, WaitForDebugEvent, WinExec
Built on Friday, May 14, 1999
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_9dpv.ht
28/01/01
WaitForSingleObject
Page 1 sur 2
Platform SDK: DLLs, Processes, and Threads
WaitForSingleObject
WaitForSingleObject
The
function returns when one of the following occurs:
The specified object is in the signaled state.
The time-out interval elapses.
To enter an alertable wait state, use the
function. To wait for multiple objects,
use the
.
WaitForMultipleObjects
WaitForSingleObjectEx
DWORD WaitForSingleObject(
HANDLE hHandle,
// handle to object to wait for
DWORD dwMilliseconds
// time-out interval in milliseconds
);
Parameters
hHandle
Handle to the object. For a list of the object types whose handles can be specified, see the following
Remarks section.
Windows NT/2000: The handle must have SYNCHRONIZE access. For more information, see
Standard Access Rights.
dwMilliseconds
Specifies the time-out interval, in milliseconds. The function returns if the interval elapses, even if the
object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns
immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.
Return Values
If the function succeeds, the return value indicates the event that caused the function to return. This value
can be one of the following.
Value
Meaning
WAIT_ABANDONED
The specified object is a mutex object that was not released
by the thread that owned the mutex object before the
owning thread terminated. Ownership of the mutex object is
granted to the calling thread, and the mutex is set to
nonsignaled.
WAIT_OBJECT_0
The state of the specified object is signaled.
WAIT_TIMEOUT
The time-out interval elapsed, and the object's state is
nonsignaled.
If the function fails, the return value is WAIT_FAILED. To get extended error information, call
GetLastError.
Remarks
The WaitForSingleObject function checks the current state of the specified object. If the object's state is
nonsignaled, the calling thread enters an efficient wait state. The thread consumes very little processor
time while waiting for the object state to become signaled or the time-out interval to elapse.
Before returning, a wait function modifies the state of some types of synchronization objects. Modification
occurs only for the object whose signaled state caused the function to return. For example, the count of a
semaphore object is decreased by one.
The WaitForSingleObject function can wait for the following objects:
Change notification
Console input
Event
Job
Mutex
Process
Semaphore
Thread
Waitable timer
For more information, see Synchronization Objects.
Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread
creates any windows, it must process messages. Message broadcasts are sent to all windows in the
system. A thread that uses a wait function with no time-out interval may cause the system to become
deadlocked. Two examples of code that indirectly creates windows are DDE and COM CoInitialize.
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../synchro_4ldg.ht
28/01/01
WaitForSingleObject
Page 2 sur 2
Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or
MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.
Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
See Also
Synchronization Overview, Synchronization Functions, MsgWaitForMultipleObjects,
MsgWaitForMultipleObjectsEx, WaitForMultipleObjects, WaitForSingleObjectEx
Built on Friday, May 14, 1999
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\1.../synchro_4ldg.ht
28/01/01
GetExitCodeProcess
Page 1 sur 1
Platform SDK: DLLs, Processes, and Threads
GetExitCodeProcess
The GetExitCodeProcess function retrieves the termination status of the specified process.
BOOL GetExitCodeProcess(
HANDLE hProcess,
// handle to the process
LPDWORD lpExitCode
// address to receive termination status
);
Parameters
hProcess
Handle to the process.
Windows NT/2000: The handle must have PROCESS_QUERY_INFORMATION access. For more
information, see Process Security and Access Rights.
lpExitCode
Pointer to a 32-bit variable to receive the process termination status.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
If the specified process has not terminated, the termination status returned is STILL_ACTIVE. If the
process has terminated, the termination status returned may be one of the following:
The exit value specified in the ExitProcess or TerminateProcess function.
The return value from the main or WinMain function of the process.
The exception value for an unhandled exception that caused the process to terminate.
Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
See Also
Processes and Threads Overview, Process and Thread Functions, ExitProcess, ExitThread,
TerminateProcess, WinMain
Built on Friday, May 14, 1999
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../prothred_4k6r.ht
28/01/01
CloseHandle
Page 1 sur 1
Platform SDK: Interprocess Communications
CloseHandle
The CloseHandle function closes an open object handle.
BOOL CloseHandle(
HANDLE hObject
);
// handle to object
Parameters
hObject
[in/out] Handle to an open object.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Windows NT/2000: Closing an invalid handle raises an exception when the application is running under
a debugger. This includes closing a handle twice, and using CloseHandle on a handle returned by the
FindFirstFile function.
Remarks
The CloseHandle function closes handles to the following objects:
Access token
Communications device
Console input
Console screen buffer
Event
File
File mapping
Job
Mailslot
Mutex
Named pipe
Process
Semaphore
Socket
Thread
CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs
object retention checks. After the last handle to an object is closed, the object is removed from the
system.
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must
terminate the thread, then close all handles to the thread.
Use CloseHandle to close handles returned by calls to the CreateFile function. Use FindClose to close
handles returned by calls to FindFirstFile.
MAPI: For more information, see Syntax and Limitations for Win32 Functions Useful in MAPI Development.
Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h; include windows.h.
Library: Use kernel32.lib.
See Also
Handles and Objects Overview, Handle and Object Functions, CreateFile, DeleteFile, FindClose,
FindFirstFile
Built on Tuesday, August 17, 1999
mk:@MSITStore:D:\Microsoft%20Visual%20Studio\MSDN\99OCT\.../handobj_289x.ht
28/01/01