Beim Schreiben von Anwendungen werden gängige Komponenten wie ComboBox und ListBox normalerweise nicht nur zum Anzeigen von Text, sondern auch zum Anzeigen von mit dem Text verbundenen Symbolen verwendet. In allgemeinen Windows-Anwendungen ändert sich die Anzeige dieser Symbole, wenn sich der aufgelistete Anzeigetext ändert. Wenn beispielsweise alle Dateien im aktuellen Verzeichnis in einem Kombinationsfeld aufgelistet sind, bezieht sich die Anzeige auf der linken Seite des Kombinationsfelds auf Dateinamen. Verbundene Symbole werden als dynamische Symbole bezeichnet. Die Schritte zur Verwendung dynamischer Symbole in Delphi sind wie folgt: 1. Abrufen von Symbolen
Um dynamische Symbole zu verwenden, muss zunächst gelöst werden, wie der Anzeigetext und das damit verbundene Symbolhandle abgerufen werden. Das Symbol wird von der Systemregistrierung durch Dateizuordnung bestimmt, und in der Windows-Programmierung kann dieselbe Datei (oder dasselbe Unterverzeichnis oder dieser Ordner) auch zwei Anzeigeergebnisse auf dem Desktop haben, nämlich den DOS-Dateinamen und den Anzeigenamen (Anzeigename). . Wenn unsere Anwendung nicht den gleichen Effekt wie der Windows-Ressourcenbrowser haben muss, können wir die Funktionen FindFirst() und FindNext() sowie den FindClose()-Prozess verwenden, um den DOS-Dateinamen zu erhalten. Andernfalls sollten wir die Windows-API verwenden um den Anzeigenamen zu erhalten. Während Sie den Dateinamen abrufen, können Sie dessen Symbolhandle HICON mithilfe der Funktion SHGetFileInfo() in ShellAPI.pas abrufen. Die Anweisungen lauten wie folgt:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
pszPath-Parameter: der angegebene Dateiname. Wenn der Wert von uFlags SHGFI_PIDL nicht enthält, kann er direkt angegeben werden. Andernfalls muss pszPath durch Berechnung ermittelt werden und kann nicht direkt angegeben werden.
dwFileAttributes-Parameter: Dateiattribute, nur gültig, wenn der Wert von uFlags SHGFI_USEFILEATTRIBUTES enthält; dieser Parameter wird im Allgemeinen nicht verwendet;
psfi-Parameter: Gibt die erhaltenen Dateiinformationen zurück, bei denen es sich um einen Datensatztyp mit den folgenden Feldern handelt:
hIcon: HICON; //Icon-Handle der Datei
iIcon: Integer; //Systemindexnummer des Symbols
dwAttributes: DWORD; //Attributwerte der Datei
szDisplayName: Array [0..MAX_PATH-1] von AnsiChar; //Der Anzeigename der Datei
szTypeName: array [0..79] of AnsiChar; //Der Typname der Datei
cbFileInfo-Parameter: Bitwert von psfi;
uFlags-Parameter: Gibt die Dateiinformationskennung an, die zurückgegeben werden muss. Häufig verwendete Konstanten sind die folgenden:
SHGFI_ICON; //Das Symbol abrufen
SHGFI_DISPLAYNAME; //Den Anzeigenamen abrufen
SHGFI_TYPENAME; //Den Typnamen abrufen
SHGFI_ATTRIBUTES;//Attribute abrufen
SHGFI_LARGEICON; //Großes Symbol erhalten
SHGFI_SMALLICON; //Das kleine Symbol abrufen
SHGFI_PIDL; // pszPath ist ein Bezeichner
Der Rückgabewert der Funktion SHGetFileInfo() variiert auch mit dem Wert von uFlags. Durch Aufrufen von SHGetFileInfo() können Sie das Symbolhandle der Datei aus dem psfi-Parameter abrufen. Beachten Sie jedoch, dass SHGetFileInfo() keine Informationen über virtuelle Ordner wie „Arbeitsplatz“ abrufen kann, wenn SHGFI_PIDL nicht im uFlags-Parameter verwendet wird. 2. Laden von Icons
Verwenden Sie die von Delphi bereitgestellte TImageList-Komponente, um das erhaltene Symbol zu laden, indem Sie die Funktion ImageList_AddIcon() in CommCtrl.pas aufrufen, und stellen Sie sicher, dass seine Indexnummer dem angezeigten Text entspricht. Die Anweisungen lauten wie folgt:
function ImageList_AddIcon(ImageList: HIMAGELIST; //Das ImageList-Handle des Symbols laden
Icon: Hicon //Geladenes Icon-Handle): Integer; //Die Indexnummer des Icons in der ImageList zurückgeben
Der Rückgabewert von ImageList_AddIcon() kann verwendet werden, wenn Sie die Indexnummer des Symbols angeben müssen. 3. Grafische Ausgabe von Icons und Texten
Bei Komponenten wie Kombinationsfeldern und Listenfeldern, die Symbole nicht direkt anzeigen können, da sie gleichzeitig Symbole und Text anzeigen müssen, kann dies durch Festlegen der entsprechenden Stileigenschaften erreicht werden. Beispiele sind wie folgt:
Kombinationsfeld: ComboBox1.Style:=csOwnerDrawVariable Es ist besser, es nicht direkt im ObjectInspector-Formular festzulegen, sondern den Code an der entsprechenden Stelle im Programm einzufügen, da sich sonst die Höhe unregelmäßig ändert Es kann zu einer Vergrößerung der Zeichenfläche kommen.
Listenfeld: ListBox1.Style:=lbOwnerDrawVariable
Statusleiste: StatusBar1.Panels[i].Style:= psOwnerDraw kann keine einfache Statusleiste verwenden. i ist die Indexnummer eines bestimmten Bereichs in der Statusleiste, in dem das Symbol gezeichnet werden soll. Die Grafikausgabe kann ImageList1.Draw verwenden ()-Methode von TImageList und die Textausgabe können die TextOut()-Methode von TCanvas verwenden, die von der Canvas-Eigenschaft der Komponente geerbt wird. Offensichtlich können Komponenten ohne Canvas-Eigenschaften diese Methode nicht zum Anzeigen von Symbolen verwenden.
Geben Sie für Komponenten, die Symbole direkt anzeigen können, direkt die erforderlichen Symboleigenschaften wie Bilder und StateImages als entsprechende TimageList-Komponentennamen an. Das Symbol kann durch Angabe der Indexnummer des Symbols angezeigt werden. Beachten Sie, dass Sie bei Verwendung großer Symbole zunächst die Methode CreateSize() von TImageList aufrufen müssen, um die Größe des ladbaren Symbols anzugeben, und nach jedem Aufruf der Clear-Methode von TImageList erneut CreateSize() aufrufen müssen.
Verwenden Sie die ImageList1.Clear-Methode von TImageList, um die geladenen Symbole zu löschen, was häufig verwendet wird, wenn eine Aktualisierung erforderlich ist.