关于BCGGrid自动分组的研究
2013-04-08 10:40:15| 分类: MFC | 标签: |举报 |字号大中小 订阅
BCGsoft公司的界面软件虽然已经集成到VS2008sp1,VS2010中,但其中的GRID功能并没有集成进去,这个格子有比较强大的功能,本文对自动分组进行一些研究。
主要使用的两个类CBCGPGridCtrl和CBCGPGridView,如果需要在VIEW中使用格子,直接使用CBCGPGridView即可,这个视图已经包含了CBCGPGridCtrl的一个实例,用GetGridCtrl获取后进行操作即可。在对话框中用CBCGPGridCtrl进行操作。
若需要对格子的行进行自动分组,出现如下效果:
关于BCGGrid自动分组的研究 - xzhoumin - MMZHOU的博客
首先需要CBCGPGridView和CBCGPGridCtrl继承两个新类,取名为 CMyGridView 和CMyGridCtrl
在 CMyGridView 的OnCreate方法中,不再执行CBCGPGridView的OnCreate方法,而是执行CView的OnCreate方法,并且创建 CMyGridCtrl 的一个实例,作为 CMyGridView 的成员变量,
int CMyGridView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectClient;
GetClientRect (rectClient);
m_pMyGridCtrl =NULL;
m_pMyGridCtrl = new CMyGridCtrl;
if (m_pMyGridCtrl == NULL)
{
ASSERT (FALSE);
return -1;
}
ASSERT_VALID (m_pMyGridCtrl);
if (!m_pMyGridCtrl->Create (WS_CHILD, rectClient, this, 1))
{
ASSERT (FALSE);
return -1;
}
m_pMyGridCtrl->ShowWindow(SW_SHOW);
return 0;
}
在view销毁时销毁grid
void CMyGridView::OnDestroy()
{
if (m_pMyGridCtrl->GetSafeHwnd () != NULL)
{
m_pMyGridCtrl->DestroyWindow ();
delete m_pMyGridCtrl;
}
m_pMyGridCtrl = NULL;
CBCGPGridView::OnDestroy();
}
对于尺寸变化时对格子进行调整
void CMyGridView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
AdjustLayout ();
}
void CMyGridView::AdjustLayout ()
{
if (m_pMyGridCtrl->GetSafeHwnd () == NULL)
{
return;
}
CRect rectClient;
GetClientRect (rectClient);
m_pMyGridCtrl->SetWindowPos (NULL, 0, 0, rectClient.Width (), rectClient.Height (),
SWP_NOACTIVATE | SWP_NOZORDER);
}
当view获取焦点时将焦点交给grid
void CMyGridView::OnSetFocus(CWnd* pOldWnd)
{
CBCGPGridView::OnSetFocus(pOldWnd);
if (m_pMyGridCtrl->GetSafeHwnd () != NULL)
{
m_pMyGridCtrl->SetFocus ();
}
}
在grid继承类中做如下修改:
创建时对格子做各种初始化
int CMyGridCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGPGridCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
/EnableMarkSortedColumn (TRUE, FALSE);
EnableHeader (TRUE, BCGP_GRID_HEADER_MOVE_ITEMS | BCGP_GRID_HEADER_SORT);
EnableRowHeader (TRUE);
EnableLineNumbers ();
EnableInvertSelOnCtrl ();/
InsertGroupColumn (0, 0);
// SetReadOnly ();
return 0;
}
以上调用InsertGroupColumn 开启分组功能
实现两个虚方法,一个是比较行大小,如果返回0表示这两行分在一组
一个是获取分组后的组的名称
int CMyGridCtrl::CompareGroup (const CBCGPGridRow* pRow1, const CBCGPGridRow* pRow2, int iColumn)
{
ASSERT_VALID (this);
ASSERT_VALID (pRow1);
ASSERT_VALID (pRow2);
long lVal1 = (long) pRow1->GetItem (0)->GetValue ();
long lVal2 = (long) pRow2->GetItem (0)->GetValue ();
return lVal1 / 10 * 10 - lVal2 / 10 * 10;
}
CString CMyGridCtrl::GetGroupName (int /iColumn/, CBCGPGridItem* pItem)
{
ASSERT_VALID (this);
ASSERT_VALID (pItem);
long lVal = (long) pItem->GetValue ();
long lMin = lVal / 10 * 10;
long lMax = lMin + 9;
CString str;
str.Format (_T("Range: [%d - %d]"), lMin, lMax);
return str;
}
这两个方法,在 CBCGPGridCtrl会进行调用。
经过测试,对于行比较多时,若比较方法不好,效率比较低。
以上参考bcg的例子BCGPGridExample而研究而成,BCG的版本为16.1,使用VS2010