MainDlg.h
上传用户:sztopon
上传日期:2014-01-21
资源大小:55k
文件大小:17k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // MainDlg.h : interface of the CMainDlg class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #pragma once
  5. #include <sstream>
  6. #include <iomanip>
  7. #include <atltime.h>
  8. #include "ListCtrl.h"
  9. class CUserProfile
  10. {
  11. public:
  12. CUserProfile()
  13. {
  14. m_bAdministrator = FALSE;
  15. m_strUserName = _T( "" );
  16. m_strDepartment = _T( "" );
  17. m_strPhoneNumber = _T( "" );
  18. }
  19. CUserProfile( BOOL bAdministrator, LPCTSTR lpszUserName, LPCTSTR lpszDepartment, LPCTSTR lpszPhoneNumber )
  20. {
  21. m_bAdministrator = bAdministrator;
  22. m_strUserName = lpszUserName;
  23. m_strDepartment = lpszDepartment;
  24. m_strPhoneNumber = lpszPhoneNumber;
  25. }
  26. BOOL m_bAdministrator;
  27. CString m_strUserName;
  28. CString m_strDepartment;
  29. CString m_strPhoneNumber;
  30. };
  31. class CListUserData : public CListImpl< CListUserData >
  32. {
  33. public:
  34. DECLARE_WND_CLASS( _T( "UserList" ) )
  35. protected:
  36. CImageList m_ilItemImages;
  37. CListArray < CUserProfile > m_aUsers;
  38. enum UserColumns { colName, colDept, colPhone };
  39. public:
  40. BOOL Initialise()
  41. {
  42. if ( !m_ilItemImages.CreateFromImage( IDB_EXAMPLE, 16, 0, RGB( 255, 0, 255 ), IMAGE_BITMAP, LR_CREATEDIBSECTION ) )
  43. return FALSE;
  44. SetImageList( m_ilItemImages );
  45. AddColumn( _T( "User Name" ), 150 );
  46. AddColumn( _T( "Department" ), 100 );
  47. AddColumn( _T( "Phone Number" ), 100 );
  48. return CListImpl< CListUserData >::Initialise();
  49. }
  50. int AddUser( CUserProfile userProfile )
  51. {
  52. m_aUsers.Add( userProfile );
  53. return CListImpl< CListUserData >::AddItem() ? GetItemCount() - 1 : -1;
  54. }
  55. int AddUser( BOOL bAdministrator, LPCTSTR lpszUserName, LPCTSTR lpszDepartment, LPCTSTR lpszPhoneNumber )
  56. {
  57. return AddUser( CUserProfile( bAdministrator, lpszUserName, lpszDepartment, lpszPhoneNumber ) );
  58. }
  59. int GetItemCount() // required by CListImpl
  60. {
  61. return m_aUsers.GetSize();
  62. }
  63. BOOL GetUser( int nItem, CUserProfile& userProfile )
  64. {
  65. if ( nItem < 0 || nItem >= GetItemCount() ) 
  66. return FALSE;
  67. userProfile = m_aUsers[ nItem ];
  68. return TRUE;
  69. }
  70. CString GetItemText( int nItem, int nSubItem ) // required by CListImpl
  71. {
  72. CUserProfile userProfile;
  73. if ( !GetUser( nItem, userProfile ) )
  74. return _T( "" );
  75. switch ( (UserColumns)nSubItem )
  76. {
  77. case colName: return userProfile.m_strUserName;
  78. case colDept: return userProfile.m_strDepartment;
  79. case colPhone: return userProfile.m_strPhoneNumber;
  80. }
  81. return _T( "" );
  82. }
  83. int GetItemImage( int nItem, int nSubItem ) // overrides CListImpl::GetItemImage
  84. {
  85. if ( (UserColumns)nSubItem != colName )
  86. return -1;
  87. CUserProfile userProfile;
  88. if ( !GetUser( nItem, userProfile ) )
  89. return -1;
  90. return userProfile.m_bAdministrator ? 6 : 0;
  91. }
  92. void ReverseItems() // overrides CListImpl::ReverseItems
  93. {
  94. m_aUsers.Reverse();
  95. }
  96. class CompareItem
  97. {
  98. public:
  99. CompareItem( UserColumns colColumn ) : m_colColumn( colColumn ) {}
  100. inline bool operator() ( const CUserProfile& userProfile1, const CUserProfile& userProfile2 )
  101. {
  102. switch ( m_colColumn )
  103. {
  104. case colName: return ( userProfile1.m_strUserName.Compare( userProfile2.m_strUserName ) < 0 );
  105. case colDept: return ( userProfile1.m_strDepartment.Compare( userProfile2.m_strDepartment ) < 0 );
  106. case colPhone: return ( userProfile1.m_strPhoneNumber.Compare( userProfile2.m_strPhoneNumber ) < 0 );
  107. }
  108. return false;
  109. }
  110. protected:
  111. UserColumns m_colColumn;
  112. };
  113. void SortItems( int nColumn, BOOL bAscending ) // overrides CListImpl::SortItems
  114. {
  115. m_aUsers.Sort( CompareItem( (UserColumns)nColumn ) );
  116. }
  117. };
  118. class CMainDlg : public CDialogImpl<CMainDlg>
  119. {
  120. public:
  121. CMainDlg()
  122. {
  123. m_wndListCtrl.RegisterClass();
  124. m_wndUserData.RegisterClass();
  125. m_wndUserList.RegisterClass();
  126. m_bShowMessage = TRUE;
  127. m_bShowThemed = TRUE;
  128. }
  129. enum { IDD = IDD_MAINDLG };
  130. BEGIN_MSG_MAP(CMainDlg)
  131. MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  132. COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
  133. COMMAND_ID_HANDLER(IDOK, OnOK)
  134. COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
  135. COMMAND_ID_HANDLER(IDC_THEME, OnTheme)
  136. NOTIFY_HANDLER_EX(IDC_USERDATA, LCN_SELECTED, OnUserDataSelected)
  137. NOTIFY_HANDLER_EX(IDC_USERLIST, LCN_SELECTED, OnUserListSelected)
  138. NOTIFY_HANDLER_EX(IDC_LISTCTRL, LCN_HYPERLINK, OnListHyperLink)
  139. REFLECT_NOTIFICATIONS()
  140. END_MSG_MAP()
  141. protected:
  142. CListCtrl m_wndListCtrl;
  143. CListCtrlData< CUserProfile > m_wndUserData;
  144. CListUserData m_wndUserList;
  145. CImageList m_ilItemImages;
  146. CFont m_fntCustomFont1;
  147. CFont m_fntCustomFont2;
  148. BOOL m_bShowMessage;
  149. BOOL m_bShowThemed;
  150. LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  151. {
  152. // center the dialog on the screen
  153. CenterWindow();
  154. // set icons
  155. HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
  156. IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
  157. SetIcon(hIcon, TRUE);
  158. HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
  159. IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
  160. SetIcon(hIconSmall, FALSE);
  161. m_wndListCtrl.SubclassWindow( GetDlgItem( IDC_LISTCTRL ) );
  162. m_wndUserData.SubclassWindow( GetDlgItem( IDC_USERDATA ) );
  163. m_wndUserList.SubclassWindow( GetDlgItem( IDC_USERLIST ) );
  164. if ( !m_ilItemImages.CreateFromImage( IDB_EXAMPLE, 16, 0, RGB( 255, 0, 255 ), IMAGE_BITMAP, LR_CREATEDIBSECTION ) )
  165. return FALSE;
  166. InitBasicList();
  167. InitDataList();
  168. InitUserList();
  169. return TRUE;
  170. }
  171. void InitBasicList()
  172. {
  173. LOGFONT logFont = { 0 };
  174. logFont.lfCharSet = DEFAULT_CHARSET;
  175. logFont.lfHeight = 90;
  176. lstrcpy( logFont.lfFaceName, _T( "New Times Roman" ) );
  177. logFont.lfWeight = FW_BOLD;
  178. logFont.lfItalic = (BYTE)TRUE;
  179. m_fntCustomFont1.CreatePointFontIndirect( &logFont );
  180. logFont.lfHeight = 100;
  181. lstrcpy( logFont.lfFaceName, _T( "Arial" ) );
  182. logFont.lfUnderline = (BYTE)TRUE;
  183. m_fntCustomFont2.CreatePointFontIndirect( &logFont );
  184. m_wndListCtrl.SetImageList( m_ilItemImages );
  185. m_wndListCtrl.SetFocusSubItem( TRUE );
  186. m_wndListCtrl.AddColumn( _T( "Column 1" ), 150 );
  187. m_wndListCtrl.AddColumn( _T( "" ), 0, ITEM_IMAGE_3STATE, TRUE, ITEM_FORMAT_CHECKBOX_3STATE );
  188. m_wndListCtrl.AddColumn( _T( "Column 2" ), 130 );
  189. m_wndListCtrl.AddColumn( _T( "Column 3" ), 80, -1, FALSE, ITEM_FORMAT_NONE, ITEM_FLAGS_RIGHT );
  190. m_wndListCtrl.AddColumn( _T( "Column 4" ), 120 );
  191. m_wndListCtrl.AddColumn( _T( "Column 5" ), 170, ITEM_IMAGE_ATTACHMENT, FALSE, ITEM_FORMAT_PROGRESS );
  192. srand( 12345 );
  193. for ( int nItem = 1; nItem <= 1000; nItem++ )
  194. {
  195. #ifdef _UNICODE
  196. wostringstream osItemText;
  197. #else
  198. ostringstream osItemText;
  199. #endif
  200. osItemText << _T( "Item " ) << nItem;
  201. int nNewItem = m_wndListCtrl.AddItem( osItemText.str().c_str(), rand() % 6 );
  202. m_wndListCtrl.SetItemCheck( nNewItem, 1, ( rand() % 3 ) - 1 );
  203. osItemText.str( _T( "" ) );
  204. TCHAR nSortChar = _T( 'A' ) + ( rand() % 26 );
  205. osItemText << nSortChar << _T( " Random Text" );
  206. m_wndListCtrl.SetItemText( nNewItem, 2, osItemText.str().c_str() );
  207. m_wndListCtrl.SetItemImage( nNewItem, 2, rand() % 6 );
  208. osItemText.str( _T( "" ) );
  209. osItemText << nItem;
  210. m_wndListCtrl.SetItemText( nNewItem, 3, osItemText.str().c_str() );
  211. osItemText.str( _T( "" ) );
  212. osItemText << ( rand() % 101 );
  213. m_wndListCtrl.SetItemText( nNewItem, 5, osItemText.str().c_str() );
  214. }
  215. CListArray < CString > aComboList;
  216. aComboList.Add( _T( "Item 1" ) );
  217. aComboList.Add( _T( "Item 2" ) );
  218. aComboList.Add( _T( "Item 3" ) );
  219. aComboList.Add( _T( "Item 4" ) );
  220. aComboList.Add( _T( "Item 5" ) );
  221. m_wndListCtrl.SetItemText( 0, 4, _T( "Combo (Edit):" ) );
  222. m_wndListCtrl.SetItemFormat( 0, 5, ITEM_FORMAT_COMBO, ITEM_FLAGS_COMBO_EDIT, aComboList );
  223. m_wndListCtrl.SetItemComboIndex( 0, 5, 0 ); // "Item 1"
  224. m_wndListCtrl.SetItemText( 1, 4, _T( "Combo (List):" ) );
  225. m_wndListCtrl.SetItemFormat( 1, 5, ITEM_FORMAT_COMBO, ITEM_FLAGS_NONE, aComboList );
  226. m_wndListCtrl.SetItemText( 1, 5, _T( "Item 1" ) );
  227. m_wndListCtrl.SetItemText( 2, 4, _T( "Edit:" ) );
  228. m_wndListCtrl.SetItemFormat( 2, 5, ITEM_FORMAT_EDIT );
  229. m_wndListCtrl.SetItemText( 2, 5, _T( "<alpha-numeric>" ) );
  230. m_wndListCtrl.SetItemText( 3, 4, _T( "Edit (Numeric):" ) );
  231. m_wndListCtrl.SetItemFormat( 3, 5, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_NUMBER );
  232. m_wndListCtrl.SetItemText( 3, 5, _T( "123" ) );
  233. CTime tmDateTime = CTime::GetCurrentTime();
  234. SYSTEMTIME stDateTime;
  235. tmDateTime.GetAsSystemTime( stDateTime );
  236. m_wndListCtrl.SetItemText( 4, 4, _T( "Date (inc Time):" ) );
  237. m_wndListCtrl.SetItemFormat( 4, 5, ITEM_FORMAT_DATETIME, ITEM_FLAGS_DATETIME_NONE );
  238. m_wndListCtrl.SetItemDate( 4, 5, stDateTime );
  239. m_wndListCtrl.SetItemText( 5, 4, _T( "Date (Date only):" ) );
  240. m_wndListCtrl.SetItemFormat( 5, 5, ITEM_FORMAT_DATETIME, ITEM_FLAGS_DATE_ONLY );
  241. m_wndListCtrl.SetItemDate( 5, 5, stDateTime );
  242. m_wndListCtrl.SetItemText( 6, 4, _T( "Solid progress:" ) );
  243. m_wndListCtrl.SetItemFormat( 6, 5, ITEM_FORMAT_PROGRESS, ITEM_FLAGS_PROGRESS_SOLID );
  244. m_wndListCtrl.SetItemText( 7, 4, _T( "Normal progress:" ) );
  245. m_wndListCtrl.SetItemText( 8, 4, _T( "Checkbox:" ) );
  246. m_wndListCtrl.SetItemFormat( 8, 5, ITEM_FORMAT_CHECKBOX );
  247. m_wndListCtrl.SetItemText( 9, 4, _T( "Checkbox (3 State):" ) );
  248. m_wndListCtrl.SetItemFormat( 9, 5, ITEM_FORMAT_CHECKBOX_3STATE );
  249. m_wndListCtrl.SetItemText( 10, 4, _T( "Checkbox (read-only):" ) );
  250. m_wndListCtrl.SetItemFormat( 10, 5, ITEM_FORMAT_CHECKBOX, ITEM_FLAGS_READ_ONLY );
  251. m_wndListCtrl.SetItemText( 11, 4, _T( "Hyperlink" ) );
  252. m_wndListCtrl.SetItemFormat( 11, 4, ITEM_FORMAT_HYPERLINK );
  253. m_wndListCtrl.SetItemText( 12, 4, _T( "Some very long text that should trigger titletip" ) );
  254. m_wndListCtrl.SetItemText( 13, 4, _T( "Built-in tooltip support" ) );
  255. m_wndListCtrl.SetItemToolTip( 13, _T( "This is anmultiline tooltip" ) );
  256. m_wndListCtrl.SetItemText( 14, 4, _T( "Font Support" ) );
  257. m_wndListCtrl.SetItemFont( 14, 4, m_fntCustomFont1 );
  258. m_wndListCtrl.SetItemText( 15, 4, _T( "Font Support" ) );
  259. m_wndListCtrl.SetItemFont( 15, 4, m_fntCustomFont2 );
  260. m_wndListCtrl.SetItemText( 16, 4, _T( "Colour Support" ) );
  261. m_wndListCtrl.SetItemColours( 16, 4, RGB( 128, 128, 64 ), RGB( 0, 255, 0 ) );
  262. m_wndListCtrl.SetItemText( 17, 4, _T( "Colour Support" ) );
  263. m_wndListCtrl.SetItemColours( 17, 4, RGB( 128, 0, 128 ), RGB( 255, 255, 128 ) );
  264. }
  265. void InitDataList()
  266. {
  267. CUserProfile userProfile1( FALSE, _T( "Fred" ), _T( "Accounts" ), _T( "1234" ) );
  268. CUserProfile userProfile2( TRUE, _T( "Simon" ), _T( "Accounts" ), _T( "1235" ) );
  269. CUserProfile userProfile3( FALSE, _T( "Kate" ), _T( "Development" ), _T( "2341" ) );
  270. CUserProfile userProfile4( FALSE, _T( "David" ), _T( "Development" ), _T( "2342" ) );
  271. CUserProfile userProfile5( TRUE, _T( "Jake" ), _T( "Development" ), _T( "2343" ) );
  272. CUserProfile userProfile6( FALSE, _T( "Mike" ), _T( "Marketing" ), _T( "5343" ) );
  273. CUserProfile userProfile7( FALSE, _T( "Tony" ), _T( "Marketing" ), _T( "5344" ) );
  274. m_wndUserData.SetImageList( m_ilItemImages );
  275. m_wndUserData.AddColumn( _T( "User Name" ), 150 );
  276. m_wndUserData.AddColumn( _T( "Department" ), 100 );
  277. m_wndUserData.AddColumn( _T( "Phone Number" ), 100 );
  278. int nUser = m_wndUserData.AddItem( userProfile1.m_strUserName, userProfile1.m_bAdministrator ? 6 : 0 );
  279. m_wndUserData.SetItemText( nUser, 1, userProfile1.m_strDepartment );
  280. m_wndUserData.SetItemText( nUser, 2, userProfile1.m_strPhoneNumber );
  281. m_wndUserData.SetItemData( nUser, userProfile1 );
  282. nUser = m_wndUserData.AddItem( userProfile2.m_strUserName, userProfile2.m_bAdministrator ? 6 : 0 );
  283. m_wndUserData.SetItemText( nUser, 1, userProfile2.m_strDepartment );
  284. m_wndUserData.SetItemText( nUser, 2, userProfile2.m_strPhoneNumber );
  285. m_wndUserData.SetItemData( nUser, userProfile2 );
  286. nUser = m_wndUserData.AddItem( userProfile3.m_strUserName, userProfile3.m_bAdministrator ? 6 : 0 );
  287. m_wndUserData.SetItemText( nUser, 1, userProfile3.m_strDepartment );
  288. m_wndUserData.SetItemText( nUser, 2, userProfile3.m_strPhoneNumber );
  289. m_wndUserData.SetItemData( nUser, userProfile3 );
  290. nUser = m_wndUserData.AddItem( userProfile4.m_strUserName, userProfile4.m_bAdministrator ? 6 : 0 );
  291. m_wndUserData.SetItemText( nUser, 1, userProfile4.m_strDepartment );
  292. m_wndUserData.SetItemText( nUser, 2, userProfile4.m_strPhoneNumber );
  293. m_wndUserData.SetItemData( nUser, userProfile4 );
  294. nUser = m_wndUserData.AddItem( userProfile5.m_strUserName, userProfile5.m_bAdministrator ? 6 : 0 );
  295. m_wndUserData.SetItemText( nUser, 1, userProfile5.m_strDepartment );
  296. m_wndUserData.SetItemText( nUser, 2, userProfile5.m_strPhoneNumber );
  297. m_wndUserData.SetItemData( nUser, userProfile5 );
  298. nUser = m_wndUserData.AddItem( userProfile6.m_strUserName, userProfile6.m_bAdministrator ? 6 : 0 );
  299. m_wndUserData.SetItemText( nUser, 1, userProfile6.m_strDepartment );
  300. m_wndUserData.SetItemText( nUser, 2, userProfile6.m_strPhoneNumber );
  301. m_wndUserData.SetItemData( nUser, userProfile6 );
  302. nUser = m_wndUserData.AddItem( userProfile7.m_strUserName, userProfile7.m_bAdministrator ? 6 : 0 );
  303. m_wndUserData.SetItemText( nUser, 1, userProfile7.m_strDepartment );
  304. m_wndUserData.SetItemText( nUser, 2, userProfile7.m_strPhoneNumber );
  305. m_wndUserData.SetItemData( nUser, userProfile7 );
  306. }
  307. void InitUserList()
  308. {
  309. CUserProfile userProfile1( FALSE, _T( "Fred" ), _T( "Accounts" ), _T( "1234" ) );
  310. CUserProfile userProfile2( TRUE, _T( "Simon" ), _T( "Accounts" ), _T( "1235" ) );
  311. CUserProfile userProfile3( FALSE, _T( "Kate" ), _T( "Development" ), _T( "2341" ) );
  312. CUserProfile userProfile4( FALSE, _T( "David" ), _T( "Development" ), _T( "2342" ) );
  313. CUserProfile userProfile5( TRUE, _T( "Jake" ), _T( "Development" ), _T( "2343" ) );
  314. CUserProfile userProfile6( FALSE, _T( "Mike" ), _T( "Marketing" ), _T( "5343" ) );
  315. CUserProfile userProfile7( FALSE, _T( "Tony" ), _T( "Marketing" ), _T( "5344" ) );
  316. m_wndUserList.AddUser( userProfile1 );
  317. m_wndUserList.AddUser( userProfile2 );
  318. m_wndUserList.AddUser( userProfile3 );
  319. m_wndUserList.AddUser( userProfile4 );
  320. m_wndUserList.AddUser( userProfile5 );
  321. m_wndUserList.AddUser( userProfile6 );
  322. m_wndUserList.AddUser( userProfile7 );
  323. }
  324. LRESULT OnUserDataSelected( LPNMHDR lpNMHDR )
  325. {
  326. CListNotify *pListNotify = reinterpret_cast<CListNotify *>( lpNMHDR );
  327. CUserProfile userProfile;
  328. m_wndUserData.GetItemData( pListNotify->m_nItem, userProfile );
  329. #ifdef _UNICODE
  330. wostringstream osItemText;
  331. #else
  332. ostringstream osItemText;
  333. #endif
  334. osItemText << _T( "User Selected: " ) << userProfile.m_strUserName << _T( "rn" );
  335. osItemText << _T( "Press Cancel to stop notifications" );
  336. if ( m_bShowMessage )
  337. {
  338. if ( MessageBox( osItemText.str().c_str(), _T( "Selected" ), MB_OKCANCEL ) != IDOK )
  339. m_bShowMessage = FALSE;
  340. }
  341. return 0;
  342. }
  343. LRESULT OnListHyperLink( LPNMHDR lpNMHDR )
  344. {
  345. CListNotify *pListNotify = reinterpret_cast<CListNotify *>( lpNMHDR );
  346. MessageBox( _T( "Hyperlink clicked" ), _T( "Hyperlink" ) );
  347. return 0;
  348. }
  349. LRESULT OnUserListSelected( LPNMHDR lpNMHDR )
  350. {
  351. CListNotify *pListNotify = reinterpret_cast<CListNotify *>( lpNMHDR );
  352. CUserProfile userProfile;
  353. m_wndUserList.GetUser( pListNotify->m_nItem, userProfile );
  354. #ifdef _UNICODE
  355. wostringstream osItemText;
  356. #else
  357. ostringstream osItemText;
  358. #endif
  359. osItemText << _T( "User Selected: " ) << userProfile.m_strUserName << _T( "rn" );
  360. osItemText << _T( "Press Cancel to stop notifications" );
  361. if ( m_bShowMessage )
  362. {
  363. if ( MessageBox( osItemText.str().c_str(), _T( "Selected" ), MB_OKCANCEL ) != IDOK )
  364. m_bShowMessage = FALSE;
  365. }
  366. return 0;
  367. }
  368. LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  369. {
  370. CSimpleDialog<IDD_ABOUTBOX, FALSE> dlg;
  371. dlg.DoModal();
  372. return 0;
  373. }
  374. LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  375. {
  376. // TODO: Add validation code 
  377. EndDialog(wID);
  378. return 0;
  379. }
  380. LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  381. {
  382. EndDialog(wID);
  383. return 0;
  384. }
  385. LRESULT OnTheme(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  386. {
  387. m_bShowThemed = !m_bShowThemed;
  388. m_wndListCtrl.ShowThemed( m_bShowThemed );
  389. m_wndUserData.ShowThemed( m_bShowThemed );
  390. m_wndUserList.ShowThemed( m_bShowThemed );
  391. return 0;
  392. }
  393. };