效果演示
上位机MFC实现多功能网格报表
当前例程实现功能丰富的列表框或网格报表功能,效果如上图。
包括下列特征:
用SHIFT、CONTROL键和鼠标选择单元格。
行和列重新定位。
双击分隔线可以自动改变行和列的大小。
任意数目的行和列。
单个单元可以有分离的文本和背景颜色。
单个单元可以有分别的字体。
单个单元可以标志为Read-Only。
OLE拖放。
Ctrl-C、Ctrl-X和Ctrl-V执行剪接板拷贝、剪切和粘贴,用Ctrl-A执行Select All。
在位编辑单元内容。如果单元具有输入焦点,在字符键被按下时,就可以在该单元中开始编辑;箭头键允许你在单元中的字符之间移动。
支持Microsoft intellimouse。
网格线可选。
单元格中可以有图像。
完全打印支持,不仅适合于文档/视窗模型,而且适合于对话框程序。
可选的列表模式,包括整行选择、点击头进行列排序。
多个虚拟函数允许控件扩展非常容易。
UNICODE支持。
工具提示。
可以下载运行例程,在界面上点击控件来查看效果。
下载地址:
另外如果想要实现表格项有下拉功能,可以下载参考下面例程。
例程是在前面例程源码基础上实现的。
它是将网格的编辑控件替换为下面的组合框控件,参见下图。
为了实现这一点,从CGridCtrl派生出CComboGridCtrl,并重载CGridCtrl::CreateInPlaceEditControl。
上位机MFC实现下拉网格报表
上面例程是基于对话工程使用了。如果想在基于单文档工程中使用,可以参考下面例程。
实现过程:
在视类中声明一个CGridCtrl*变量:
CGridCtrl* m_pGrid;
初始化该变量为NULL:
CMyView::CMyView
{
m_pGrid = NULL;
}
在CView的OnInitialUpdate中创建一个新的CGridCtrl对象:
CMyView::OnInitialUpdate
{
CView::OnInitialUpdate();
if (m_pGrid == NULL) // Have we already done this bit?
{
m_pGridCtrl = new CGridCtrl; // Create the Gridctrl object
if (!m_pGridCtrl) return;
CRect rect; // Create the Gridctrl window
GetClientRect(rect);
m_pGridCtrl->Create(rect, this, 100);
m_pGridCtrl->SetRowCount(50); // fill it up with stuff
m_pGridCtrl->SetColumnCount(10);
// ... etc
}
}
我们希望网格占据整个视的客户区域,这样,需要添加WM_SIZE消息处理函数:
CMyView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (m_pGrid->GetSafeHwnd()) // Have the grid object and window been created yet?
{
CRect rect;
GetClientRect(rect); // Get the size of the view's client area
m_pGrid->MoveWindow(rect); // Resize the grid to take up that space.
}
}
在析构函数中删除该控件:
CMyView::~CMyView
{
if (m_pGrid)
delete m_pGrid;
}
重载OnCmdMsg函数:
BOOL CMyView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (m_pGrid && IsWindow(m_pGrid->m_hWnd))
if (m_pGrid->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
|