龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用VC++设计一个可编辑的表格控件

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
【实现内容】做一个可编辑的表格控件。 【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。 【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身

【实现内容】做一个可编辑的表格控件。

  【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。

  【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身是不支持直接编辑的。所以需要结合文本控件或者下拉列表控件,使表格控件的运行效果如同可以直接编辑一样。

  【实现步骤】

  1. 当鼠标点击表格控件的某一格时,首先判断该列的属性,是直接编辑呢,还是用下拉列表进行选择。

  2. 显示隐藏的文本控件或者下拉列表控件,显示的位置和大小与选中格的位置大小完全相同,这样可以覆盖选中格

  3. 将选中格的内容填到文本控件或者下拉列表控件中

  4. 修改完毕后,将新的内容填到选中格中,同时隐藏文本控件或者下拉列表控件。

  【主要程序段及说明】

  变量定义:

  CComboBox m_ChangeCombo;--下拉列表控件,初始时不可见

  CEdit m_Change;---------------文本控件,初始时不可见

  CSring m_sChange;----------------与文本控件关联的字符串

  CMSFlexGrid m_FlexGrid;-----表格控件

  程序段:

  表格点击事件:选中某一格后,就要显示相应的文本控件或者列表控件

void CChartInfoEditDlg::OnClickMsflexgrid()
{
 //点击无效区,返回

 long lRow = m_FlexGrid.GetRowSel();//获取点击的行号
 long lCol = m_FlexGrid.GetColSel(); //获取点击的列号
 if(lRow>m_SAttrInfo.attrNum) //如果点击区超过最大行号,则点击是无效的
  return;
 if(lRow == 0) //如果点击标题行,也无效
  return;

 //

 CRect rect;

 m_FlexGrid.GetWindowRect(rect); //获取表格控件的窗口矩形
 ScreenToClient(rect); //转换为客户区矩形
 // MSFlexGrid 控件的函数的长度单位是"缇(twips)",

 //需要将其转化为像素,1440 缇 = 1 英寸

 CDC* pDC =GetDC();

 //计算象素点和缇的转换比例

 int nTwipsPerDotX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX) ;
 int nTwipsPerDotY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY) ;

精彩图集

赞助商链接