/***************************************************************************** Called during all the mouse events associated with clicking a control embedded within a cell. Override to have more elaborate handling like implementing radio button logic. *****************************************************************************/ BOOL CGridBtnCellBase::ClickedCellCtl( UINT uMsg, // Command that invoked. e.g. WM_LBUTTONDOWN int aiWhich) // zero-based index of image to draw // returns: T=redraw occurred / F=no redraw { if( aiWhich < 0 || aiWhich >= GetDrawCtlNbrMax() ) { ASSERT( FALSE); return FALSE; } UINT uiState = GetDrawCtlState( aiWhich); if( uiState & DFCS_INACTIVE) return FALSE; // button is inactive -- don't do anything m_sLastCtlClicked = (short)aiWhich; UINT iType = GetDrawCtlType( aiWhich); switch( uMsg) { case WM_LBUTTONDOWN: // appears pushed in uiState |= DFCS_PUSHED; SetDrawCtlState( aiWhich, uiState); break; case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: // appears pushed out uiState &= (~DFCS_PUSHED); // auto check / uncheck controls, too if( iType == DFC_BUTTON ) { BOOL bIsMbrRadioGrp = GetDrawCtlIsMbrRadioGrp( aiWhich); if( uiState & DFCS_BUTTONRADIO || bIsMbrRadioGrp ) { // radio buttons or any button flagged as being part // of a radio group will be made to look pressed down // while pushing-up / unchecking all other members // of the radio group const int iCtlNbr = GetDrawCtlNbr(); UINT uiStateRadio; for( int i1=0; i1 < iCtlNbr; i1++) { if( i1 != aiWhich) { uiStateRadio = GetDrawCtlState( i1); bIsMbrRadioGrp = GetDrawCtlIsMbrRadioGrp( i1); if( uiStateRadio & DFCS_BUTTONRADIO || bIsMbrRadioGrp ) { uiStateRadio &= (~( DFCS_PUSHED | DFCS_CHECKED) ); // push out and uncheck SetDrawCtlState( i1, uiStateRadio); } } } uiState |= DFCS_CHECKED; // check if( !(uiState & DFCS_BUTTONRADIO) ) uiState |= DFCS_PUSHED; // press in if not real radio button } else if( !( uiState & ALL_BUT_BTN_CHK) ) { // not a pushbutton -- it's a check box // (can't check for DFCS_BUTTONCHECK directly since it is bit 0) if( uiState & DFCS_CHECKED) uiState &= (~DFCS_CHECKED); // uncheck else uiState |= DFCS_CHECKED; // check } } SetDrawCtlState( aiWhich, uiState); break; default: ASSERT( FALSE); // gotta handle new message return FALSE; } CGridCtrl* pGrid = GetGrid(); ASSERT( pGrid); pGrid->RedrawCell( m_iRow, m_iCol); return TRUE; }