<p>実際に Delphi で使用した例は以下のようになります。</p>
<p>以下コードは、ストリンググリッドのセルの描画の際に動作し、 4番目の列の場合のみボタンを描画します。</p>
<pre class="brush:delphi" title="ボタン表示サンプル">procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow &gt;= TStringGrid(Sender).FixedRows) and (ACol = 1) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONPUSH);
end;
</pre>
<p>同様にチェックボックスを表示する場合。</p>
<pre class="brush:delphi" title="チェックボックス表示サンプル">procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow &gt;= TStringGrid(Sender).FixedRows) and (ACol = 2) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONCHECK);
end;
</pre>
<p>チェックボックスも、ボタンのひとつの状態なんですね。後はクリックされてるときのみ、へこんだ状態にするなどの操作が必要です。へこんだ状態には DFCS_PUSHED、チェックされた状態には DFCS_CHECKED さらに 使用不可を表現するためには DFCS_INACTIVE を使用します。 第4引数に指定しますが、ビット演算のために or を使って複数の定数を組み合わせて指定します。</p>
<pre class="brush:delphi" title="チェックボックス表示サンプル(チェック済)">procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow &gt;= TStringGrid(Sender).FixedRows) 
and (ACol = 3) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_PUSHED);
end;
</pre>