Boîte de dialogue avec Icon et Menu


Nouveaux concepts:

Ajouter une icône et des menus à une boîte de dialogue
Utiliser les styles de fenêtre
Utiliser un manifeste pour appliquer un style visuel XP aux contrôles

Nouvelles fonctions d'API:

LoadIcon
GetDlgItem
SetFocus
GetDlgItemText

 

Nous allons nous baser sur le dernier exemple en ajoutant une icône, un menu et du code pour afficher le texte saisi dans la boîte d'édition dans une boîte de dialogue. Nous commencerons également avec le curseur dans la boîte d'édition.

Tout d'abord, créez un nouveau projet WinAsm et ajoutez un nouveau fichier rc. Désactivez le mode visuel (F12) puis collez le fichier dialogbox1.rc du dernier projet. Ensuite, activez à nouveau le mode visuel et cliquez sur l'onglet des ressources dans la barre d'exploration. Sélectionnez d'abord la boîte de dialogue et double-cliquez sur la légende pour la changer en "Boîte de dialogue avec icône et menu".

Maintenant, nous voulons ajouter un menu appelé "Menu" avec 4 éléments : "Get Text", "Clear Text", un séparateur et "Exit" :

1. Cliquez sur le deuxième bouton de la barre d'exploration (Nouveau menu) et saisissez "MyMenu" dans le nom du menu. Pour le premier élément de menu, saisissez "Menu" dans la boîte de légende, laissez la boîte de nom vide et cliquez sur Insérer.

2. Pour l'élément de menu suivant, saisissez "Get Text" dans la légende, "IDM_GETTEXT" dans le nom, cliquez sur la flèche jaune pointant vers la droite, puis sur le bouton "Insert" :

1

     

1

Maintenant, ajoutez 3 autres éléments de menu pour Effacer le texte, un séparateur (saisissez un "-" dans la boîte de légende et laissez la boîte de nom vide) et Quitter, et indentez-les avec les flèches jaunes. Enfin, cliquez sur OK :

1

Ensuite, nous allons indiquer à la boîte de dialogue d'utiliser notre menu et changer le style de la boîte de dialogue :

1. Cliquez sur OK, puis cliquez sur Dialogues dans la barre d'exploration et sélectionnez IDD_DLG1001. Cliquez dans le champ du menu et sélectionnez "MyMenu".

2. Cliquez dans le champ du style, double-cliquez sur DS_CENTER, puis sur OK. Cela fera apparaître notre boîte de dialogue au centre de l'écran plutôt qu'en haut à gauche. Beaucoup de ces réglages sont utiles, par exemple, désactiver WS_SIZEBOX empêche notre boîte de dialogue d'être redimensionnée, ce qui la rendrait un peu étrange.

1

              

Ensuite, nous allons ajouter une icône (incluse ici - extrayez ceci dans votre dossier de projet). Cliquez sur l'avant-dernier bouton dans la barre d'exploration, cliquez sur Ajouter et naviguez jusqu'à votre icône. Remplissez un Nom et un ID en double-cliquant sur les champs, puis cliquez sur OK :

1

Enfin, désactivez le mode visuel pour voir le script. Les nouvelles parties sont encadrées en rouge. Si l'un des nouveaux ID de contrôle est en double, changez-le maintenant - ils doivent tous être uniques (encadrés en vert) :

1

Enregistrez votre nouveau script de ressources en tant que dialogbox2.rc, et maintenant nous verrons quel code a été ajouté pour utiliser ces ressources. Cliquez sur l'explorateur de projets, sélectionnez Untitled1.asm et collez le code de dialogbox2.asm. Comme vous pouvez le voir, pas grand-chose n'a changé à part l'ajout de quelques nouvelles variables :

1

et la procédure de dialogue traite les messages du menu :

1

Go All devrait vous donner ceci :

1

Maintenant, nous allons analyser le code.

Variables

Les nouvelles variables comprennent la chaîne de légende pour notre boîte de dialogue, le tampon - un tableau non initialisé de 512 octets pour recevoir le texte de la zone de modification, et les identifiants de contrôle des éléments de menu et de l'icône.

La procédure de dialogue

Le premier message que notre procédure de dialogue reçoit de Windows est WM_INITDIALOG. Si nous le traitons avec notre procédure de dialogue, nous pouvons y mettre n'importe quel code d'initialisation.

LoadIcon - charge l'icône spécifiée à partir de l'exécutable et renvoie son handle dans eax. Le message WM_SETICON indique à la procédure de dialogue d'associer l'icône à la boîte de dialogue spécifiée.

GetDlgItem - recherche le handle du contrôle spécifié (ici la zone de modification) et le renvoie dans eax.

SetFocus - force le focus d'entrée vers le contrôle avec le handle spécifié (encore une fois, la zone de modification ici afin que l'utilisateur puisse y taper du texte immédiatement).

Les lignes de code suivantes traitent les messages WM_COMMAND comme précédemment. En plus de provenir des contrôles de fenêtre enfants, ils sont maintenant générés si l'utilisateur a choisi un élément de menu. Si vous utilisez les mêmes codes ID pour les menus et les contrôles de fenêtre enfants, vous pouvez les différencier en examinant la valeur de lParam, qui sera 0 pour un élément de menu : 

  Low word of wParam High word of wParam lParam
Menu Menu ID 0 0
Control Control ID Notification code Child Window Handle

Si lParam est zéro, le message WM_COMMAND actuel provient d'un menu. Vous ne pouvez pas utiliser wParam pour différencier un menu d'un contrôle car les ID du menu et de contrôle peuvent être identiques et le code de notification peut être zéro.

Dans notre cas, nous avons des ID différents, nous pouvons donc traiter tous les messages dans la même boucle sans avoir à filtrer ceux avec un lParam égal à zéro dans une seconde boucle IF. Nous reverrons le concept de division des mots d'ordre élevé et faible des messages pour obtenir le code de notification dans le chapitre sur la génération de clés personnalisées.

La seule nouvelle fonction que nous avons utilisée est GetDlgItemText:

1

Utilisation du style visuel XP

Vous pouvez remarquer que bien que les contours des boutons dans l'éditeur de ressources de WinAsm aient des coins arrondis dans le style XP, l'exécutable compilé affiche les anciens boutons aux coins carrés. Pour utiliser le nouveau style visuel XP avec les contrôles communs, vous devez utiliser un fichier manifeste. Il s'agit d'un fichier XML (extensible markup language) standard qui doit être modifié uniquement pour inclure le nom de votre application. Le nom du fichier XML lui-même peut être n'importe quoi. Il doit être placé dans le même dossier que les fichiers sources et est spécifié par une seule ligne dans le script de ressources.

Le manifeste peut être ajouté au projet en cliquant sur l'onglet Ressources dans la barre d'exploration du projet, en cliquant sur Ressources puis sur Ajouter, et en ajoutant le fichier manifeste. Un nom de ressource n'est pas nécessaire, mais l'ID du manifeste doit toujours être 1 sinon cela ne fonctionnera pas :

1

Cela ajoute la ligne suivante au script de ressources juste en dessous de la ligne de l'icône (ce qui pourrait être fait manuellement) :

1 24 DISCARDABLE "dialogbox2.xml"

Enregistrez finalement à nouveau dialogbox2.rc et cela devrait correspondre à la version dans la section du code source. Maintenant, lors de la recompilation, vous devriez voir ceci :

1

Remarquez les boutons arrondis avec le contour bleuté. Le fichier manifeste est également inclus dans la section du code source. Juste pour référence, voici son contenu :

1

 


Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !