[C/Win32] Individuelle Schriftfarbe in Listbox-Einträgen

Rene Albrecht

Erfahrenes Mitglied
Hi (speziell @Endurion),

ich habe eine Ownerdraw-Listbox erzeugt und schreibe mittels
Code:
SendMessage(GetDlgItem(hwndDlg, IDD_NACHRICHTEN), LB_ADDSTRING, 0, (LPARAM) nachricht);
und der Auswertung von WM_DRAWITEM
Code:
case WM_DRAWITEM:
{
	DRAWITEMSTRUCT *ds = (DRAWITEMSTRUCT *)lParam;
	if (ds->CtlID != IDD_NACHRICHTEN) return FALSE;
	char tmpString[4096];
	SendMessage(GetDlgItem(hwndDlg, IDD_NACHRICHTEN), LB_GETTEXT, ds->itemID, (LPARAM)&tmpString[0]);
	MessageBox(NULL,absender,"Absender",MB_OK);
	MessageBox(NULL,abs_idd_2,"Absender_IDD_2",MB_OK);
	DrawText(ds->hDC, tmpString, lstrlen(tmpString), &(ds->rcItem), DT_LEFT);
	return TRUE;
}
Strings in die Felder.

Wie kann ich die Schrif in den Feldern individuell gestalten? Würde z.B. gern in eine bestimmte Zeile rot, eine andere grün etc. schreiben. Wenn ich mir jedoch in der WM_DRAWITEM den Handle auf das HDC besorge und ein SetTextColor (hDC, RGB(255,0,0)) setze werden alle Elemente rot geschrieben. :mad:
 
@Michael:
Hi... Endurion konnte mir bei der Listbox schon gewaltig weiterhelfen, deshalb der spezielle Gruß an ihn. :) Sicher kann ich eine Schriftart oder z.B. auch eine andere Farbe mitgeben, allerdings stellt er dann alle Felder in dieser Schriftart/-farbe dar. :(
 
Uii, ich bin bekannt :)

Du musst ja irgendwie am Item festmachen, in welcher Farbe (und/oder Font oder wasauchimmer) es ausgegeben werden soll. D.h. aber, dass du das für jedes Item machen musst. Also nicht nur bei einem Item, das rot gezeichnet werden soll, auf rot setzen, sondern auch bei einem "normalen" wieder auf Default zurück. Ein HDC merkt sich solche Einstellungen.

Der einzige Wert, den du bei einem Item beliebig ändern kannst (mal abgesehen vom Text) wäre das berühmte Itemdata. Wenn du also Zusatzinformationen für jedes Item haben willst (und diese auch in der ListBox speichern willst), dann verwende das ItemData. Das ItemData bietet Platz für einen Pointer bzw. einen Zahlwert. Wenn du mehr als nur die Farbe pro Item haben willst, müsstest du mit einem Struct arbeiten und dir den Pointer darauf merken.

In WM_DRAWITEM hast du ja im DRAWITEMSTRUCT ein itemData-Member. Dieses enthält dieses ItemData. Einfach zurückcasten (bei einem Struct) oder direkt als Farbwert missbrauchen.

Also beim Anlegen eines Items so:

Code:
int iItem = SendMessage(GetDlgItem(hwndDlg, IDD_NACHRICHTEN), LB_ADDSTRING, 0, (LPARAM) nachricht);
if ( iItem != LB_ERR )
{
  SendMessage( GetDlgItem(hwndDlg, IDD_NACHRICHTEN), LB_SETITEMDATA, iItem, RGB( 255, 0, 255 );
}

und in WM_DRAWITEM zusätzlich so:

Code:
case WM_DRAWITEM:
{
  DRAWITEMSTRUCT *ds = (DRAWITEMSTRUCT *)lParam;
  if (ds->CtlID != IDD_NACHRICHTEN) return FALSE;
  char tmpString[4096];
  SendMessage(GetDlgItem(hwndDlg, IDD_NACHRICHTEN), LB_GETTEXT, ds->itemID, (LPARAM)&tmpString[0]);
  MessageBox(NULL,absender,"Absender",MB_OK);
  MessageBox(NULL,abs_idd_2,"Absender_IDD_2",MB_OK );

  // das ist neu! (Blink) das ist neu! (Blink)
  SetTextColor( ds->hDC, ds->itemData );
  // das ist neu! (Blink) das ist neu! (Blink)

  DrawText(ds->hDC, tmpString, lstrlen(tmpString), &(ds->rcItem), DT_LEFT);
  return TRUE;
}


Edit: Tabs sind Teufelswerk! (Weihrauchspritz)
 
Zurück