转自:http://wxzsg007.blog.163.com/blog/static/78818911201073011113296/
一、 概述
在我们制作的用户界面中很多时候会用到表格,当然我们首先想到的是用控件,如MSFlexGrid。我们可以方便的调用控件自身的函数来对表格中的元素进行操作,但是如果要设计一个可以编辑的表格,我们该怎么办呢?事实上这种可编辑表格的应用还真的不少,主要是其用户操作的交互性较好。笔者在前一阶段开发项目时遇到了这个问题,以下介绍笔者的实现方案。
二、 可编辑表格的初步实现
1、 创建新类CCtrlEditGrid
首先创建一个单文档工程EditGrid。
接着在工程中加入MSFlexGrid控件。这是个ActiveX控件,选择AddToProject的Components and Controls Gallery选项可加入该控件。
然后以MSFlexGrid为基类创建新类CCtrlEditGrid,并添加成员函数void InitGrid()(该函数目前只是空的)和成员变量 CEdit* m_pEdit;
软件开发网 www.mscto.com
CSpinButtonCtrl* m_pSpinButtonCtrl;以后表格的实体类就是该类。
2、 在工程文件的视图类中显示表格
软件开发网 www.mscto.com
首先在视图类CEditGridView中添加成员变量CCtrlEditGrid* m_pCtrlEditGrid。
接着添加CEditGridView的消息相应函数OnCreate,在其中创建表格
m_pCtrlEditGrid = new CCtrlEditGrid;
m_pCtrlEditGrid->Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_EDITGRID);
m_pCtrlEditGrid->InitGrid ( );
然后为了和视图的大小保持一致在CEditGridView的消息相应函数OnSize中添加代码
if ( m_pCtrlEditGrid != NULL )
m_pCtrlEditGrid->MoveWindow(0,0,cx,cy);
3、 实现CCtrlEditGrid的InitGrid的函数
InitGrid完成表格的属性设置,表格初始内容的填写,可编辑控件的创建。这里的可编辑控件如CEdit,CComboBox,CSpinButtonCtrl,CDateTimeCtrl……。在本例中只使用CEdit和CSinButtonCtrl的结合这一种。如果表格中不同列之间的编辑控件不同,在程序中可以通过检测列号,来决定使用什么控件,事实上在笔者的项目中不同列之间也是使用不同编辑控件的。在此用一种控件来说明表格编辑的实现方法,读者想换其他的控件也很容易了。
void CCtrlEditGrid::InitGrid()
{ 软件开发网 www.mscto.com
//设置行数,列数
SetCols( COL_INITNUMBER );
SetRows( ROW_INITNUMBER );
软件开发网 www.mscto.com
//设置为无边框
SetBorderStyle(0);
//设置为可以改变行高列宽
SetAllowUserResizing(3);
//设置行宽列宽
CDC* pDC = GetDC();
SetRowHeightMin ( ( long )( ROW_HEIGHT_PIXEL * 1440.0 / pDC->GetDeviceCaps(LOGPIXELSY)) );//坐标单位要转换
for ( int i = 0; i < COL_INITNUMBER; i )
SetColWidth ( i,( long ) ( COL_WIDTH_INDEX_PIXEL * 1440.0 / pDC->GetDeviceCaps(LOGPIXELSX) ) );
ReleaseDC(pDC);
<