TStringGridのセルにチェックボックスを描画する

C++Builder XEでTStringGridのセルにいろんな状態のチェックボックスを描画してみました。

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
  TThemeServices* pTheme = ThemeServices(); // テーマサービスの取得
  if (pTheme->ThemesEnabled) {
    // テーマが有効
    TThemedButton themedButton;
    switch (ARow % 8) {
    case 0:
      themedButton = tbCheckBoxCheckedNormal;
      break;
    case 1:
      themedButton = tbCheckBoxCheckedHot;
      break;
    case 2:
      themedButton = tbCheckBoxCheckedPressed;
      break;
    case 3:
      themedButton = tbCheckBoxCheckedDisabled;
      break;
    case 4:
      themedButton = tbCheckBoxMixedNormal;
      break;
    case 5:
      themedButton = tbCheckBoxMixedHot;
      break;
    case 6:
      themedButton = tbCheckBoxMixedPressed;
      break;
    case 7:
      themedButton = tbCheckBoxMixedDisabled;
      break;
    }
    TThemedElementDetails Details = pTheme->GetElementDetails(themedButton);
    pTheme->DrawElement(StringGrid1->Canvas->Handle, Details, Rect, NULL);
  }
  else {
    // テーマが無効
    UINT uState;
    switch (ARow % 9) {
    case 0:
      uState = DFCS_BUTTONCHECK;
      break;
    case 1:
      uState = DFCS_BUTTONCHECK | DFCS_CHECKED;
      break;
    case 2:
      uState = DFCS_BUTTONCHECK | DFCS_FLAT;
      break;
    case 3:
      uState = DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_FLAT;
      break;
    case 4:
      uState = DFCS_BUTTON3STATE;
      break;
    case 5:
      uState = DFCS_BUTTONCHECK | DFCS_INACTIVE;
      break;
    case 6:
      uState = DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE | DFCS_FLAT;
      break;
    case 7:
      uState = DFCS_BUTTON3STATE | DFCS_CHECKED;
      break;
    case 8:
      uState = DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_INACTIVE | DFCS_FLAT;
      break;
    }
    DrawFrameControl(StringGrid1->Canvas->Handle, &Rect, DFC_BUTTON, uState);
  }
}

実行結果

  • Windows XPでテーマが有効

  • Windows 7でテーマが有効

  • Windows XPでテーマが無効

  • Windows 7でテーマが無効

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください