DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

StringGrid/DrawGridのOwnerDraw


                _____
      ∧,,∧___   /
    /ミ,,゚Д゚ミ/\<  ちょっと書いてみました。
  /| ̄∪∪ ̄|\/ \_____
    |____|/





-- StringGrid/DrawGridのOwnerDraw --

DrawGridのOwnerDrawを使うとセルを描画出来ますが
その際に、DefaultDrawingを使わないと
普通のコントロールのように見えません。

でも、セルの内容に応じてOwnerDrawする場合には
DefaultDrawingの描画が
都合の悪い場合もあったりしますので

DefaultDrawingをしなくても
DrawGridを綺麗に(DefaultDrawしているように)描画する方法です。

つまり、DefaultDrawの実装を自前でしたわけ。



主にFixexCellの描画などに関してこだわってみました

テストはStringGridで行っています。

-------------------------------
{DefaultDrawingはfalseにして利用してください}
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
PenBuffer: TPen;
BrushBuffer: TBrush;
FontBuffer: TFont;

{FixedCellの枠を描画する}
procedure DrawFixedFrame( ARect: TRect );
begin
if (Sender as TStringGrid).Ctl3D then
with (Sender as TStringGrid) do
begin
Canvas.Pen.Style := psSolid;
Canvas.Pen.Mode := pmCopy;
with ARect do begin
Canvas.Pen.Color := clBtnHighlight;
Canvas.MoveTo( Right - 1, Top );
Canvas.LineTo( Left, Top);
Canvas.LineTo( Left, Bottom - 1 );
Canvas.Pen.Color := clBtnShadow;
Canvas.LineTo( Right - 1, Bottom - 1 );
Canvas.LineTo( Right - 1, Top );
end;
end;
end;


{パラメータを一時保存}
procedure BufferingOn;
begin
with Sender as TStringGrid do
begin
PenBuffer.Assign(Canvas.Pen);
BrushBuffer.Assign(Canvas.Brush);
FontBuffer.Assign(Canvas.Font);
end;
end;

{パラメータを復帰}
procedure BufferingOff;
begin
with Sender as TStringGrid do
begin
Canvas.Pen.Assign(PenBuffer);
Canvas.Brush.Assign(BrushBuffer);
Canvas.Font.Assign(FontBuffer);
end;
end;

begin
PenBuffer := TPen.Create;
BrushBuffer := TBrush.Create;
FontBuffer := TFont.Create;

with Sender as TDrawGrid do
try
{固定セル}
if gdFixed in State then
begin
BufferingOn;

Canvas.Brush.Color := FixedColor;
Canvas.FillRect(Rect);
{セル内を色で塗りつぶす}

BufferingOff;

DrawFixedFrame(Rect);
{枠を描く}
end else

{セレクトセル}
if gdSelected in State then
begin
BufferingOn;

if (goDrawFocusSelected in Options) then
begin
Canvas.Brush.Color := clHighlight;
Canvas.FillRect(Rect);
end else
if ((Focused) and (ACol = Col) and (ARow = Row)) then
begin
Canvas.Brush.Color := clWindow;
Canvas.FillRect(Rect);
end else
begin
Canvas.Brush.Color := clHighlight;
Canvas.FillRect(Rect);
end;
{セル内を選択色で塗りつぶす}

BufferingOff;

Canvas.DrawFocusRect(Rect);
{枠を描く}
end else

{普通のセル}
begin
BufferingOn;

Canvas.Brush.Color := clWindow;
Canvas.FillRect(Rect);

BufferingOff;
end;

finally
PenBuffer.Free;
BrushBuffer.Free;
FontBuffer.Free;
end;
end;
-------------------------------


…RowSelectとかした場合も大丈夫のようです。

後はこれを元に改造して好きなセルだけ色を変えたりしましょう。
例えばStringGridを使って
セルの内部に文字列を描画するような処理は

Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
Cells[ACol, ARow]);

このような処理を
BufferingOff;
の前に書いてやると、綺麗な描画が行われます。
(※ただ、元々のgoDrawFocusSelected や goRowSelect 等にバグがあるので
 完璧にDefaultDrawした状態と同じ描画というのは処理不可能でした。)

上記のソースを利用すると
固定セルではないのにまるで固定セルだと見せかける事が可能です。
…セル間のGridLineの色が灰色のままだけどね。

DrawFixedFrameの部分は
TStrColGridというコンポーネントのソースを参考にしました。

スポンサーサイト

| 未分類 | 09:25 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/38-adc09997

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。