引用actvie x :microsoft CMsflexgrid;
BOOL CCalibrationCoordsDisDlg::OnInitDialog() { CDialog::OnInitDialog(); m_FlexGrid.put_Rows(1000); //设置列数 m_FlexGrid.put_Cols(10); //设置行数 m_FlexGrid.put_FixedRows(1); //设置固定行数为1行 m_FlexGrid.put_FixedCols(0); //设置固定列数为0列 m_FlexGrid.put_ColWidth(1, 1500); //设置列号为1的列宽为1500 m_FlexGrid.put_RowHeight(2, 600); //设置行号为2的行高为300 m_FlexGrid.put_ColAlignment(1, 4); //设置列号为1的文本对齐方式 m_FlexGrid.put_TextArray(0, "Head1"); //设置表头(第1列)内容为“Head1” m_FlexGrid.put_TextArray(1, "Head2"); m_FlexGrid.put_TextMatrix(1, 1, "Text"); //设置单元格(行号1列号1)内容为“Text” m_FlexGrid.AddItem("AddString", (COleVariant)(3L)); //在行号为3的位置增加一行 for (int i = 0; i<4; i++) m_FlexGrid.put_TextMatrix(0, i, "合并行"); //将行号为0、列号从0到4的单元格内容设为相同“合计” m_FlexGrid.put_MergeCells(2); //设置单元格合并方式(下述) m_FlexGrid.put_MergeRow(0, TRUE); //设置要合并的行 for (int i = 4; i<7; i++) m_FlexGrid.put_TextMatrix(i,2, "合并列"); //将列号为2、列号从4到7的单元格内容设为相同“合计” m_FlexGrid.put_MergeCells(3); //设置单元格合并方式(下述) m_FlexGrid.put_MergeCol(2, TRUE); m_FlexGrid.put_GridColor(0xffffff); for (int row = 0; row < 10; row++) { m_FlexGrid.put_FixedRows(row); //设置固定行数为1行 for (int i = 0; i < 10; i++) { m_FlexGrid.put_FixedCols(i); //设置固定列数为0列 if (row % 2) { m_FlexGrid.put_CellBackColor(0XDFBFA2); m_FlexGrid.put_CellForeColor(0xff); } else { m_FlexGrid.put_CellBackColor(0XDFBF52); m_FlexGrid.put_CellForeColor(0x0000ff); } } } m_FlexGrid.put_FixedRows(1); //设置固定行数为1行 m_FlexGrid.put_FixedCols(0); //设置固定列数为0列 m_FlexGrid.put_BackColorFixed(0XDFBFA2); //设置固定行列颜色 m_FlexGrid.put_ForeColorFixed(0x00ffff); }
void CCalibrationCoordsDisDlg::ClickMsflexgrid1() { long lCol = m_FlexGrid.get_ColSel(); //获取点击的行号 long lRow = m_FlexGrid.get_RowSel(); //获取点击的列号 if (lRow>m_FlexGrid.get_Rows() || lRow == 0) //判断点击是否有效 return; CRect rect; m_FlexGrid.GetWindowRect(&rect); //获取FlexGrid控件的窗口矩形 ScreenToClient(&rect); //转换为客户区矩形 CDC* pDC = GetDC(); int nTwipsPerDotX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX); int nTwipsPerDotY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY); /*long y = m_FlexGrid.get_RowPos(lRow) / nTwipsPerDotY; long x = m_FlexGrid.get_ColPos(lCol) / nTwipsPerDotX;*/ long x = 0, y = 0; for (int col = 0; col < lCol; col++) { x += m_FlexGrid.get_ColWidth(col)/ nTwipsPerDotX; } y = m_FlexGrid.get_RowPos(lRow) / nTwipsPerDotY; //计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好 long width = m_FlexGrid.get_ColWidth(lCol) / nTwipsPerDotX + 1; long height = m_FlexGrid.get_CellHeight() / nTwipsPerDotY + 2; //形成选中个所在的矩形区域 CRect rc(x, y, x + width, y + height); //转换成相对对话框的坐标 rc.OffsetRect(rect.left + 1, rect.top + 1); CString strValue = m_FlexGrid.get_TextMatrix(lRow, lCol); //获取单元格内容 m_Edit.ShowWindow(SW_SHOW); //显示控件 m_Edit.MoveWindow(rc); //改变大小并移到选中格位置 m_Edit.SetWindowText(strValue); //显示文本 m_Edit.SetSel(0, strValue.GetLength()); m_Edit.SetFocus(); } void CCalibrationCoordsDisDlg::OnEnKillfocusEdit1() { CString strInput; GetDlgItemText(IDC_EDIT1, strInput); //获取输入框内容 m_FlexGrid.put_Text(strInput); //设置单元格内容 m_Edit.ShowWindow(SW_HIDE); }