C
Danke alle, jetzt geht es!
Mit Sundays Code wird das richtige Icon eingebunden. Ledier wird es immer default auf 32 *32 skaliert. Das mit 'SHGFI_SMALLICON' jedoch das kleine Icon genommen wird, sieht das Resultat ziemlich unschön aus. (sehr grobes großes Icon).
Der Trick ist das Icon anschließend mit DrawIconEx() runter zu skalieren, dann wird alles schön.
Code zum erstellen eines Systemicons im OnDrawCell Event eines String Grids:
void __fastcall TfMain::DataGridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
// nur in der ersten Spalte, nicht in der ersten Zeile
if (ACol == 1 && ARow != 0)
{
// nur wenn inhalt in der Spalte steht (Inhalt = Rückgabe ExtractFileExt() !!)
if (DataGrid->Cells[ACol][ARow].data() != NULL)
{
String FileName = "*" + DataGrid->Cells[ACol][ARow];
HICON hGen16Icon;
SHFILEINFO shfi;
unsigned short IconIndex = 0;
// Systemincon zu einer Datei wird ermitelt
if (SHGetFileInfo (FileName.c_str(),
0,
&shfi,
sizeof (SHFILEINFO),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON))
{
hGen16Icon = shfi.hIcon;
if (hGen16Icon == NULL) return;
// Text in Spalte übermalen (löschen, nur Icon ist gewollt)
DataGrid->Canvas->FillRect(Rect);
// Systemicon wird dargestellt.
DrawIconEx(DataGrid->Canvas->Handle, Rect.Left+1,Rect.Top+1, hGen16Icon, 16, 16, 0, NULL, DI_NORMAL);
}
}
}
}