Al escribir aplicaciones, los componentes comunes como ComboBox y ListBox generalmente se usan no solo para mostrar texto, sino también para mostrar íconos relacionados con el texto. En las aplicaciones generales de Windows, la visualización de estos iconos cambiará a medida que cambie el texto mostrado. Por ejemplo, cuando todos los archivos del directorio actual aparecen en un cuadro combinado, la visualización en el lado izquierdo del cuadro combinado está relacionada con el. nombre del archivo Los iconos conectados se denominan iconos dinámicos. Los pasos para utilizar íconos dinámicos en Delphi son los siguientes: 1. Obtención de íconos
Para utilizar iconos dinámicos, lo primero que hay que resolver es cómo obtener el texto de visualización y el identificador del icono asociado a él. El icono lo determina el registro del sistema a través de la asociación de archivos y, en la programación de Windows, el mismo archivo (o subdirectorio o carpeta) también puede tener dos resultados de visualización en el escritorio, que son el nombre del archivo DOS y el nombre para mostrar (Nombre para mostrar). . Si nuestra aplicación no necesita tener el mismo efecto que el Explorador de recursos de Windows, podemos usar las funciones FindFirst() y FindNext() y el proceso FindClose() para obtener el nombre del archivo DOS. De lo contrario, deberíamos usar la API de Windows. para obtener el nombre para mostrar. Mientras obtiene el nombre del archivo, puede obtener el identificador de su icono HICON utilizando la función SHGetFileInfo() en ShellAPI.pas. Las instrucciones son las siguientes:
función SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
Parámetro pszPath: el nombre del archivo especificado. Cuando el valor de uFlags no contiene SHGFI_PIDL, se puede especificar directamente; de lo contrario, pszPath se debe obtener mediante cálculo y no se puede especificar directamente;
Parámetro dwFileAttributes: atributos del archivo, solo válido cuando el valor de uFlags contiene SHGFI_USEFILEATTRIBUTES, este parámetro generalmente no se usa;
Parámetro psfi: Devuelve la información del archivo obtenido, que es un tipo de registro con los siguientes campos:
hIcon: HICON; //Icono de manejo del archivo
iIcon: Integer; //Número de índice del sistema del icono
dwAttributes: DWORD; //Valores de atributos del archivo
szDisplayName: matriz [0..MAX_PATH-1] de AnsiChar // El nombre para mostrar del archivo;
szTypeName: matriz [0..79] de AnsiChar // El nombre del tipo del archivo
Parámetro cbFileInfo: valor de bit de psfi;
Parámetro uFlags: indica el identificador de información del archivo que debe devolverse. Las constantes más utilizadas son las siguientes:
SHGFI_ICON; //Obtener el icono
SHGFI_DISPLAYNAME; //Obtener el nombre para mostrar
SHGFI_TYPENAME; //Obtener el nombre del tipo
SHGFI_ATTRIBUTES;//Obtener atributos
SHGFI_LARGEICON; //Obtener icono grande
SHGFI_SMALLICON; //Obtener el icono pequeño
SHGFI_PIDL; // pszPath es un identificador
El valor de retorno de la función SHGetFileInfo() también varía con el valor de uFlags. Al llamar a SHGetFileInfo(), puede obtener el identificador del icono del archivo desde el parámetro psfi, pero tenga en cuenta que cuando SHGFI_PIDL no se utiliza en el parámetro uFlags, SHGetFileInfo() no puede obtener información sobre carpetas virtuales como "Mi PC". 2. Carga de iconos
Utilice el componente TImageList proporcionado por Delphi para cargar el icono obtenido llamando a la función ImageList_AddIcon() en CommCtrl.pas y asegúrese de que su número de índice corresponda al texto mostrado. Las instrucciones son las siguientes:
function ImageList_AddIcon(ImageList: HIMAGELIST; //Carga el identificador ImageList del icono
Icono: Hicon // Identificador del icono cargado): Integer // Devuelve el número de índice del icono en ImageList;
El valor de retorno de ImageList_AddIcon() se puede utilizar cuando necesite especificar el número de índice del icono. 3. Salida gráfica de iconos y texto.
Para componentes como cuadros combinados y cuadros de lista que no pueden mostrar íconos directamente, porque deben mostrar íconos y texto al mismo tiempo, esto se puede lograr configurando sus propiedades de estilo correspondientes. Los ejemplos son los siguientes:
Cuadro combinado: ComboBox1.Style:=csOwnerDrawVariable. Según la experiencia de uso real, es mejor no configurarlo directamente en el formulario ObjectInspector. En su lugar, el código debe agregarse a la ubicación adecuada en el programa, de lo contrario habrá cambios irregulares en la altura. del área de dibujo puede ocurrir.
Cuadro de lista: ListBox1.Style:=lbOwnerDrawVariable
Barra de estado: StatusBar1.Panels[i].Style:= psOwnerDraw no puede usar una barra de estado simple. i es el número de índice de un determinado panel en la barra de estado donde se dibujará el ícono. La salida gráfica puede usar ImageList1.Draw. () de TImageList, y la salida de texto puede usar el método TextOut() de TCanvas, que se hereda de la propiedad Canvas del componente. Obviamente, los componentes sin propiedades de Canvas no pueden usar este método para mostrar iconos.
Para los componentes que pueden mostrar íconos directamente, especifique directamente las propiedades de ícono requeridas, como Imágenes y StateImages, como el nombre del componente TimageList correspondiente, y el ícono se puede mostrar especificando el número de índice del ícono. Cabe señalar que cuando utilice íconos grandes, primero debe llamar al método CreateSize() de TImageList para especificar el tamaño del ícono cargable y llamar a CreateSize() nuevamente después de cada llamada al método Clear de TImageList.
Utilice el método ImageList1.Clear de TImageList para borrar los iconos cargados, que se utiliza a menudo cuando es necesario actualizar.