关于BCGGrid自动分组的研究

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值