LHDRDLG.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // ListHdrDlg.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "ListHdr.h"
  14. #include "LHdrDlg.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CAboutDlg dialog used for App About
  22. class CAboutDlg : public CDialog
  23. {
  24. public:
  25. CAboutDlg();
  26. // Dialog Data
  27. //{{AFX_DATA(CAboutDlg)
  28. enum { IDD = IDD_ABOUTBOX };
  29. //}}AFX_DATA
  30. // ClassWizard generated virtual function overrides
  31. //{{AFX_VIRTUAL(CAboutDlg)
  32. protected:
  33. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  34. //}}AFX_VIRTUAL
  35. // Implementation
  36. protected:
  37. //{{AFX_MSG(CAboutDlg)
  38. //}}AFX_MSG
  39. DECLARE_MESSAGE_MAP()
  40. };
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  42. {
  43. //{{AFX_DATA_INIT(CAboutDlg)
  44. //}}AFX_DATA_INIT
  45. }
  46. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CDialog::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CAboutDlg)
  50. //}}AFX_DATA_MAP
  51. }
  52. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  53. //{{AFX_MSG_MAP(CAboutDlg)
  54. // No message handlers
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CListHdrDlg dialog
  59. CListHdrDlg::CListHdrDlg(CWnd* pParent /*=NULL*/)
  60. : CDialog(CListHdrDlg::IDD, pParent)
  61. {
  62. //{{AFX_DATA_INIT(CListHdrDlg)
  63. m_bNoLabelWrap = FALSE;
  64. m_bAutoArrange = FALSE;
  65. m_bSingleSel = FALSE;
  66. m_bEditLabels = FALSE;
  67. m_bNoColHdr = FALSE;
  68. m_bNoSortHdr = FALSE;
  69. m_strViewMode = _T("REPORT");
  70. m_strAlignMode = _T("ALIGNTOP");
  71. m_strSortMode = _T("None");
  72. m_bHoverSelect = FALSE;
  73. m_bWorkAreas = FALSE;
  74. //}}AFX_DATA_INIT
  75. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  76. m_bHotCursor= TRUE;
  77. m_pImageHdrSmall = NULL;
  78. m_pImageList = NULL;
  79. m_pImageListSmall = NULL;
  80. }
  81. CListHdrDlg::~CListHdrDlg()
  82. {
  83. if( m_pImageHdrSmall != NULL)
  84. delete m_pImageHdrSmall;
  85. if( m_pImageList != NULL)
  86. delete m_pImageList;
  87. if( m_pImageListSmall != NULL)
  88. delete m_pImageListSmall;
  89. }
  90. void CListHdrDlg::DoDataExchange(CDataExchange* pDX)
  91. {
  92. CDialog::DoDataExchange(pDX);
  93. //{{AFX_DATA_MAP(CListHdrDlg)
  94. DDX_Control(pDX, IDC_LISTVIEW1, m_listctrl);
  95. DDX_Check(pDX, IDC_NOLABELWRAP, m_bNoLabelWrap);
  96. DDX_Check(pDX, IDC_AUTOARRANGE, m_bAutoArrange);
  97. DDX_Check(pDX, IDC_SINGLESEL, m_bSingleSel);
  98. DDX_Check(pDX, IDC_EDITLABELS, m_bEditLabels);
  99. DDX_Check(pDX, IDC_NOCOLUMNHEADER, m_bNoColHdr);
  100. DDX_Check(pDX, IDC_NOSORTHEADER, m_bNoSortHdr);
  101. DDX_CBString(pDX, IDC_VIEWMODE, m_strViewMode);
  102. DDX_CBString(pDX, IDC_ALIGN, m_strAlignMode);
  103. DDX_CBString(pDX, IDC_SORT, m_strSortMode);
  104. DDX_Check(pDX, IDC_HOVER, m_bHoverSelect);
  105. DDX_Check(pDX, IDC_WORKAREAS, m_bWorkAreas);
  106. //}}AFX_DATA_MAP
  107. }
  108. BEGIN_MESSAGE_MAP(CListHdrDlg, CDialog)
  109. //{{AFX_MSG_MAP(CListHdrDlg)
  110. ON_WM_PAINT()
  111. ON_WM_QUERYDRAGICON()
  112. ON_BN_CLICKED(IDC_NOLABELWRAP, OnNoLabelWrap)
  113. ON_BN_CLICKED(IDC_AUTOARRANGE, OnAutoArrange)
  114. ON_BN_CLICKED(IDC_EDITLABELS, OnEditLabels)
  115. ON_BN_CLICKED(IDC_NOCOLUMNHEADER, OnNoColHdr)
  116. ON_BN_CLICKED(IDC_NOSORTHEADER, OnNoSortHdr)
  117. ON_BN_CLICKED(IDC_SINGLESEL, OnSingleSel)
  118. ON_CBN_SELCHANGE(IDC_ALIGN, OnChangeAlign)
  119. ON_CBN_SELCHANGE(IDC_VIEWMODE, OnChangeView)
  120. ON_BN_CLICKED(IDC_HOVER, OnHover)
  121. ON_BN_CLICKED(IDC_MYHOTCUR, OnMyHotCur)
  122. ON_CBN_SELCHANGE(IDC_SORT, OnChangeSort)
  123. ON_BN_CLICKED(IDC_WORKAREAS, OnWorkAreas)
  124. ON_BN_CLICKED(IDC_STDHOTCUR, OnStdHotCur)
  125. ON_BN_CLICKED(IDABOUT, OnAbout)
  126. //}}AFX_MSG_MAP
  127. END_MESSAGE_MAP()
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CListHdrDlg message handlers
  130. BOOL CListHdrDlg::OnInitDialog()
  131. {
  132. CListHdrApp     *pApp;
  133. CRect           rect;
  134. CDialog::OnInitDialog();  // let the base class do the default work
  135. UpdateData(TRUE);  // bring the information from the dialog.
  136. pApp = (CListHdrApp *)AfxGetApp();
  137. srand((unsigned) time(NULL));  // start the random number generator
  138. // create image list for header items
  139. m_pImageHdrSmall = new CImageList();
  140. ASSERT(m_pImageHdrSmall != NULL);    // serious allocation failure checking
  141. m_pImageHdrSmall->Create(16, 16, ILC_MASK, 2, 2);
  142. m_pImageHdrSmall->Add(pApp->LoadIcon(IDI_HDRICON1));
  143. m_pImageHdrSmall->Add(pApp->LoadIcon(IDI_HDRICON2));
  144. // fill in image lists
  145. m_pImageList = new CImageList();
  146. m_pImageListSmall = new CImageList();
  147. ASSERT(m_pImageList != NULL && m_pImageListSmall != NULL);    // serious allocation failure checking
  148. m_pImageList->Create(32, 32, TRUE,  4, 4);
  149. m_pImageListSmall->Create(16, 16, TRUE, 4, 4);
  150. m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST1));
  151. m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST2));
  152. m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST3));
  153. m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST4));
  154. m_pImageListSmall->Add(pApp->LoadIcon(IDI_ICONLIST1));
  155. m_pImageListSmall->Add(pApp->LoadIcon(IDI_ICONLIST2));
  156. m_pImageListSmall->Add(pApp->LoadIcon(IDI_ICONLIST3));
  157. m_pImageListSmall->Add(pApp->LoadIcon(IDI_ICONLIST4));
  158. // initialize the standard and custom hot cursors
  159. m_hMyHotCursor= pApp->LoadCursor(IDC_SPYGLASS);
  160. m_hStdHotCursor= m_listctrl.GetHotCursor();
  161. FillListCtrl();
  162. // Enable/disable inter-dependent list control styles
  163. ((CButton*)GetDlgItem(IDC_STDHOTCUR))->SetCheck(m_bHotCursor);
  164. GetDlgItem(IDC_STDHOTCUR)->EnableWindow(m_bHoverSelect);
  165. GetDlgItem(IDC_MYHOTCUR)->EnableWindow(m_bHoverSelect);
  166. GetDlgItem(IDC_WORKAREAS)->EnableWindow(FALSE);
  167. GetDlgItem(IDC_ALIGN)->EnableWindow(FALSE);  // default is  report mode Does not support this
  168. GetDlgItem(IDC_AUTOARRANGE)->EnableWindow(FALSE);
  169. return FALSE;  // there is no change in any control focus stuff here.
  170. }
  171. // If you add a minimize button to your dialog, you will need the code below
  172. //  to draw the icon.  For MFC applications using the document/view model,
  173. //  this is automatically done for you by the framework.
  174. void CListHdrDlg::OnPaint()
  175. {
  176. if (IsIconic())
  177. {
  178. CPaintDC dc(this); // device context for painting
  179. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  180. // Center icon in client rectangle
  181. int cxIcon = GetSystemMetrics(SM_CXICON);
  182. int cyIcon = GetSystemMetrics(SM_CYICON);
  183. CRect rect;
  184. GetClientRect(&rect);
  185. int x = (rect.Width() - cxIcon + 1) / 2;
  186. int y = (rect.Height() - cyIcon + 1) / 2;
  187. // Draw the icon
  188. dc.DrawIcon(x, y, m_hIcon);
  189. }
  190. else
  191. {
  192. CDialog::OnPaint();
  193. }
  194. }
  195. HCURSOR CListHdrDlg::OnQueryDragIcon()
  196. {
  197. return (HCURSOR) m_hIcon;
  198. }
  199. void CListHdrDlg::FillListCtrl()
  200. {
  201. CRect           rect;
  202. int             iIcon, iItem, iSubItem, iActualItem;
  203. LV_ITEM         lvitem;
  204. CString         strItem1= _T("ITEM");
  205. CString         strItem2= _T("SUB_ITEM");
  206. CString         strIconDesc[4], strIconShortDesc[4];
  207. LPTSTR          pStrTemp1, pStrTemp2;
  208. CListHdrApp     *pApp;
  209. strIconDesc[0]= _T("Blue Ellipse, Yellow Triangle, Red Rectangle");
  210. strIconDesc[1]= _T("Yellow Ellipse, Red Triangle, Blue Rectangle");
  211. strIconDesc[2]= _T("Red Ellipse, Blue Triangle, Yellow Rectangle");
  212. strIconDesc[3]= _T("Red Ellipse, Yellow Triangle, Blue Rectangle");
  213. strIconShortDesc[0]= _T("BE, YT, RR (Title)");
  214. strIconShortDesc[1]= _T("YE, RT, BR (Title)");
  215. strIconShortDesc[2]= _T("RE, BT, YR (Title)");
  216. strIconShortDesc[3]= _T("RE, YT, BR (Title)");
  217. pApp = (CListHdrApp *)AfxGetApp();
  218. m_listctrl.SetImageList(m_pImageList, LVSIL_NORMAL);
  219. m_listctrl.SetImageList(m_pImageListSmall, LVSIL_SMALL);
  220. // insert two columns (REPORT mode) and modify the new header items
  221. m_listctrl.GetWindowRect(&rect);
  222. m_listctrl.InsertColumn(0, strItem1, LVCFMT_LEFT,
  223. rect.Width() * 1/3, 0);
  224. m_listctrl.InsertColumn(1, strItem2, LVCFMT_LEFT,
  225. rect.Width() * 2/3, 1);
  226. ModifyHeaderItems();
  227. for (iItem = 0; iItem < 20; iItem++)  // insert the items and subitems into the list view.
  228. for (iSubItem = 0; iSubItem < 2; iSubItem++)
  229. {
  230. if (iSubItem == 0)
  231. iIcon = rand() % 4;  // choose the icon and legend for the entry
  232. lvitem.mask = LVIF_TEXT | (iSubItem == 0? LVIF_IMAGE : 0);
  233. lvitem.iItem = (iSubItem == 0)? iItem : iActualItem;
  234. lvitem.iSubItem = iSubItem;
  235. // calculate the main and sub-item strings for the current item
  236. pStrTemp1= strIconShortDesc[iIcon].GetBuffer(strIconShortDesc[iIcon].GetLength());
  237. pStrTemp2= strIconDesc[iIcon].GetBuffer(strIconDesc[iIcon].GetLength());
  238. lvitem.pszText = iSubItem == 0? pStrTemp1 : pStrTemp2;
  239. lvitem.iImage = iIcon;
  240. if (iSubItem == 0)
  241. iActualItem = m_listctrl.InsertItem(&lvitem); // insert new item
  242. else
  243. m_listctrl.SetItem(&lvitem); // modify existing item (the sub-item text)
  244. }
  245. }
  246. void CListHdrDlg::ModifyHeaderItems()
  247. {
  248. HD_ITEM curItem;
  249. // retrieve embedded header control
  250. CHeaderCtrl* pHdrCtrl= NULL;
  251. pHdrCtrl= m_listctrl.GetHeaderCtrl();
  252. pHdrCtrl->SetImageList(m_pImageHdrSmall);
  253. // add bmaps to each header item
  254. pHdrCtrl->GetItem(0, &curItem);
  255. curItem.mask= HDI_IMAGE | HDI_FORMAT;
  256. curItem.iImage= 0;
  257. curItem.fmt= HDF_LEFT | HDF_IMAGE | HDF_STRING;
  258. pHdrCtrl->SetItem(0, &curItem);
  259. pHdrCtrl->GetItem(1, &curItem);
  260. curItem.mask= HDI_IMAGE | HDI_FORMAT;
  261. curItem.iImage= 1;
  262. curItem.fmt= HDF_LEFT | HDF_IMAGE | HDF_STRING;
  263. pHdrCtrl->SetItem(1, &curItem);
  264. }
  265. // this function is used when a requested style
  266. // LVS_NOLABELWRAP, LVS_NOCOLUMNHEADER, and LVS_NOSORTHEADER
  267. // forces the current control to be re-created with the new style.
  268. void CListHdrDlg::RenewListCtrl(DWORD dwStyle, BOOL bSetBits)
  269. {
  270. DWORD   dwStyleOld, dwExtStyles;
  271. CRect   rect;
  272. dwStyleOld = GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
  273. if (bSetBits)
  274. dwStyleOld |= dwStyle;   // turn on bits specified by caller.
  275. else
  276. dwStyleOld &= ~dwStyle;  // turn off bits specified by caller.
  277. m_listctrl.GetWindowRect(&rect);
  278. ScreenToClient(&rect);
  279. dwExtStyles= m_listctrl.GetExtendedStyle(); //save extended styles
  280. m_listctrl.DestroyWindow();
  281. m_listctrl.Create(dwStyleOld, rect, this, IDC_LISTVIEW1);
  282. m_listctrl.ModifyStyleEx(0,WS_EX_CLIENTEDGE); // renew the 3D border of the control
  283. m_listctrl.SetExtendedStyle(dwExtStyles);
  284. FillListCtrl(); // repopulate with a new item group
  285. // work areas are not carried over with the new control
  286. m_listctrl.SetWorkAreas(0, NULL);
  287. m_bWorkAreas= FALSE;
  288. UpdateData(FALSE);  // update the dialog
  289. }
  290. // this function is used when a requested style
  291. // can be applied to the existing control, and demonstrated.
  292. void CListHdrDlg::ChangeListCtrlStyle(DWORD dwStyle, BOOL bSetBits)
  293. {
  294. CRect   rect;
  295. m_listctrl.GetWindowRect(&rect);
  296. ScreenToClient(&rect);
  297. ASSERT(dwStyle != 0);  // watch out for LVS_foo DEFINITIONS which are 0.
  298. if (bSetBits)
  299. m_listctrl.ModifyStyle(0, dwStyle);
  300. else
  301. m_listctrl.ModifyStyle(dwStyle, 0);
  302. InvalidateRect(rect);
  303. UpdateData(FALSE);  // send information back to the dialog
  304. }
  305. void CListHdrDlg::OnAutoArrange()
  306. {
  307. UpdateData(TRUE);  // get the information from the dialog
  308. ChangeListCtrlStyle(LVS_AUTOARRANGE, m_bAutoArrange);
  309. }
  310. void CListHdrDlg::OnEditLabels()
  311. {
  312. UpdateData(TRUE);
  313. ChangeListCtrlStyle(LVS_EDITLABELS, m_bEditLabels);
  314. }
  315. void CListHdrDlg::OnNoColHdr()
  316. {
  317. UpdateData(TRUE);
  318. RenewListCtrl(LVS_NOCOLUMNHEADER, m_bNoColHdr);
  319. }
  320. void CListHdrDlg::OnNoSortHdr()
  321. {
  322. UpdateData(TRUE);
  323. RenewListCtrl(LVS_NOSORTHEADER, m_bNoSortHdr);
  324. }
  325. void CListHdrDlg::OnSingleSel()
  326. {
  327. UpdateData(TRUE);
  328. ChangeListCtrlStyle(LVS_SINGLESEL, m_bSingleSel);
  329. }
  330. void CListHdrDlg::OnNoLabelWrap()
  331. {
  332. UpdateData(TRUE);
  333. RenewListCtrl(LVS_NOLABELWRAP, m_bNoLabelWrap);
  334. }
  335. void CListHdrDlg::OnChangeView()
  336. {
  337. long        lStyle, lStyleOld;
  338. BOOL        bReport, bIconic;
  339. // retrieve view mode selection
  340. UpdateData(TRUE);
  341. if (m_strViewMode == _T("ICON"))
  342. lStyle = LVS_ICON;
  343. else if (m_strViewMode == _T("SMALL ICON"))
  344. lStyle = LVS_SMALLICON;
  345. else if (m_strViewMode == _T("REPORT"))
  346. lStyle = LVS_REPORT;
  347. else
  348. {
  349. ASSERT(m_strViewMode == _T("LIST"));
  350. lStyle = LVS_LIST;
  351. }
  352. // update interdependent styles, depending on view mode choice
  353. bReport = lStyle == LVS_REPORT;
  354. bIconic = lStyle == LVS_ICON || lStyle == LVS_SMALLICON;
  355. GetDlgItem(IDC_NOSORTHEADER)->EnableWindow(bReport);
  356. GetDlgItem(IDC_NOCOLUMNHEADER)->EnableWindow(bReport);
  357. GetDlgItem(IDC_WORKAREAS)->EnableWindow(bIconic);
  358. GetDlgItem(IDC_ALIGN)->EnableWindow(bIconic);
  359. GetDlgItem(IDC_AUTOARRANGE)->EnableWindow(bIconic);
  360. lStyleOld = GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
  361. lStyleOld &= ~(LVS_TYPEMASK);  // turn off all the style (view mode) bits
  362. lStyleOld |= lStyle;        // Set the new style for the control
  363. SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, lStyleOld);
  364. //In order to change the alignment, the control must be re-created.
  365. //However, changing the view mode of a list control does not force a re-creation.
  366. //Therefore, if the list view is in iconic mode, the control must be re-created
  367. //to carry over the current alignment mode.
  368. if(bIconic) //need to keep alignment also
  369. RenewListCtrl(0, 0);
  370. }
  371. void CListHdrDlg::OnChangeAlign()
  372. {
  373. // this function takes into consideration that LVS_ALIGNTOP is defined as zero.
  374. UpdateData(TRUE);
  375. ASSERT(m_strAlignMode == _T("ALIGNTOP") || m_strAlignMode == _T("ALIGNLEFT"));
  376. RenewListCtrl(LVS_ALIGNLEFT, (m_strAlignMode == _T("ALIGNLEFT")));
  377. }
  378. void CListHdrDlg::OnHover()
  379. {
  380. UpdateData(TRUE);
  381. if(m_bHoverSelect) // "hover selection" is enabled
  382. {
  383. // LVS_EX_ONECLICKACTIVATE (or LVS_EX_TWOCLICKACTIVATE must also be
  384. // set before  "hover selection" is enabled
  385. m_listctrl.SetExtendedStyle(LVS_EX_TRACKSELECT |
  386. LVS_EX_ONECLICKACTIVATE);
  387. GetDlgItem(IDC_STDHOTCUR)->EnableWindow(m_bHoverSelect);
  388. GetDlgItem(IDC_MYHOTCUR)->EnableWindow(m_bHoverSelect);
  389. }
  390. else // "hover selection" is disabled
  391. {
  392. m_listctrl.SetExtendedStyle(0);
  393. GetDlgItem(IDC_STDHOTCUR)->EnableWindow(m_bHoverSelect);
  394. GetDlgItem(IDC_MYHOTCUR)->EnableWindow(m_bHoverSelect);
  395. }
  396. }
  397. void CListHdrDlg::OnMyHotCur()
  398. {
  399. m_listctrl.SetHotCursor(m_hMyHotCursor);
  400. m_bHotCursor= FALSE;
  401. }
  402. void CListHdrDlg::OnChangeSort()
  403. {
  404. long    lStyle;
  405. UpdateData(TRUE);
  406. lStyle = GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
  407. lStyle &= ~(LVS_SORTASCENDING | LVS_SORTDESCENDING);
  408. SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, lStyle);  // set style without sorting
  409. if (m_strSortMode == _T("None"))
  410. RenewListCtrl(LVS_SORTASCENDING | LVS_SORTDESCENDING, FALSE);
  411. else if (m_strSortMode == _T("ASCENDING"))
  412. RenewListCtrl(LVS_SORTASCENDING, TRUE);
  413. else
  414. {
  415. ASSERT(m_strSortMode == _T("DESCENDING"));
  416. RenewListCtrl(LVS_SORTDESCENDING, TRUE);
  417. }
  418. }
  419. void CListHdrDlg::OnWorkAreas()
  420. {
  421. UpdateData(TRUE);
  422. if(m_bWorkAreas)
  423. {
  424. CRect curRect;
  425. CSize size;
  426. size= m_listctrl.ApproximateViewRect();
  427. size.cx+= 100;
  428. size.cy+= 100;
  429. /*      Work area layout
  430. _____________________
  431. |          |         |
  432. |          |         |
  433. |   0      |    1    |
  434. |          |         |
  435. |--------------------|
  436. |          |         |
  437. |   2      |    3    |
  438. |          |         |
  439. |__________|_________|*/
  440. CRect rcWorkAreas[4];
  441. rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
  442. rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
  443. rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
  444. rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);
  445. //set work areas
  446. m_listctrl.SetWorkAreas(4, rcWorkAreas);
  447. // set insertion points for each work area
  448. CPoint  rgptWork[4];
  449. for (int i = 0; i < 4; i++)
  450. {
  451. rgptWork[i].x = rcWorkAreas[i].left + 10;
  452. rgptWork[i].y = rcWorkAreas[i].top + 10;
  453. }
  454. // now move all the items to the different quadrants
  455. for (i = 0; i < 20; i++)
  456. m_listctrl.SetItemPosition(i, rgptWork[i % 4]);
  457. }
  458. else    //delete all work areas and re-organize items
  459. {
  460. m_listctrl.SetWorkAreas(0, NULL);
  461. CPoint pt(0, 0);
  462. for (int i = 0; i < 20; i++)
  463. m_listctrl.SetItemPosition(i, pt);  // move all the items to the origin
  464. }
  465. m_listctrl.Arrange(LVA_DEFAULT); // force the control to re-arrange the shuffled items
  466. }
  467. void CListHdrDlg::OnStdHotCur()
  468. {
  469. m_listctrl.SetHotCursor(m_hStdHotCursor);
  470. m_bHotCursor= TRUE;
  471. }
  472. void CListHdrDlg::OnAbout()
  473. {
  474. CAboutDlg dlgAbout;
  475. dlgAbout.DoModal();
  476. }