« ■Delphi2007 Update2ができない。 | トップページ | ☆タブのOwnerDraw »

☆ListViewのヘッダーの色を変える。

ヘッダー(ViewStyleがvsReportのカラム部分)の色を変えたいと思い、 いろいろ探してみましたが、サンプルを見つけることができませんでした。 仕方がないので、いろいろと試行錯誤した結果、ほぼ期待通りの動作になったので、 書いておきますね。

※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.

|

« ■Delphi2007 Update2ができない。 | トップページ | ☆タブのOwnerDraw »