VCL 標準 TCheckBox 選中時顯示打勾符號 (✓),但某些業務場景需要顯示為叉號 (×)。本文提供一個完整的繼承自 TCustomControl 的 TXCheckBox 類實現碼,由 cker 編寫,支援自訂勾選顏色、三態 (未選、選中、灰態) 及完整的滑鼠/鍵盤交互。
class TXCheckBox : public TCustomControl
{
private:
bool FDown;
TCheckBoxState FState;
bool FFocused;
TColor FCheckColor;
public:
__fastcall TXCheckBox(TComponent* AOwner);
protected:
void __fastcall Paint();
DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y);
DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y);
DYNAMIC void __fastcall KeyDown(Word &Key, TShiftState Shift);
DYNAMIC void __fastcall KeyUp(Word &Key, TShiftState Shift);
// ... 屬性存取方法 ...
__published:
__property TCaption Caption = {read=GetCaption, write=SetCaption};
__property TColor CheckColor = {read=FCheckColor, write=SetCheckColor, default=clBlack};
__property bool Checked = {read=GetChecked, write=SetChecked, default=false};
__property bool Down = {read=FDown, write=SetDown, default=false};
// ... 其他標準屬性 ...
};
State (cbChecked, cbGrayed) 繪製紅色叉號 (兩條對角線) 或灰態填充。MouseDown/Up/Move:處理按下、釋放、拖動時的視覺反饋與 Checked 狀態切換。KeyDown/Up:支援空白鍵切換選中狀態。DoEnter/DoExit:管理焦點狀態以繪製焦點框。__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
TXCheckBox* x = new TXCheckBox(this);
x->Parent = this;
x->Caption = "中文測試english";
x->CheckColor = clRed;
x->Left = 100;
x->Top = 100;
}
編譯運行後,即可看到一個選中顯示紅色叉號的自訂 CheckBox。