msflexgrid 是一个神器

让表格可以编辑 

以上三点只是准备阶段,要想使表格编辑,我们还要响应用户的点击单元格事件和离开单元格事件,以使得当用户点击某一单元格时当前单元格处于编辑状态而离开时又处于非编辑状态。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); 

} 
系统自带的函数前面要加上控件变量。

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值