65.9K
CodeProject is changing. Read more.
Home

Fast Ensure Visible for CGridCtrl

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2 votes)

Mar 5, 2012

CPOL
viewsIcon

14474

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

// 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.