☆ListViewのヘッダーの色を変える。
ヘッダー(ViewStyleがvsReportのカラム部分)の色を変えたいと思い、
いろいろ探してみましたが、サンプルを見つけることができませんでした。
仕方がないので、いろいろと試行錯誤した結果、ほぼ期待通りの動作になったので、
書いておきますね。
※ListViewとして実際に使っていないので、いろいろと問題があるかも知れません。又、カラムをクリックした時、文字の再描画ができていないので、文字が沈まないという雑な作りです(^^;
※ListViewとして実際に使っていないので、いろいろと問題があるかも知れません。又、カラムをクリックした時、文字の再描画ができていないので、文字が沈まないという雑な作りです(^^;
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); private Header_Handle: HWND; procedure DrawColumns; public end; function NewHeaderWndProc(hWnd: HWND; Msg: UINT; WParam: wPARAM; lParam: LPARAM): LRESULT; stdcall; var Form1: TForm1; FOldHeaderWndProc: TFNWndProc; implementation {$R *.dfm} uses ComObj, CommCtrl, GraphUtil; function NewHeaderWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; begin Result := CallWindowProc(FOldHeaderWndProc, hWnd, Msg, wParam, lParam); case Msg of WM_PAINT: Form1.DrawColumns; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Header_Handle := ListView_GetHeader(ListView1.Handle); FOldHeaderWndProc := TFNWndProc(SetWindowLong(Header_Handle, GWL_WNDPROC, Longint(@NewHeaderWndProc))); end; procedure TForm1.DrawColumns; var Header_Rect, Column_Rect, OutofColumns_Rect: TRect; I, X, W1, W2, CW: Integer; Canvas: TCanvas; Column: TListColumn; dwFormat: DWORD; begin if Header_Handle = 0 then Exit; // Header領域を取得します。 Windows.GetClientRect(Header_Handle, Header_Rect); // 境界の幅を取得します。 W1 := GetSystemMetrics(SM_CXBORDER); W2 := GetSystemMetrics(SM_CXFIXEDFRAME) - W1; Canvas := TCanvas.Create; try Canvas.Handle := GetDC(Header_Handle); // カラムの描画 X := 0; for I := 0 to ListView1.Columns.Count - 1 do begin Column := ListView1.Columns[I]; CW := ListView1.Columns[I].Width; // 背景の描画 Column_Rect := Rect(X+W1, W1, X+CW-W2, Header_Rect.Bottom-W2); GradientFillCanvas(Canvas, clWhite, $00CAC4C6, Column_Rect, gdVertical); SetBkMode(Canvas.Handle, TRANSPARENT); // 文字の描画 Canvas.Font.Color := clBlack; dwFormat := DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS; case Column.Alignment of taRightJustify: dwFormat := dwFormat or DT_RIGHT; taCenter : dwFormat := dwFormat or DT_CENTER; else dwFormat := dwFormat or DT_LEFT; end; InflateRect(Column_Rect, -4, 0); DrawText(Canvas.Handle, PChar(Column.Caption), -1, Column_Rect, dwFormat); X := X + CW; end; // Columnより右の部分の描画 OutofColumns_Rect := Rect(X+W1, W1, Header_Rect.Right, Header_Rect.Bottom-W2); GradientFillCanvas(Canvas, clWhite, $00CAC4C6, OutofColumns_Rect, gdVertical); finally Canvas.Free; end; end; end.
| 固定リンク