Lors de l'écriture d'applications, des composants courants tels que ComboBox et ListBox sont généralement utilisés non seulement pour afficher du texte, mais également pour afficher des icônes liées au texte. Dans les applications Windows générales, l'affichage de ces icônes change à mesure que le texte affiché change. Par exemple, lorsque tous les fichiers du répertoire actuel sont répertoriés dans une zone de liste déroulante, l'affichage sur le côté gauche de la zone de liste déroulante est lié au. nom de fichier. Les icônes connectées sont appelées icônes dynamiques. Les étapes pour utiliser les icônes dynamiques dans Delphi sont les suivantes : 1. Obtention des icônes
Pour utiliser des icônes dynamiques, la première chose à résoudre est de savoir comment obtenir le texte affiché et la poignée d'icône qui lui est associée. L'icône est déterminée par le registre système via l'association de fichiers, et dans la programmation Windows, le même fichier (ou sous-répertoire ou dossier) peut également avoir deux résultats d'affichage sur le bureau, qui sont le nom du fichier DOS et le nom d'affichage (Nom d'affichage). . Si notre application n'a pas besoin d'avoir le même effet que le navigateur de ressources Windows, nous pouvons utiliser les fonctions FindFirst() et FindNext() et le processus FindClose() pour obtenir le nom du fichier DOS. Sinon, nous devons utiliser l'API Windows. pour obtenir le nom d’affichage. Lors de l'obtention du nom du fichier, vous pouvez obtenir son icône HICON en utilisant la fonction SHGetFileInfo() dans ShellAPI.pas.
fonction SHGetFileInfo (pszPath : PAnsiChar ; dwFileAttributes : DWord ; var psfi : TSHFileInfo ; cbFileInfo, uFlags : UINT) : DWORDl ;
Paramètre pszPath : le nom de fichier spécifié. Lorsque la valeur de uFlags ne contient pas SHGFI_PIDL, elle peut être spécifiée directement ; sinon, pszPath doit être obtenu par calcul et ne peut pas être spécifié directement ;
Paramètre dwFileAttributes : attributs du fichier, valable uniquement lorsque la valeur de uFlags contient SHGFI_USEFILEATTRIBUTES, ce paramètre n'est généralement pas utilisé ;
Paramètre psfi : renvoie les informations de fichier obtenues, qui sont un type d'enregistrement avec les champs suivants :
hIcon : HICON ; //Icône descripteur du fichier
iIcon : Integer ; //Numéro d'index système de l'icône
dwAttributes : DWORD ; //Valeurs d'attribut du fichier
szDisplayName : tableau [0..MAX_PATH-1] de AnsiChar //Le nom d'affichage du fichier ;
szTypeName : tableau [0..79] de AnsiChar ; //Le nom de type du fichier
Paramètre cbFileInfo : valeur binaire de psfi ;
Paramètre uFlags : indique l'identifiant des informations de fichier qui doit être renvoyé. Les constantes couramment utilisées sont les suivantes :
SHGFI_ICON; //Obtenir l'icône
SHGFI_DISPLAYNAME; //Obtenir le nom d'affichage
SHGFI_TYPENAME; //Obtenir le nom du type
SHGFI_ATTRIBUTES;//Obtenir les attributs
SHGFI_LARGEICON; //Obtenir une grande icône
SHGFI_SMALLICON; //Récupère la petite icône
SHGFI_PIDL; // pszPath est un identifiant
La valeur de retour de la fonction SHGetFileInfo() varie également avec la valeur de uFlags. En appelant SHGetFileInfo(), vous pouvez obtenir le handle d'icône du fichier à partir du paramètre psfi, mais veuillez noter que lorsque SHGFI_PIDL n'est pas utilisé dans le paramètre uFlags, SHGetFileInfo() ne peut pas obtenir d'informations sur les dossiers virtuels tels que « Poste de travail ». 2. Chargement des icônes
Utilisez le composant TImageList fourni par Delphi pour charger l'icône obtenue en appelant la fonction ImageList_AddIcon() dans CommCtrl.pas, et assurez-vous que son numéro d'index correspond au texte affiché. Les instructions sont les suivantes :
function ImageList_AddIcon(ImageList: HIMAGELIST; //Charger le handle ImageList de l'icône
Icône : Hicon //Poignée d'icône chargée) : Integer ; //Renvoie le numéro d'index de l'icône dans ImageList
La valeur de retour de ImageList_AddIcon() peut être utilisée lorsque vous devez spécifier le numéro d'index de l'icône. 3. Sortie graphique des icônes et du texte
Pour les composants tels que les zones de liste déroulante et les zones de liste qui ne peuvent pas afficher directement les icônes, car ils doivent afficher des icônes et du texte en même temps, cela peut être réalisé en définissant leurs propriétés de style correspondantes. Les exemples sont les suivants :
Zone de liste déroulante : ComboBox1.Style:=csOwnerDrawVariable Selon l'expérience d'utilisation réelle, il est préférable de ne pas le définir directement dans le formulaire ObjectInspector. Au lieu de cela, le code doit être ajouté à l'emplacement approprié dans le programme, sinon des modifications irrégulières de la hauteur. de la zone de dessin peut se produire.
Zone de liste : ListBox1.Style:=lbOwnerDrawVariable
Barre d'état : StatusBar1.Panels[i].Style:= psOwnerDraw ne peut pas utiliser une simple barre d'état. i est le numéro d'index d'un certain volet dans la barre d'état où l'icône doit être dessinée. La sortie graphique peut utiliser ImageList1.Draw. () de TImageList et la sortie Text peut utiliser la méthode TextOut() de TCanvas, qui est héritée de la propriété Canvas du composant. Évidemment, les composants sans propriétés Canvas ne peuvent pas utiliser cette méthode pour afficher des icônes.
Pour les composants qui peuvent afficher directement des icônes, spécifiez directement les propriétés d'icône requises telles que Images et StateImages comme nom de composant TimageList correspondant, et l'icône peut être affichée en spécifiant le numéro d'index de l'icône. Il convient de noter que lorsque vous utilisez de grandes icônes, vous devez d'abord appeler la méthode CreateSize() de TImageList pour spécifier la taille de l'icône chargeable, puis appeler à nouveau CreateSize() après chaque appel à la méthode Clear de TImageList.
Utilisez la méthode ImageList1.Clear de TImageList pour effacer les icônes chargées, qui est souvent utilisée lorsqu'une actualisation est requise.