Ensure (partial) visibility of a column

The following function ensures that a column is at least partially visible. Rex Myer provided a comparable function in his article "Multiline editable subitems", but his code relies on the list having an item with index 0, it steps through all columns to find the left border and finally, if a column overlaps the right border by just one pixel but still has a 200 pixel distance from the left, the column will be moved to the left border. Additionally, the following code provides the bPartialOK-Flag known from CListCtrl::EnsureVisible(). Usage should be pretty much obvious :)

This code was developed with VC++ 5.0 (SP3), Windows NT 4.0 (SP3) and the new COMCTL32.DLL (v4.72)

bool CMyListCtrl::EnsureColumnVisible(int nColumn, bool bPartialOK)
{
	CHeaderCtrl* pHeader = reinterpret_cast(GetDlgItem(0));
	ASSERT(pHeader->IsKindOf(RUNTIME_CLASS(CHeaderCtrl)));

	CRect rcHeader;
	Header_GetItemRect(pHeader->m_hWnd, nColumn, &rcHeader);

	CRect rcClient;
	GetClientRect(&rcClient);

	int nOffset = GetScrollPos(SB_HORZ);

	if(bPartialOK)
	{
		if((rcHeader.left - nOffset < rcClient.right) && (rcHeader.right - nOffset > 0))
		{
			return true;
		}
	}

	int nScrollX = 0;

	if((rcHeader.Width() > rcClient.Width()) || (rcHeader.left - nOffset < 0))
	{
		nScrollX = rcHeader.left - nOffset;
	}
	else if(rcHeader.right - nOffset > rcClient.right)
	{
		nScrollX = rcHeader.right - nOffset - rcClient.right;
	}

	if(nScrollX != 0)
	{
		CSize size(nScrollX, 0);
		Scroll(size);
	}

	return true;
}



Comments

  • Error in compiling.

    Posted by Legacy on 04/23/1999 12:00am

    Originally posted by: Carl Smith

    It looks like on the first line of code:
    
    

    CHeaderCtrl* pHeader = reinterpret_cast(GetDlgItem(0));

    the type-id was left out, reinterpret_cast requires the form:
    reinterpret_cast < type-id > ( expression ).

    The line should read:
    CHeaderCtrl* pHeader = reinterpret_cast<CHeaderCtrl*>(GetDlgItem(0));

    Hope this helps:
    Carl Smith

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: August 13, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT If you are developing applications, you'll want to join us to learn how applications are changing as a result of gesture recognition. This technology will change how you and your users interact - not simply with your devices, but with the world around you. Your devices will be able to see and hear what your users are doing. Are your applications ready for this? Join us to learn about Intel® RealSense™ Technology, including never been …

  • Intelligent N+X Redundancy, Placement Affinities, & Future Proofing in the Virtualized Data Center Virtualization brought about the ability to simplify business continuity management in IT. Workload portability and data replication capabilities mean that physical infrastructure failures no longer need impact application services, and they can rapidly be recovered even in the event of complete site failure. However, Enterprises and Service Providers face new challenges ensuring they have enough compute …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds