Na escrita de aplicativos, componentes comuns como ComboBox e ListBox são normalmente usados não apenas para exibir texto, mas também para exibir ícones relacionados ao texto. Em aplicativos gerais do Windows, a exibição desses ícones mudará conforme o texto de exibição listado for alterado. Por exemplo, quando todos os arquivos no diretório atual estiverem listados em uma caixa de combinação, a exibição no lado esquerdo da caixa de combinação estará relacionada ao arquivo. nome do arquivo. Os ícones conectados são chamados de ícones dinâmicos. As etapas para usar ícones dinâmicos no Delphi são as seguintes: 1. Obtenção de ícones
Para utilizar ícones dinâmicos, a primeira coisa a resolver é como obter o texto de exibição e o identificador do ícone associado a ele. O ícone é determinado pelo registro do sistema por meio de associação de arquivo e, na programação do Windows, o mesmo arquivo (ou subdiretório, ou pasta) também pode ter dois resultados de exibição na área de trabalho, que são o nome do arquivo DOS e o nome de exibição (Nome de exibição) . Se nossa aplicação não precisar ter o mesmo efeito que o Navegador de Recursos do Windows, podemos usar as funções FindFirst() e FindNext() e o processo FindClose() para obter o nome do arquivo DOS. Caso contrário, devemos usar a API do Windows. para obter o nome de exibição. Ao obter o nome do arquivo, você pode obter seu identificador de ícone HICON usando a função SHGetFileInfo() em ShellAPI.pas.
função SHGetFileInfo (pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
Parâmetro pszPath: o nome do arquivo especificado. Quando o valor de uFlags não contém SHGFI_PIDL, ele pode ser especificado diretamente, caso contrário, pszPath deve ser obtido por meio de cálculo e não pode ser especificado diretamente;
Parâmetro dwFileAttributes: atributos do arquivo, válido apenas quando o valor de uFlags contém SHGFI_USEFILEATTRIBUTES, este parâmetro geralmente não é utilizado;
Parâmetro psfi: Retorna as informações do arquivo obtido, que é um tipo de registro com os seguintes campos:
hIcon: HICON; //Identificador do ícone do arquivo
iIcon: Integer; //Número de índice do sistema do ícone
dwAttributes: DWORD; //Valores de atributos do arquivo
szDisplayName: array [0..MAX_PATH-1] de AnsiChar; //O nome de exibição do arquivo;
szTypeName: array [0..79] de AnsiChar; //O nome do tipo do arquivo;
Parâmetro cbFileInfo: valor do bit de psfi;
Parâmetro uFlags: Indica o identificador de informações do arquivo que precisa ser retornado. As constantes comumente usadas são as seguintes:
SHGFI_ICON; //Obtém o ícone
SHGFI_DISPLAYNAME; //Obtém o nome de exibição
SHGFI_TYPENAME; //Obtém o nome do tipo
SHGFI_ATTRIBUTES;//Obtém atributos
SHGFI_LARGEICON; //Obter ícone grande
SHGFI_SMALLICON; //Obtém o ícone pequeno
SHGFI_PIDL; // pszPath é um identificador
O valor de retorno da função SHGetFileInfo() também varia com o valor de uFlags. Chamando SHGetFileInfo(), você pode obter o identificador do ícone do arquivo do parâmetro psfi, mas observe que quando SHGFI_PIDL não é usado no parâmetro uFlags, SHGetFileInfo() não pode obter informações sobre pastas virtuais como "Meu Computador". 2. Carregamento de ícones
Utilize o componente TImageList fornecido pelo Delphi para carregar o ícone obtido chamando a função ImageList_AddIcon() em CommCtrl.pas, e certifique-se de que seu número de índice corresponda ao texto exibido. As instruções são as seguintes:
function ImageList_AddIcon(ImageList: HIMAGELIST; //Carrega o identificador ImageList do ícone
Icon: Hicon //Identificador do ícone carregado): Integer //Retorna o número do índice do ícone no ImageList;
O valor de retorno de ImageList_AddIcon() pode ser usado quando você precisar especificar o número de índice do ícone. 3. Saída gráfica de ícones e texto
Para componentes como caixas de combinação e caixas de listagem que não podem exibir ícones diretamente, porque são obrigados a exibir ícones e texto ao mesmo tempo, isso pode ser conseguido definindo suas propriedades de estilo correspondentes. Os exemplos são os seguintes:
Caixa de combinação: ComboBox1.Style:=csOwnerDrawVariable. De acordo com a experiência de uso real, é melhor não defini-lo diretamente no formulário ObjectInspector. Em vez disso, o código deve ser adicionado ao local apropriado no programa, caso contrário, alterações irregulares na altura. da área de desenho pode ocorrer.
Caixa de listagem: ListBox1.Style:=lbOwnerDrawVariable
Barra de status: StatusBar1.Panels[i].Style:= psOwnerDraw não pode usar uma barra de status simples i é o número de índice de um determinado painel na barra de status onde o ícone deve ser desenhado. () de TImageList e a saída de texto podem usar o método TextOut() de TCanvas, que é herdado da propriedade Canvas do componente. Obviamente, componentes sem propriedades Canvas não podem usar esse método para exibir ícones.
Para componentes que podem exibir ícones diretamente, especifique diretamente as propriedades necessárias do ícone, como Imagens e StateImages, como o nome do componente TimageList correspondente, e o ícone pode ser exibido especificando o número de índice do ícone. Deve-se observar que ao usar ícones grandes, você deve primeiro chamar o método CreateSize() de TImageList para especificar o tamanho do ícone carregável e chamar CreateSize() novamente após cada chamada ao método Clear de TImageList.
Use o método ImageList1.Clear de TImageList para limpar os ícones carregados, que é frequentemente usado quando a atualização é necessária.