// Hiermit kann man (zur Laufzeit) den Spaltenköpfen von TListView // (ViewStyle = vsReport) unterschiedliche Farben zuweisen. Das Ganze als // Komponente, welche auch Bilder (rechts oder links vom Spaltentext) // anzeigen kann, findet man unter farbige Columnheader in TListView erzeugen
unit LV_HEader; interface uses Windows, Messages, Classes, Forms, Controls, Graphics, ComCtrls, CommCtrl; type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen} public dc: HDC; pt: TPoint; cnv: TCanvas; unten: boolean; AProz: Pointer; Header: longint; procedure zeichnen; procedure NProz(var M: TMessage); end; var Form1: TForm1; implementation {$R *.DFM} const farbe: array[0..4] of TColor = (clred, clbtnface, clgreen, clblack, clblue); schrift: array[0..3] of TColor = (clyellow, clblack, clwhite, cllime); procedure TForm1.FormCreate(Sender: TObject); begin unten := false; header := ListView_GetHeader(Listview1.handle); SetWindowlong(Header, GWL_STYLE, GetWindowlong(Header, GWL_STYLE) and not HDS_FULLDRAG); AProz := Pointer(GetWindowlong(Header, GWL_WNDPROC)); SetWindowlong(Header, GWL_WNDPROC, Integer(MakeObjectInstance(NProz))); dc := GetDC(Header); cnv := TCanvas.create; cnv.handle := dc; end; procedure TForm1.FormDestroy(Sender: TObject); begin cnv.free; releasedc(Header, dc); end; procedure TForm1.zeichnen; var x, y, hf, hs: integer; r, rec: TRect; begin y := 0; hf := high(farbe); hs := high(schrift); cnv.font := Listview1.font; Windows.GetClientRect(Header, r); for x := 0 to Listview1.columns.count - 1 do begin with cnv do begin rec := rect(y, 0, y + Listview1.columns[x].width, r.bottom); if x <= hf then brush.color := farbe[x] else brush.color := clbtnface; pen.color := clbtnShadow; if unten and ptinrect(rec, pt) then begin rectangle(rec.left, rec.top, rec.right, rec.bottom); offsetrect(rec, 1, 1); end else begin fillrect(rec); moveto(y + Listview1.columns[x].width - 2, 0); lineto(y + Listview1.columns[x].width - 2, r.bottom - 2); lineto(y - 1, r.bottom - 2); pen.color := clbtnHighLight; if Listview1.ColumnClick then begin moveto(y, r.bottom - 2); lineto(y, 0); lineto(y + Listview1.columns[x].width - 1, 0); pen.color := cl3DDKShadow; end; moveto(y + Listview1.columns[x].width - 1, 0); lineto(y + Listview1.columns[x].width - 1, r.bottom - 1); lineto(y - 1, r.bottom - 1); end; inflaterect(rec, -2, -2); inc(rec.left, 2); if x <= hs then cnv.Font.color := schrift[x] else cnv.Font.color := clWindowText; drawtext(handle, pchar(Listview1.columns[x].caption), -1, rec, DT_LEFT); end; y := y + Listview1.columns[x].width; end; if Listview1.columns.count <= hf then begin cnv.brush.color := farbe[Listview1.columns.count]; cnv.fillrect(rect(y + 1, r.top + 1, r.right, r.bottom - 2)); end; end; procedure TForm1.NProz(var M: TMessage); begin if assigned(AProz) then begin M.Result := CallWindowProc(AProz, Header, M.Msg, M.WParam, M.LParam); if Listview1.ColumnClick then begin if (M.Msg = WM_LBUTTONDOWN) then begin pt := point(M.LParamLo, M.LParamHi); unten := true; end else if (M.Msg = WM_LBUTTONUP) then begin unten := false; zeichnen; end; end; if M.Msg = WM_PAINT then zeichnen; end; end; end. |
Zugriffe seit 6.9.2001 auf Delphi-Ecke