In writing an application, a combo box (ComboBox), list box (ListBox), and other common parts are typically used not only to display text but also to display its text-related icons. In a typical Windows application, the display of these icons varies with the display text that is listed, such as when all the files in the current directory are listed in the combo box, and the icon associated with the file name is displayed to the left of the combo box, which is called the dynamic icon. The steps for using dynamic icons in Delphi are as follows:
One, the acquisition of the icon
To use a dynamic icon, the first thing to solve is how to get the display text and its associated icon handle. The icon is determined by the system registry by file association, and there may be two display results on the desktop for the same file (or subdirectory, or folder) in Windows programming, which is the DOS filename and display name. If our application does not need to have an effect like Windows Explorer, you can use the FindFirst () and FindNext () two functions and the findclose () procedure to get the DOS filename. Otherwise, we should use WINDOWSAPI to get the display name. You can obtain its icon handle Hicon by using the Shgetfileinfo () function in Shellapi.pas when you obtain the filename, as described below:
function Shgetfileinfo (Pszpath:pansichar; Dwfileattributes:dword;var psfi:tshfileinfo; cbfileinfo,uflags:uint): DWORDL;
Pszpath parameter: The specified file name. When the value of the uflags does not contain shgfi_pidl, it can be specified directly, otherwise the pszpath should be obtained by calculation and cannot be specified directly.
dwFileAttributes Parameters: File properties, only when the value of Uflags contains shgfi_usefileattributes is valid, generally do not use this parameter;
PSFI parameter: Returns the obtained file information, which is a record type with the following fields:
Hicon:hicon; Icon handle for file
Iicon:integer; The system index number of the icon
Dwattributes:dword; Property value for File
Szdisplayname:array [0..max_path-1] of Ansichar; The display name of the file
Sztypename:array [0..79] of Ansichar; The type name of the file
Cbfileinfo parameter: bit value of PSFI;
Uflags parameter: Indicates the file information identifier that needs to be returned, and the following constants are commonly used:
Shgfi_icon; Get icon
Shgfi_displayname; Get Display Name
Shgfi_typename; Get type name
Shgfi_largeicon; Get Large Icons
Shgfi_smallicon; Get Small Icons
shgfi_pidl;//Pszpath is an identifier
The return value of the function shgetfileinfo () also varies depending on the value of the uflags. by calling Shgetfileinfo (), you can get the icon handle of the file by the PSFI parameter, but note that shgetfileinfo () cannot obtain information about virtual folders such as My computer when SHGFI_PIDL is not used in the Uflags parameter. Second, the loading of the icon
Using the Timagelist component provided by Delphi, load the resulting icon by invoking the function Imagelist_addicon () in Commctrl. Pas, and ensure that its index number corresponds to the display text. The description is as follows:
function Imagelist_addicon (imagelist:himagelist;//load icon ImageList handle
Icon:hicon//Loaded icon handle): Integer; Returns the index number of the icon in ImageList
Use the return value of Imagelist_addicon () when you need to indicate an icon index number.
Graphic output of icons and text
For components that can't display icons directly, such as combo boxes, list boxes, and so on, because you want to display the icon and display the text at the same time, you can do so by setting its corresponding style property, as shown in the following example:
Combo box: combobox1.style:=csownerdrawvariable It is best not to set it directly in the Objectinspector form, depending on the actual experience, but to add the code to the appropriate location in the program, otherwise the height of the drawing area may appear irregular
List box: listbox1.style:=lbownerdrawvariable
Status bar: Statusbar1.panels[i]. Style:= Psownerdraw cannot use the simple status bar, I is the index number of a pane in the status bar to draw an icon, the graphics output can use the Timagelist Imagelist1.draw () method, and the text output can use Tcanvas TextOut () method, which is inherited by the component's Canvas property, and it is obvious that a component without a canvas property cannot use this method to display an icon.
For components that can display icons directly, specify the icon properties that are required for their images, stateimages, and so on, and then display the icons by specifying the index number of the icon for the corresponding Timagelist component name. Note that when you use a large icon, you must first call the Timagelist Createsize () method to specify the dimensions of the loadable icon and recall createsize () each time the Timagelist clear method is invoked.
Use the Timagelist Imagelist1.clear method to clear the loaded icons, which are often used when refreshing is required.