☆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.
| 固定リンク
