Introduction
When you create a CListCtrl
with the "NO SCROLL" option it completely stop scrolling. If the data is out of the screen you do not see anything. So you always had to use the scrollbars - until now!
Background
I used this on many kiosk software solutions, and it gives you complete control of the CListCtrl.
Using the Code
The CListCtrlHiddenSB
is derived from CListCtrl
.
It has one function to hide the scrollbars: HideScrollBars(int Type, int Which)
The type variable has two const: LCSB_CLIENTDATA
and LCSB_NCOVERRIDE
The Which
variable tells which scrollbar that will be hidden, here we use the default: SB_BOTH
, SB_HORZ
and SB_VERT
.
Clientdatatype
of hiding scrollbars must be called BEFORE any data is entered, because this will change the clientrect of the ctrl to be smaller.
In the demo project I override the normal constructor, like this:
class CCListCtrlExampleDlg : public CDialog
{
public:
CCListCtrlExampleDlg(CWnd* pParent = NULL);
CListCtrlHiddenSB m_list4;
CListCtrlHiddenSB m_list3;
CListCtrlHiddenSB m_list2;
CListCtrlHiddenSB m_list1;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
Just before the listctrl's are filled with data we hide the scrollbars:
m_list1.HideScrollBars(LCSB_CLIENTDATA, SB_VERT);
m_list2.HideScrollBars(LCSB_CLIENTDATA);
m_list3.HideScrollBars(LCSB_NCOVERRIDE);
m_list4.HideScrollBars(LCSB_NCOVERRIDE);
Known Issues
If you have an listctrl that will just get a horiz-scrollbar, and you choose to hide both of the scrollbars. The function will also remove the vert-scrollbar, but since it is not there some of the gfx will be cut off.
In other words, the clientarena should only be used when you KNOW how many of the scrollbars that will be shown.
Personally I prefer using the NcCalcSize
. It removes the scrollbars pretty smooth. It's not dependent on whether or not the listctrl shows all scrollbars or not.
History
First release - Version 1.0. It will be updated when more solutions are found...