Ich bastele gerade mit der
GDI herum, komme aber jetzt nicht weiter.
Ich zeichne um die Spalten eines Report-Listviews einen Markierungsrahmen. Oder besser gesagt, ich zeichne die an die Position der Spalte via DrawText den Text der Spalte mit der Hintergrundfarbe COLOR_HIGHLIGHT. Um die Spalte wieder zu deselektieren, habe ich versucht, den Text nit Standard-Hintergrund und -schriftfarbe an die gleuiche Stelle zeichnen. Aber das klappt nicht.
Folgendermaßen sieht der Code zum Zeichnen der Markierung aus:
Delphi-Quellcode:
procedure THexListView.ColDrawRoutine(Rect: TRect; iItem, iSubItem: Integer);
var
LVDC: HDC;
lpText:
String[255];
TextLen: Integer;
begin
LVDC := GetDC(ListViewHandle);
//alte Markierung entfernen
DeselectColumns;
//neuen Eintrag Zeichnen
SetBkColor(LVDC, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(LVDC,
RGB($FF, $FF, $FF));
SelectObject(LVDC, FhLVFont);
TextLen := 255;
lpText := StringOfChar(#0, TextLen);
ListView_GetItemText(ListViewHandle, iItem, iSubItem, @lpText[1], TextLen);
DrawText(LVDC, @lpText[1], -1, Rect, DT_CENTER
or DT_SINGLELINE
or DT_VCENTER);
FSelCol.iItem := iItem;
FSelCol.iSubItem := iSubItem;
FSelCol.Selected := True;
ReleaseDC(ListViewHandle, LVDC);
end;
Und so versuche ich, die Markierung wieder zu entfernen:
Delphi-Quellcode:
procedure THexListView.DeselectColumns;
var
LVDC: HDC;
lpText:
String[255];
TextLen: Integer;
Rect: TRect;
begin
//stoppen, falls nichts markiert ist
if not FSelCol.Selected
then Exit;
LVDC := GetDC(ListViewHandle);
//Device Context modifizieren
SetBkColor(LVDC, ListView_GetTextBkColor(ListViewHandle));
SetTextColor(LVDC, ListView_GetTextBkColor(ListViewHandle));
SetBkColor(LVDC, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(LVDC,
RGB($FF, $FF, $FF));
SelectObject(LVDC, FhLVFont);
//zeichnen
TextLen := 255;
lpText := StringOfChar(#0, TextLen);
Rect := GetSubItemRect(FSelCol.iItem, FSelCol.iSubItem)^;
ListView_GetItemText(ListViewHandle, FSelCol.iItem, FSelCol.iSubItem, @lpText[1], TextLen);
DrawText(LVDC, @lpText[1], -1, Rect,
DT_CENTER
or DT_SINGLELINE
or DT_VCENTER);
FSelCol.Selected := False;
ReleaseDC(ListViewHandle, LVDC);
end;
Leider wird in der zweiten Prozedur nichts gezeichnet.
Die zweite Möglichkeit wäre, eigentlich die bessere, alle selbst gezeichneten Elemente zu entfernen. Geht das irgendwie?
Die
GDI ist völliges Neuland für mich, und ein umfassendes Tutorial habe ich auch noch nicht gefunden. Und das
PSDK hilft mir auch nur bedingt weiter.