在VC中MSFlexGrid内嵌EDIT、COMBOBOX的实现方法
### 在VC中MSFlexGrid内嵌EDIT、COMBOBOX的实现方法 #### 一、概述 在Microsoft Visual C++(简称VC)开发环境下,MSFlexGrid控件是一种非常灵活且功能强大的表格显示组件,它允许用户自定义表格的布局、样式以及数据处理逻辑等。在某些应用场景下,开发者可能希望在MSFlexGrid的单元格中内嵌其他控件如EDIT(文本框)、COMBOBOX(组合框),以此来增强表格的功能性和交互性。本文将详细介绍如何在VC中实现MSFlexGrid内嵌EDIT与COMBOBOX,并提供具体的代码示例。 #### 二、基础知识介绍 在深入了解MSFlexGrid内嵌EDIT和COMBOBOX的方法之前,我们先来了解一下相关的基础知识: 1. **MSFlexGrid**:这是一个用于显示表格数据的控件,它可以灵活地调整列宽、行高等属性,并支持各种事件响应。 2. **EDIT**(文本框):一种允许用户输入文本的控件。 3. **COMBOBOX**(组合框):结合了列表框和文本框功能的一种控件,用户可以在其中选择一个选项或者手动输入值。 #### 三、实现步骤 下面将逐步讲解如何实现在MSFlexGrid内嵌EDIT和COMBOBOX的过程。 ##### 步骤一:创建EDIT和COMBOBOX控件 ```cpp // 创建EDIT和COMBOBOX控件 m_edit.Create(WS_CHILD, CRect(0, 0, 0, 0), &m_FlexGrid, IDC_EDIT); m_cmb.Create(WS_CHILD | CBS_DROPDOWNLIST, CRect(0, 0, 0, 0), &m_FlexGrid, IDC_CMB); // 设置字体 m_edit.SetFont(GetFont()); m_cmb.SetFont(GetFont()); ``` 这里使用`Create`函数创建了两个子窗口控件,并设置它们为MSFlexGrid的子控件。此外,还设置了控件的字体以保持一致。 ##### 步骤二:初始化控件 接下来,我们需要遍历MSFlexGrid中的每一行每一列,并为每个单元格添加相应的文本或填充COMBOBOX的数据。 ```cpp // 初始化控件 void CProg5Dlg::InitControls() { long lRow; long lRowCount = m_FlexGrid.GetRows(); long lCol; long lColCount = m_FlexGrid.GetCols(); for (lRow = 1; lRow < lRowCount; lRow++) { m_FlexGrid.SetRow(lRow); for (lCol = 1; lCol < lColCount; lCol++) { m_FlexGrid.SetCol(lCol); CString strText; strText.Format("%ld-%ld", lRow, lCol); // 设置文本 m_FlexGrid.SetText(strText); // 添加到COMBOBOX m_cmb.AddString(strText); } } } ``` 通过循环遍历所有的行和列,并为每个单元格设置文本内容。同时,还将这些文本添加到了COMBOBOX中作为选项。 ##### 步骤三:处理编辑操作 为了更好地管理用户对单元格的编辑操作,还需要编写相应的处理函数。以下是一个处理函数的示例,该函数会在用户编辑单元格时被调用。 ```cpp void CProg5Dlg::GridEdit(WORD nKeyAsciiCode, CWnd* p_wnd) { if (p_wnd == NULL) { // 获取当前选中的单元格控件 p_wnd = GetThisCellMaskControl(); } ASSERT(p_wnd != NULL); // 处理文本框编辑 if (p_wnd->IsKindOf(RUNTIME_CLASS(CEdit))) { ((CEdit*)p_wnd)->SetSel(-1, -1); // 全选文本 } // 更新控件文本 CString sz; if (nKeyAsciiCode >= 0 && nKeyAsciiCode < ' ') { // 输入特殊字符 sz += (char)nKeyAsciiCode; } else { // 输入普通字符 CString Input = ""; p_wnd->GetWindowText(sz); if (nKeyAsciiCode > 0x100) { Input.SetAt(0, nKeyAsciiCode >> 8); Input.SetAt(1, nKeyAsciiCode & 0xff); } else { Input = (char)nKeyAsciiCode; } sz += Input; p_wnd->SetWindowText(sz); } // 调整COMBOBOX大小 if (p_wnd->IsKindOf(RUNTIME_CLASS(CComboBox))) { CDC* pDC = m_FlexGrid.GetDC(); int nLogX = pDC->GetDeviceCaps(LOGPIXELSX); int nLogY = pDC->GetDeviceCaps(LOGPIXELSY); ReleaseDC(pDC); p_wnd->MoveWindow( (m_FlexGrid.GetCellLeft() * nLogX) / 1440 - 3, (m_FlexGrid.GetCellTop() * nLogY) / 1440 - 3, (m_FlexGrid.GetCellWidth() * nLogX) / 1440, (m_FlexGrid.GetCellHeight() * nLogY) / 1440 + 100, FALSE); } } ``` 在这个函数中,首先检查当前操作的控件类型,然后根据不同的情况更新控件的状态或文本。对于COMBOBOX,还会自动调整其位置和大小,以适应MSFlexGrid的单元格。 #### 四、总结 通过以上步骤,我们可以实现在VC中MSFlexGrid内嵌EDIT与COMBOBOX的功能。这种方法不仅可以提高应用程序的灵活性和用户体验,还能扩展MSFlexGrid的基本功能。需要注意的是,在实际应用过程中还需考虑更多细节问题,比如如何优雅地处理用户的输入、如何优化界面布局等。希望本文能为相关开发者提供一定的参考价值。
Key Words: MSFlexGrid 内嵌控件
在CSDN网络中经常会看到有人问起各种GRID控件内嵌EDIT、COMBOBOX的实现方法,本人在前阶段的开发中也遇到这方面的困难,在网络上找了又找,大多是针对ListView和DBGrid的,而对于MSFlexGrid的实现,则少之又少。在广大网友的支持下,终于本人找到了实现MSFlexGrid内嵌EDIT、COMBOBOX的一种方法,我想本文对于采用MSFlexGrid进行应用开发的朋友一定有相当大的帮助。
总结一些网友以及本人在最初实现MSFlexGrid内嵌控件失败的原因,大多是由两方面造成的:
1、坐标系转换问题,MSFlexGrid采用的坐标系和一般的控件不同,所以在操作时,需要进行转换。
2、控件在创建上的问题,如果你把控件直接创建在主窗口中,那么往往会存在,程序运行时,鼠标一点网格,控件就HIDE掉,所以在创建控件EDIT、COMBOBOX时,要以FlexGrid为父窗口。
下面,我用一个示例程序来简单的说明一下,同时我们的示例程序还实现了在FlexGrid中按TAB键跳至下一网格[下面提到的网格均指MSFlexGrid中的小单元格]的功能。想要源代码的请登陆http://www.maoyeah.com,“技术文章”专栏找。
首先,在对话框的初始化中调用我们的初始化函数:
void CProg5Dlg::InitControls()
{
//创建各个内嵌控件
m_edit.Create(WS_CHILD,CRect(0,0,0,0),&m_FlexGrid,IDC_EDIT);
m_cmb.Create(WS_CHILD|CBS_DROPDOWNLIST,CRect(0,0,0,0),&m_FlexGrid,IDC_CMB);
//设置为和主窗口相同字体
m_edit.SetFont(GetFont());
m_cmb.SetFont(GetFont());
//用数据填充Grid 和 ComboBox
long lRow ;
long lRowCount = m_FlexGrid.GetRows();
long lCol ;
long lColCount = m_FlexGrid.GetCols();
{
m_FlexGrid.SetRow(lRow);
for(lCol = 1; lCol < lColCount; lCol++)
{
m_FlexGrid.SetCol(lCol);
CString strText;
strText.Format("%ld-%ld",lRow,lCol);
//用数据填充Grid
m_FlexGrid.SetText(strText);
//用数据填充ComboBox
m_cmb.AddString(strText);
}
}
}
其中m_edit、m_cmb是我们声明的类数据成员:
private:
CEdit m_edit;
CComboBox m_cmb;
它们的创建一定要用.Create的方法并以MSFlexGrid为父窗口,要不然,程序运行时,你一点MsflexGrid,你的Edit或ComboBox就不见了 [这是因为,MSFlexGrid和你的Edit或ComboBox同以Dialog为父窗口,你点了MsflexGrid,在Z坐标上,它就盖住了你的内嵌控件] ,因为在创建之后,它们采用的字体可能和你的主窗口风格不一致,所以还要设置一下字体。
接下来就是程序中最重要的一个函数了:
void CProg5Dlg::GridEdit(WORD nKeyAsciiCode, CWnd *p_wnd)
{
if(p_wnd == NULL)
{//得到当前编辑的网格的内嵌控件是m_edit or m_cmb
p_wnd = GetThisCellMaskControl();
剩余10页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助