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);?????????????????????????? //隐藏输入框 ???????????? }