본문 바로가기

프로그램 경험/C/C++

[C++ Builder] StringGrid에 체크박스 넣기

//StringGrid 셀단위 커스텀 그리기
//체크박스를 그려주기 위한 이벤트이다.
void __fastcall TInputDiagForm::StringGridDrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
   //0번째 줄은 헤더다. 그려줄 필요 없음
   if (ARow == 0)
      return;

   //컬럼이 0, 1이 아니면 체크박스 그려줄 필요 없음
   if (!(ACol == 0 || ACol == 1))
      return;

   TStringGrid* grid = dynamic_cast<TStringGrid*> (Sender);
   TRect aRect  = Rect;
   TRect tRect;

   //체크박스의 체크여부 데이터를 가지고 있는 컬럼 인덱스
   int referCol = 5;

   unsigned int BoxState;
   BoxState = DFCS_BUTTONCHECK;

   if (ACol == 1)  //1번일때는 6번이 가지고 있다.
      referCol = 6;

   if (StringGrid->Cells[referCol][ARow] == "Y")
      BoxState |= DFCS_CHECKED;

      tRect.left  = aRect.left + (aRect.right - aRect.left - GetSystemMetrics(SM_CXMENUCHECK)) / 2;
      tRect.top = aRect.top  + (aRect.bottom - aRect.top - GetSystemMetrics(SM_CYMENUCHECK)) / 2;
      tRect.right  = tRect.left + GetSystemMetrics(SM_CXMENUCHECK);
      tRect.bottom = tRect.top  + GetSystemMetrics(SM_CYMENUCHECK);

      DrawFrameControl(grid->Canvas->Handle, &tRect, DFC_BUTTON, BoxState);
}


//휠 이동시 체크박스 체크되는 버그 막기
void __fastcall TInputDiagForm::StringGridMouseWheelDown(TObject *Sender,
      TShiftState Shift, TPoint &MousePos, bool &Handled)
{
   Handled = true;
   StringGrid->Perform(WM_VSCROLL, SB_LINEDOWN, 0);
}
//---------------------------------------------------------------------------

void __fastcall TInputDiagForm::StringGridMouseWheelUp(TObject *Sender,
      TShiftState Shift, TPoint &MousePos, bool &Handled)
{
   Handled = true;
   StringGrid->Perform(WM_VSCROLL, SB_LINEUP, 0);
}