A VisualStudio-like ListBox class

Sample Image

Environment: VC6 SP1, NT4 SP5, WIN 95/98

This article presents an extended listbox control. Its look and feel resembles the one that you can find in the Tools->Options dialog of Visual Studio environment.
As you can see from the picture, this new listbox allows in-place item editing, and adds also the possibility to show a "browse" button near the edit field.
Moreover, since it is derived from a drag listbox, it is also possible to reorder items through drag and drop, or through Alt+Up/Alt+Down keys.

I also wrote a simple "buddy" class, that you can see in the upper part of the picture, that makes the control even easier to use.

How To Use It

To use this listbox class, simply drop a normal listbox on a dialog and associate it with a CListBoxEx class:

// This class overrides the OnBrowseButton method.
class CMyListBoxEx: public CListBoxEx
{
public:

 virtual void OnBrowseButton( int iItem )
 {
  iItem;
  CSHBrowseDlg dlgBrowse;
  if ( dlgBrowse.DoModal() ) SetEditText( dlgBrowse.GetFullPath() );
 };
};

class CListBoxExDemoDlg : public CDialog
{
// Construction
public:
 // standard constructor
 CListBoxExDemoDlg(CWnd* pParent = NULL);	

// Dialog Data
 //{{AFX_DATA(CListBoxExDemoDlg)
 enum { IDD = IDD_LISTBOXEXDEMO_DIALOG };
 CMyListBoxEx	m_ListBoxEx;
 //}}AFX_DATA
};
It's as easy as that! The OnBrowseButton() is called synchronously when the user clicks on the "..." button. Other events that are called are OnBeginEditing() and OnEndEditing().

If you want to use also the buddy class, drop a button on the dialog, change its properties and make it owner-draw and with a client edge.
Then, in your dialog OnInitDialog() subclass the button control in this way:
// Add the listbox buddy
m_ListBoxExBuddy.SubclassDlgItem( IDC_LISTBUDDY, this );
m_ListBoxExBuddy.SetListbox( &m_ListBoxEx );


Other improvements

I added a lot of (I think) useful methods, that add quite a bit of functionality to the raw listbox and make it a bit more user-friendly:

// Editing & drag are anabled by default
void AllowEditing( BOOL bAllowEditing = TRUE )
{
m_bAllowEditing = bAllowEditing;
};

void AllowDrag( BOOL bAllowDrag = TRUE )
{
m_bAllowDrag = bAllowDrag;
};

// Editing methods
void BeginEditing( int iItem );
void EndEditing( BOOL fCancel );

// Add a new empty string and begin editing
void EditNew();

void SetEditStyle( DWORD dwEditStyle );

HWND GetEditHandle() const;

void SetEditText( const CString & strNewText ) const;

// Item methods
int MoveItemUp( int iItem );
int MoveItemDown( int iItem );
void SwapItems( int iFirstItem, int iSecondItem );

void SetItem( int iItem, LPCTSTR szItemText, DWORD dwItemData );
void SetItemText( int iItem, LPCTSTR szItemText );

// Virtual (overridables) events
virtual BOOL OnBeginEditing( int iItem );
virtual BOOL OnEndEditing( int iItem, BOOL fCanceled );

virtual void OnBrowseButton( int iItem );

Downloads

Download demo project - 50 Kb
Download source - 17 Kb


Comments

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

Top White Papers and Webcasts

  • You may already know about some of the benefits of Bluemix, IBM's open platform for developing and deploying mobile and web applications. Check out this webcast that focuses on building an Android application using the MobileData service, with a walk-through of the real process and workflow used to build and link the MobileData service within your application. Join IBM's subject matter experts as they show you the way to build a base application that will jumpstart you into building your own more complex app …

  • On-demand Event Event Date: September 17, 2014 Another day, another end-of-support deadline. You've heard enough about the hazards of not migrating to Windows Server 2008 or 2012. What you may not know is that there's plenty in it for you and your business, like increased automation and performance, time-saving technical features, and a lower total cost of ownership. Check out this webcast and join Rich Holmes, Pomeroy's practice director of virtualization, as he discusses the future state of your servers, …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds