Einzelnen Beitrag anzeigen

Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

GDI-Zeichnungen entfernen

  Alt 20. Jul 2003, 12:53
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat