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);
}
}
実行結果