Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / MFC

Fast Ensure Visible for CGridCtrl

5.00/5 (2 votes)
5 Mar 2012CPOL 14.5K  
This tip shows a very fast algorithm (with some constraints enforced for it to work) to EnsureVisible a row in CGridCtrl by Chris Maunder

Introduction



In one of my projects, I had to load around 200000 rows in the CGridCtrl and then had to provide the functionalitiy of EnsureVisible to scroll to and highlight a row. So I had to come up with a reasonably fast algorithm. 



The code



C++
// This function will only work if all the grid control rows are same in size

void GVEnsureVisible(CGridCtrl* pGridCtrl, int nRow)
{
	if(pGridCtrl== NULL)
		return;

	pGridCtrl->ResetScrollBars();

	int nItems = pGridCtrl->GetItemCount();

	int nPos = nRow;

	if(nItems > 0)
	{
		SCROLLINFO si;

		pGridCtrl->GetScrollInfo(SB_VERT, &si);

		double dx = (double)si.nMax / (double)nItems;

		si.cbSize = sizeof(SCROLLINFO);

		si.fMask = SIF_POS;

		si.nPos = (int)(dx * nPos) - si.nPage/2;

		pGridCtrl->SetScrollInfo(SB_VERT, &si, TRUE); 
		
	}

}




Points of Interest



This code will only work if all the rows of the Grid are of same size.



History



Article Uploaded : 5th March, 2012.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)