リストやグリッドにボタンやチェックボックスを 表示したいと考えたことはないですか?
私はグリッドにボタンとチェックボックスの両方を付け加えました。ダウンロードしていただいた方々の中から数人の方が描画方法について質問されましたので、ここで解説したいと思います。 ボタンやチェックボックスを描画するには、DrawFrameControl API を使用します。この API は、Delphi Professional 以上をお持ちの方でしたら、TBitBlt、TDBGrid や TCheckListBox などで使用されています。 DrawFrameControl API は SDK で以下のように定義されています。詳細はこちら。
BOOL DrawFrameControl( HDC hdc, // デバイスコンテキストのハンドル LPRECT lprc, // 境界の長方形 UINT uType, // フレームコントロールのタイプ UINT 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;
コメント (0件)