VC MSFlexGrid基本使用

原文出处:http://blog.sina.com.cn/s/blog_66d64ec90100ltcv.html

1. 给FlexGrid控件绑定成员变量:m_FlexGrid。

2. 设置行列数
              m_FlexGrid.SetCols(4);                  //设置列数
              m_FlexGrid.SetRows(6);                 //设置行数

3. 设置固定行数和固定列数
              m_FlexGrid.SetFixedRows(1);         //设置固定行数为1行
              m_FlexGrid.SetFixedCols(0);          //设置固定列数为0列

4. 设置列宽、行高
             m_FlexGrid.SetColWidth(1,1500);        //设置列号为1的列宽为1500
             m_FlexGrid.SetRowHeight(2,300);       //设置行号为2的行高为300

5. 设置文本对齐方式
             m_FlexGrid.SetColAlignment(1,4);        //设置列号为1的文本对齐方式

    参数对应描述为:
             0   单元内容顶部左对齐。
             1   单元内容中间左对齐。对字符串的缺省设置值。
             2   单元内容底部左对齐。
             3   单元内容顶部居中。
             4   单元内容中间居中。
             5   单元内容底部居中。
             6   单元内容顶部右对齐。
             7   单元内容中间右对齐。对数字的缺省设置值。
             8   单元内容底部右对齐。
              9   单元内容一般对齐方式。对字符串中间左对齐而对数值中间右对齐。

6. 设置表头和单元格内容
     m_FlexGrid.SetTextArray(0,"Head1");                 //设置表头(第1列)内容为“Head1”
     m_FlexGrid.SetTextMatrix(1,1,"Text");                //设置单元格(行号1列号1)内容为“Text”

7. 增加一行
        m_FlexGrid.AddItem("AddString",(COleVariant)(3L));           //在行号为3的位置增加一行

8. 合并单元格
             for(i=0;i<4;i++)
                     m_FlexGrid.SetTextMatrix(5,i,"合计");        //将行号为5、列号从0到4的单元格内容设为相同“合计”
             m_FlexGrid.SetMergeCells(2);                           //设置单元格合并方式(下述)
             m_FlexGrid.SetMergeRow(5,TRUE);                 //设置要合并的行

      SetMergeCells函数的参数值如下:
             0: flexMergeNever                              默认的选项,就是不合并
             1: flexMergeFree                                不规则的合并
             2: flexMergeRestrictRows                   行合并
             3: flexMergeRestrictColumns              列合并
             4: flexMergeRestrictBoth                     行,列都合并

     注意只有单元格内容相同时才能进行合并操作。

9. 制作可编辑的FlexGrid控件

    放置一个Edit控件,绑定成员变量为m_Edit,并设置初始状态为不可见。

    响应FlexGrid控件的Click事件:

              void CBlackBKDlg::OnClickMsflexgrid()
              {
                     long lCol=m_FlexGrid.GetColSel();         //获取点击的行号
                     long lRow=m_FlexGrid.GetRowSel();      //获取点击的列号
                     if(lRow>m_FlexGrid.GetRows() || lRow==0)              //判断点击是否有效
                               return;

                      CRect rect;
                     m_FlexGrid.GetWindowRect(&rect);                 //获取FlexGrid控件的窗口矩形
                     ScreenToClient(&rect);                                    //转换为客户区矩形
                      CDC* pDC=GetDC();
                      //MSFlexGrid 控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440 缇 = 1 英寸
                      //计算象素点和缇的转换比例
                       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);

                      CString strValue=m_FlexGrid.GetTextMatrix(lRow,lCol);       //获取单元格内容

                      m_Edit.ShowWindow(SW_SHOW);                  //显示控件
                      m_Edit.MoveWindow(rc);                            //改变大小并移到选中格位置
                       m_Edit.SetWindowText(strValue);                   //显示文本
                       m_Edit.SetFocus();                                            //获取焦点
             }

      编辑完成释放焦点之后,将数据写回单元格。响应Edit控件的EN_KILLFOCUS事件:

             void CBlackBKDlg::OnKillfocusEditChange()
            {
                     CString strInput;
                    GetDlgItemText(IDC_EDIT_CHANGE,strInput);      //获取输入框内容
                     m_FlexGrid.SetText(strInput);                                //设置单元格内容
                    m_Edit.ShowWindow(SW_HIDE);                           //隐藏输入框
             }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值