www.pudn.com > vistaListCtrlDemo.zip > MainDlg.h
// MainDlg.h : interface of the CMainDlg class // ///////////////////////////////////////////////////////////////////////////// #pragma once #include#include #include #include "ListCtrl.h" class CUserProfile { public: CUserProfile() { m_bAdministrator = FALSE; m_strUserName = _T( "" ); m_strDepartment = _T( "" ); m_strPhoneNumber = _T( "" ); } CUserProfile( BOOL bAdministrator, LPCTSTR lpszUserName, LPCTSTR lpszDepartment, LPCTSTR lpszPhoneNumber ) { m_bAdministrator = bAdministrator; m_strUserName = lpszUserName; m_strDepartment = lpszDepartment; m_strPhoneNumber = lpszPhoneNumber; } BOOL m_bAdministrator; CString m_strUserName; CString m_strDepartment; CString m_strPhoneNumber; }; class CListUserData : public CListImpl< CListUserData > { public: DECLARE_WND_CLASS( _T( "UserList" ) ) protected: CImageList m_ilItemImages; CListArray < CUserProfile > m_aUsers; enum UserColumns { colName, colDept, colPhone }; public: BOOL Initialise() { if ( !m_ilItemImages.CreateFromImage( IDB_EXAMPLE, 16, 0, RGB( 255, 0, 255 ), IMAGE_BITMAP, LR_CREATEDIBSECTION ) ) return FALSE; SetImageList( m_ilItemImages ); AddColumn( _T( "User Name" ), 150 ); AddColumn( _T( "Department" ), 100 ); AddColumn( _T( "Phone Number" ), 100 ); return CListImpl< CListUserData >::Initialise(); } int AddUser( CUserProfile userProfile ) { m_aUsers.Add( userProfile ); return CListImpl< CListUserData >::AddItem() ? GetItemCount() - 1 : -1; } int AddUser( BOOL bAdministrator, LPCTSTR lpszUserName, LPCTSTR lpszDepartment, LPCTSTR lpszPhoneNumber ) { return AddUser( CUserProfile( bAdministrator, lpszUserName, lpszDepartment, lpszPhoneNumber ) ); } int GetItemCount() // required by CListImpl { return m_aUsers.GetSize(); } BOOL GetUser( int nItem, CUserProfile& userProfile ) { if ( nItem < 0 || nItem >= GetItemCount() ) return FALSE; userProfile = m_aUsers[ nItem ]; return TRUE; } CString GetItemText( int nItem, int nSubItem ) // required by CListImpl { CUserProfile userProfile; if ( !GetUser( nItem, userProfile ) ) return _T( "" ); switch ( (UserColumns)nSubItem ) { case colName: return userProfile.m_strUserName; case colDept: return userProfile.m_strDepartment; case colPhone: return userProfile.m_strPhoneNumber; } return _T( "" ); } int GetItemImage( int nItem, int nSubItem ) // overrides CListImpl::GetItemImage { if ( (UserColumns)nSubItem != colName ) return -1; CUserProfile userProfile; if ( !GetUser( nItem, userProfile ) ) return -1; return userProfile.m_bAdministrator ? 6 : 0; } void ReverseItems() // overrides CListImpl::ReverseItems { m_aUsers.Reverse(); } class CompareItem { public: CompareItem( UserColumns colColumn ) : m_colColumn( colColumn ) {} inline bool operator() ( const CUserProfile& userProfile1, const CUserProfile& userProfile2 ) { switch ( m_colColumn ) { case colName: return ( userProfile1.m_strUserName.Compare( userProfile2.m_strUserName ) < 0 ); case colDept: return ( userProfile1.m_strDepartment.Compare( userProfile2.m_strDepartment ) < 0 ); case colPhone: return ( userProfile1.m_strPhoneNumber.Compare( userProfile2.m_strPhoneNumber ) < 0 ); } return false; } protected: UserColumns m_colColumn; }; void SortItems( int nColumn, BOOL bAscending ) // overrides CListImpl::SortItems { m_aUsers.Sort( CompareItem( (UserColumns)nColumn ) ); } }; class CMainDlg : public CDialogImpl { public: CMainDlg() { m_wndListCtrl.RegisterClass(); m_wndUserData.RegisterClass(); m_wndUserList.RegisterClass(); m_bShowMessage = TRUE; m_bShowThemed = TRUE; } enum { IDD = IDD_MAINDLG }; BEGIN_MSG_MAP(CMainDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) COMMAND_ID_HANDLER(IDOK, OnOK) COMMAND_ID_HANDLER(IDCANCEL, OnCancel) COMMAND_ID_HANDLER(IDC_THEME, OnTheme) NOTIFY_HANDLER_EX(IDC_USERDATA, LCN_SELECTED, OnUserDataSelected) NOTIFY_HANDLER_EX(IDC_USERLIST, LCN_SELECTED, OnUserListSelected) NOTIFY_HANDLER_EX(IDC_LISTCTRL, LCN_HYPERLINK, OnListHyperLink) REFLECT_NOTIFICATIONS() END_MSG_MAP() protected: CListCtrl m_wndListCtrl; CListCtrlData< CUserProfile > m_wndUserData; CListUserData m_wndUserList; CImageList m_ilItemImages; CFont m_fntCustomFont1; CFont m_fntCustomFont2; BOOL m_bShowMessage; BOOL m_bShowThemed; LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { // center the dialog on the screen CenterWindow(); // set icons HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); SetIcon(hIcon, TRUE); HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); SetIcon(hIconSmall, FALSE); m_wndListCtrl.SubclassWindow( GetDlgItem( IDC_LISTCTRL ) ); m_wndUserData.SubclassWindow( GetDlgItem( IDC_USERDATA ) ); m_wndUserList.SubclassWindow( GetDlgItem( IDC_USERLIST ) ); if ( !m_ilItemImages.CreateFromImage( IDB_EXAMPLE, 16, 0, RGB( 255, 0, 255 ), IMAGE_BITMAP, LR_CREATEDIBSECTION ) ) return FALSE; InitBasicList(); InitDataList(); InitUserList(); return TRUE; } void InitBasicList() { LOGFONT logFont = { 0 }; logFont.lfCharSet = DEFAULT_CHARSET; logFont.lfHeight = 90; lstrcpy( logFont.lfFaceName, _T( "New Times Roman" ) ); logFont.lfWeight = FW_BOLD; logFont.lfItalic = (BYTE)TRUE; m_fntCustomFont1.CreatePointFontIndirect( &logFont ); logFont.lfHeight = 100; lstrcpy( logFont.lfFaceName, _T( "Arial" ) ); logFont.lfUnderline = (BYTE)TRUE; m_fntCustomFont2.CreatePointFontIndirect( &logFont ); m_wndListCtrl.SetImageList( m_ilItemImages ); m_wndListCtrl.SetFocusSubItem( TRUE ); m_wndListCtrl.AddColumn( _T( "Column 1" ), 150 ); m_wndListCtrl.AddColumn( _T( "" ), 0, ITEM_IMAGE_3STATE, TRUE, ITEM_FORMAT_CHECKBOX_3STATE ); m_wndListCtrl.AddColumn( _T( "Column 2" ), 130 ); m_wndListCtrl.AddColumn( _T( "Column 3" ), 80, -1, FALSE, ITEM_FORMAT_NONE, ITEM_FLAGS_RIGHT ); m_wndListCtrl.AddColumn( _T( "Column 4" ), 120 ); m_wndListCtrl.AddColumn( _T( "Column 5" ), 170, ITEM_IMAGE_ATTACHMENT, FALSE, ITEM_FORMAT_PROGRESS ); srand( 12345 ); for ( int nItem = 1; nItem <= 1000; nItem++ ) { #ifdef _UNICODE wostringstream osItemText; #else ostringstream osItemText; #endif osItemText << _T( "Item " ) << nItem; int nNewItem = m_wndListCtrl.AddItem( osItemText.str().c_str(), rand() % 6 ); m_wndListCtrl.SetItemCheck( nNewItem, 1, ( rand() % 3 ) - 1 ); osItemText.str( _T( "" ) ); TCHAR nSortChar = _T( 'A' ) + ( rand() % 26 ); osItemText << nSortChar << _T( " Random Text" ); m_wndListCtrl.SetItemText( nNewItem, 2, osItemText.str().c_str() ); m_wndListCtrl.SetItemImage( nNewItem, 2, rand() % 6 ); osItemText.str( _T( "" ) ); osItemText << nItem; m_wndListCtrl.SetItemText( nNewItem, 3, osItemText.str().c_str() ); osItemText.str( _T( "" ) ); osItemText << ( rand() % 101 ); m_wndListCtrl.SetItemText( nNewItem, 5, osItemText.str().c_str() ); } CListArray < CString > aComboList; aComboList.Add( _T( "Item 1" ) ); aComboList.Add( _T( "Item 2" ) ); aComboList.Add( _T( "Item 3" ) ); aComboList.Add( _T( "Item 4" ) ); aComboList.Add( _T( "Item 5" ) ); m_wndListCtrl.SetItemText( 0, 4, _T( "Combo (Edit):" ) ); m_wndListCtrl.SetItemFormat( 0, 5, ITEM_FORMAT_COMBO, ITEM_FLAGS_COMBO_EDIT, aComboList ); m_wndListCtrl.SetItemComboIndex( 0, 5, 0 ); // "Item 1" m_wndListCtrl.SetItemText( 1, 4, _T( "Combo (List):" ) ); m_wndListCtrl.SetItemFormat( 1, 5, ITEM_FORMAT_COMBO, ITEM_FLAGS_NONE, aComboList ); m_wndListCtrl.SetItemText( 1, 5, _T( "Item 1" ) ); m_wndListCtrl.SetItemText( 2, 4, _T( "Edit:" ) ); m_wndListCtrl.SetItemFormat( 2, 5, ITEM_FORMAT_EDIT ); m_wndListCtrl.SetItemText( 2, 5, _T( " " ) ); m_wndListCtrl.SetItemText( 3, 4, _T( "Edit (Numeric):" ) ); m_wndListCtrl.SetItemFormat( 3, 5, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_NUMBER ); m_wndListCtrl.SetItemText( 3, 5, _T( "123" ) ); CTime tmDateTime = CTime::GetCurrentTime(); SYSTEMTIME stDateTime; tmDateTime.GetAsSystemTime( stDateTime ); m_wndListCtrl.SetItemText( 4, 4, _T( "Date (inc Time):" ) ); m_wndListCtrl.SetItemFormat( 4, 5, ITEM_FORMAT_DATETIME, ITEM_FLAGS_DATETIME_NONE ); m_wndListCtrl.SetItemDate( 4, 5, stDateTime ); m_wndListCtrl.SetItemText( 5, 4, _T( "Date (Date only):" ) ); m_wndListCtrl.SetItemFormat( 5, 5, ITEM_FORMAT_DATETIME, ITEM_FLAGS_DATE_ONLY ); m_wndListCtrl.SetItemDate( 5, 5, stDateTime ); m_wndListCtrl.SetItemText( 6, 4, _T( "Solid progress:" ) ); m_wndListCtrl.SetItemFormat( 6, 5, ITEM_FORMAT_PROGRESS, ITEM_FLAGS_PROGRESS_SOLID ); m_wndListCtrl.SetItemText( 7, 4, _T( "Normal progress:" ) ); m_wndListCtrl.SetItemText( 8, 4, _T( "Checkbox:" ) ); m_wndListCtrl.SetItemFormat( 8, 5, ITEM_FORMAT_CHECKBOX ); m_wndListCtrl.SetItemText( 9, 4, _T( "Checkbox (3 State):" ) ); m_wndListCtrl.SetItemFormat( 9, 5, ITEM_FORMAT_CHECKBOX_3STATE ); m_wndListCtrl.SetItemText( 10, 4, _T( "Checkbox (read-only):" ) ); m_wndListCtrl.SetItemFormat( 10, 5, ITEM_FORMAT_CHECKBOX, ITEM_FLAGS_READ_ONLY ); m_wndListCtrl.SetItemText( 11, 4, _T( "Hyperlink" ) ); m_wndListCtrl.SetItemFormat( 11, 4, ITEM_FORMAT_HYPERLINK ); m_wndListCtrl.SetItemText( 12, 4, _T( "Some very long text that should trigger titletip" ) ); m_wndListCtrl.SetItemText( 13, 4, _T( "Built-in tooltip support" ) ); m_wndListCtrl.SetItemToolTip( 13, _T( "This is a\nmultiline tooltip" ) ); m_wndListCtrl.SetItemText( 14, 4, _T( "Font Support" ) ); m_wndListCtrl.SetItemFont( 14, 4, m_fntCustomFont1 ); m_wndListCtrl.SetItemText( 15, 4, _T( "Font Support" ) ); m_wndListCtrl.SetItemFont( 15, 4, m_fntCustomFont2 ); m_wndListCtrl.SetItemText( 16, 4, _T( "Colour Support" ) ); m_wndListCtrl.SetItemColours( 16, 4, RGB( 128, 128, 64 ), RGB( 0, 255, 0 ) ); m_wndListCtrl.SetItemText( 17, 4, _T( "Colour Support" ) ); m_wndListCtrl.SetItemColours( 17, 4, RGB( 128, 0, 128 ), RGB( 255, 255, 128 ) ); } void InitDataList() { CUserProfile userProfile1( FALSE, _T( "Fred" ), _T( "Accounts" ), _T( "1234" ) ); CUserProfile userProfile2( TRUE, _T( "Simon" ), _T( "Accounts" ), _T( "1235" ) ); CUserProfile userProfile3( FALSE, _T( "Kate" ), _T( "Development" ), _T( "2341" ) ); CUserProfile userProfile4( FALSE, _T( "David" ), _T( "Development" ), _T( "2342" ) ); CUserProfile userProfile5( TRUE, _T( "Jake" ), _T( "Development" ), _T( "2343" ) ); CUserProfile userProfile6( FALSE, _T( "Mike" ), _T( "Marketing" ), _T( "5343" ) ); CUserProfile userProfile7( FALSE, _T( "Tony" ), _T( "Marketing" ), _T( "5344" ) ); m_wndUserData.SetImageList( m_ilItemImages ); m_wndUserData.AddColumn( _T( "User Name" ), 150 ); m_wndUserData.AddColumn( _T( "Department" ), 100 ); m_wndUserData.AddColumn( _T( "Phone Number" ), 100 ); int nUser = m_wndUserData.AddItem( userProfile1.m_strUserName, userProfile1.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile1.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile1.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile1 ); nUser = m_wndUserData.AddItem( userProfile2.m_strUserName, userProfile2.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile2.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile2.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile2 ); nUser = m_wndUserData.AddItem( userProfile3.m_strUserName, userProfile3.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile3.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile3.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile3 ); nUser = m_wndUserData.AddItem( userProfile4.m_strUserName, userProfile4.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile4.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile4.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile4 ); nUser = m_wndUserData.AddItem( userProfile5.m_strUserName, userProfile5.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile5.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile5.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile5 ); nUser = m_wndUserData.AddItem( userProfile6.m_strUserName, userProfile6.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile6.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile6.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile6 ); nUser = m_wndUserData.AddItem( userProfile7.m_strUserName, userProfile7.m_bAdministrator ? 6 : 0 ); m_wndUserData.SetItemText( nUser, 1, userProfile7.m_strDepartment ); m_wndUserData.SetItemText( nUser, 2, userProfile7.m_strPhoneNumber ); m_wndUserData.SetItemData( nUser, userProfile7 ); } void InitUserList() { CUserProfile userProfile1( FALSE, _T( "Fred" ), _T( "Accounts" ), _T( "1234" ) ); CUserProfile userProfile2( TRUE, _T( "Simon" ), _T( "Accounts" ), _T( "1235" ) ); CUserProfile userProfile3( FALSE, _T( "Kate" ), _T( "Development" ), _T( "2341" ) ); CUserProfile userProfile4( FALSE, _T( "David" ), _T( "Development" ), _T( "2342" ) ); CUserProfile userProfile5( TRUE, _T( "Jake" ), _T( "Development" ), _T( "2343" ) ); CUserProfile userProfile6( FALSE, _T( "Mike" ), _T( "Marketing" ), _T( "5343" ) ); CUserProfile userProfile7( FALSE, _T( "Tony" ), _T( "Marketing" ), _T( "5344" ) ); m_wndUserList.AddUser( userProfile1 ); m_wndUserList.AddUser( userProfile2 ); m_wndUserList.AddUser( userProfile3 ); m_wndUserList.AddUser( userProfile4 ); m_wndUserList.AddUser( userProfile5 ); m_wndUserList.AddUser( userProfile6 ); m_wndUserList.AddUser( userProfile7 ); } LRESULT OnUserDataSelected( LPNMHDR lpNMHDR ) { CListNotify *pListNotify = reinterpret_cast ( lpNMHDR ); CUserProfile userProfile; m_wndUserData.GetItemData( pListNotify->m_nItem, userProfile ); #ifdef _UNICODE wostringstream osItemText; #else ostringstream osItemText; #endif osItemText << _T( "User Selected: " ) << userProfile.m_strUserName << _T( "\r\n" ); osItemText << _T( "Press Cancel to stop notifications" ); if ( m_bShowMessage ) { if ( MessageBox( osItemText.str().c_str(), _T( "Selected" ), MB_OKCANCEL ) != IDOK ) m_bShowMessage = FALSE; } return 0; } LRESULT OnListHyperLink( LPNMHDR lpNMHDR ) { CListNotify *pListNotify = reinterpret_cast ( lpNMHDR ); MessageBox( _T( "Hyperlink clicked" ), _T( "Hyperlink" ) ); return 0; } LRESULT OnUserListSelected( LPNMHDR lpNMHDR ) { CListNotify *pListNotify = reinterpret_cast ( lpNMHDR ); CUserProfile userProfile; m_wndUserList.GetUser( pListNotify->m_nItem, userProfile ); #ifdef _UNICODE wostringstream osItemText; #else ostringstream osItemText; #endif osItemText << _T( "User Selected: " ) << userProfile.m_strUserName << _T( "\r\n" ); osItemText << _T( "Press Cancel to stop notifications" ); if ( m_bShowMessage ) { if ( MessageBox( osItemText.str().c_str(), _T( "Selected" ), MB_OKCANCEL ) != IDOK ) m_bShowMessage = FALSE; } return 0; } LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { CSimpleDialog dlg; dlg.DoModal(); return 0; } LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { // TODO: Add validation code EndDialog(wID); return 0; } LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { EndDialog(wID); return 0; } LRESULT OnTheme(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { m_bShowThemed = !m_bShowThemed; m_wndListCtrl.ShowThemed( m_bShowThemed ); m_wndUserData.ShowThemed( m_bShowThemed ); m_wndUserList.ShowThemed( m_bShowThemed ); return 0; } };