让表格可以编辑 以上三点只是准备阶段,要想使表格编辑,我们还要响应用户的点击单元格事件和离开单元格事件,以使得当用户点击某一单元格时当前单元格处于编辑状态而离开时又处于非编辑状态。MSFLEXGRID控件提供的OnClick和OnLeaveCell事件正好是我们所需要的。由于CCtrlEditGrid不是MFC类,所以不能用类向导来添加事件。只好用手工添加了。 首先在头文件中添加afx_msg void OnLeaveCell();afx_msg void OnClick();接着在CPP文件中添加事件映射表 BEGIN_EVENTSINK_MAP(CCtrlEditGrid, CMSFlexGrid) //{{AFX_EVENTSINK_MAP(CEditGrid) ON_EVENT_REFLECT(CCtrlEditGrid, 72 /* LeaveCell */, OnLeaveCell, VTS_NONE) ON_EVENT_REFLECT(CCtrlEditGrid, -600 /* Click */, OnClick, VTS_NONE) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() (如果用户觉得手工添加时间映射表有困难,可以先在应用程序中添加一个虚设对话框。接着在对话框中插入MSFlexGrid控件。然后使用ClassWizard将事件处理程序写入对话框,接下来就可以参照着对话框编写事件映射表了。记得最后要删除虚设对话框。) 接着添加OnLeaveCell和OnClick的函数体。 OnLeaveCell函数:如果现在m_pEdit是显示的,则说明单元格是在编辑状态,所以要将数据从m_pEdit框读到表格中,然后将m_pEdit和m_pSpinButtonCtrl隐藏。 void CCtrlEditGrid::OnLeaveCell() { if ( m_pEdit->IsWindowVisible() ) { int nCol; int nRow; CString strContent; nCol = GetCol(); nRow = GetRow(); m_pEdit->GetWindowText(strContent); SetTextMatrix(nRow, nCol, strContent); m_pEdit->ShowWindow(SW_HIDE); m_pSpinButtonCtrl->ShowWindow(SW_HIDE); } } OnClick函数:要在点击的单元格中显示m_pEdit和m_pSpinButtonCtrl,,并使输入焦点在m_pEdit中,这里要说明的一点是在计算编辑控件要显示的位置时,如果FlexGrid控件有边框,就应该考虑边框宽度对位置的影响,在本例中我们在InitGrid中设置为无边框,故不用考虑。 void CCtrlEditGrid::OnClick() { CDC* pDC = GetDC(); long x = ( GetCellLeft() * pDC -> GetDeviceCaps ( LOGPIXELSX ) ) / 1440; long y = ( GetCellTop() * pDC -> GetDeviceCaps ( LOGPIXELSY ) ) / 1440; long cx = ( GetCellWidth() * pDC -> GetDeviceCaps ( LOGPIXELSX ) ) / 1440; long cy = ( GetCellHeight() * pDC -> GetDeviceCaps ( LOGPIXELSY ) )/ 1440; ReleaseDC ( pDC ); CString strContent; strContent = GetText(); m_pEdit->SetWindowText(strContent); m_pEdit->MoveWindow(x,y,cx,cy,FALSE); m_pEdit->ShowWindow(SW_SHOW); m_pEdit->SetFocus ( ); m_pSpinButtonCtrl->SetBuddy (m_pEdit); m_pSpinButtonCtrl->SetRange32( 0, 100); m_pSpinButtonCtrl->MoveWindow ( x + cx – 16, y, 16,cy,FALSE ); m_pSpinButtonCtrl->ShowWindow(SW_SHOW); }
系统自带的函数前面要加上控件变量。