网易博客旧文----关于BCGGrid自动分组的研究

关于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

相关文章

奇迹手游版本最变态的是哪个 奇迹手游变态版推荐

【拖鞋优惠】哪里买拖鞋便宜,性价比高的拖鞋推荐

学唱歌软件app哪个好?可以教唱歌的手机软件