工程搭建好后,可以开始找方法了。
1、首先,建立一个按钮,每按一次,就可更新非当前格子的内容,这个很容易实现:
void CGridControlTest02Dlg::OnBnClickedFillbox()
{
// TODO: Add your control notification handler code here
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = 56;
Item.col = 2;
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.strText.Format(_T("55"),2);
m_pGrid.SetItem(&Item);
m_pGrid.Refresh();
//CCellID cell(56,2);
//m_pGrid.SetFocusCell(cell);//设置焦点的方法
}
2、接着,就一直找方法,直到我看到GridCtrl.h里的protect中这个函数(BOOL SetScrollPos32(int nBar, int nPos, BOOL bRedraw = TRUE);),然后看使用它的前后代码,发现可以调用它。
但很可惜的是,它是protect,我把它改为public也是一样不能通过编译。
后来,请教同事,发现,在改为public并且用实例化的方式使用它,则编译通过了。如下:
int scrollPos = m_pGrid.GetScrollPos32(SB_VERT);
3、然后,我就可以尝试使用我的方法试试了:先获取当前的pos位置,然后算出offset,让当前+offset,则可跳转到有内容更新的位置了:
int scrollPos = m_pGrid.GetScrollPos32(SB_VERT);
CCellID idTopLeft = m_pGrid.GetTopleftNonFixedCell();
int yScroll = m_pGrid.GetRowHeight(idTopLeft.row)*(Item.row-1);
m_pGrid.SetScrollPos32(SB_VERT, scrollPos + yScroll);
4、编译后通过,并且此法可行。接下来要把此方法修复一下,因为现在有bug。