記事カテゴリ

ユーザー機能


 2024年4月26日(金) 01:17 JST

[Delphi] ボタン・チェックボックスの描画

  • 投稿者:
  • 表示回数
    19,118

リストやグリッドにボタンチェックボックスを 表示したいと考えたことはないですか?
私はグリッドにボタンとチェックボックスの両方を付け加えました。ダウンロードしていただいた方々の中から数人の方が描画方法について質問されましたので、ここで解説したいと思います。 ボタンチェックボックスを描画するには、DrawFrameControl API を使用します。この API は、Delphi Professional 以上をお持ちの方でしたら、TBitBlt、TDBGrid や TCheckListBox などで使用されています。 DrawFrameControl API は SDK で以下のように定義されています。詳細はこちら

BOOL DrawFrameControl(
 HDC hdc,     // デバイスコンテキストのハンドル
 LPRECT lprc, // 境界の長方形
 UINT uType, // フレームコントロールのタイプ
 UINT uState // フレームコントロールのスタイル
);

パラメータ説明:

hdc
コントロールの描画に使いたいデバイスコンテキストのハンドルを指定します。
lprc
長方形の論理座標を保持する 1 個の RECT 構造体へのポインタを指定します。
uType
フレームコントロールのタイプを指定します。ボタン、メニューやスクロールバーなどを指定します。
uState
フレームコントロールの初期状態を指定します。

uTypeでボタンを指定した場合は、チェックボックスの状態を指定します。

実際に Delphi で使用した例は以下のようになります。

以下コードは、ストリンググリッドのセルの描画の際に動作し、 4番目の列の場合のみボタンを描画します。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow >= TStringGrid(Sender).FixedRows) and (ACol = 1) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONPUSH);
end;

同様にチェックボックスを表示する場合。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow >= TStringGrid(Sender).FixedRows) and (ACol = 2) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONCHECK);
end;

チェックボックスも、ボタンのひとつの状態なんですね。後はクリックされてるときのみ、へこんだ状態にするなどの操作が必要です。へこんだ状態には DFCS_PUSHED、チェックされた状態には DFCS_CHECKED さらに 使用不可を表現するためには DFCS_INACTIVE を使用します。 第4引数に指定しますが、ビット演算のために or を使って複数の定数を組み合わせて指定します。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow >= TStringGrid(Sender).FixedRows) 
and (ACol = 3) then
    DrawFrameControl(TStringGrid(Sender).Canvas.Handle,
      Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_PUSHED);
end;

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/ProgramingFAQ_del0041

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。