| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> vc控件 >> 文章正文
做一个可编辑的表格控件        【字体:
做一个可编辑的表格控件
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

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

【使用控件】一个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) ;

    //计算选中格的左上角的坐标(象素为单位)

    long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;

    long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX;

  //计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好

    long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;

    long height = m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1;

  //形成选中个所在的矩形区域

    CRect rc(x,y,x+width,y+height);

  //转换成相对对话框的坐标

    rc.OffsetRect(rect.left+1,rect.top+1);

    //清空下拉列表的内容

    m_ChangeCombo.ResetContent( );

  //以下省略哪一列用文本控件,哪一列用下拉列表控件的判断。如果是用下拉列表控件,则会先向下拉列表控件中增加数据,否则为空

……………………………….

……………………………….

    //获取选中格的文本信息

    CString strValue = m_FlexGrid.GetTextMatrix(lRow,lCol);

    int num = m_ChangeCombo.GetCount();

  //如果下拉列表控件中有数据,则表示使用下拉列表控件来进行数据选择

    if(num!=0)

    {

       m_ChangeCombo.ShowWindow(SW_SHOW);//显示控件

       m_ChangeCombo.MoveWindow(rc);    //移动到选中格的位置,覆盖

       m_ChangeCombo.SelectString(-1,strValue);  //内容全选。方便直接修改

       m_ChangeCombo.SetFocus();       //获取焦点

[1] [2] [3] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • VC控件 TreeCtrl 与 ListCtr…

  • CListCtrl 使用演示的例子

  • VC通用控件编程之CList控件

  • VC++在应用程序中使用标准窗…

  • 用ATL和MFC来创建ActiveX控件

  • 动态控件的生成与响应

  • 可设置颜色的静态控件、单选…

  • 支持数据项查找功能的树控制…

  • VC通用控件编程之CImageList…

  • VC++之List Box/Check List …

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |