ListCtrl.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:6k
源码类别:

CA认证

开发平台:

Visual C++

  1. // ListCtrl.cpp : implementation file
  2. //
  3. //可修改字段内容,可选择的列表控件
  4. #include "stdafx.h"
  5. #include "....minica.h"
  6. #include "ListCtrl.h"
  7. #include "EditCell.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define IDC_EDITCELL 1001
  14. /////////////////////////////////////////////////////////////////////////////
  15. // gxListCtrl
  16. gxListCtrl::gxListCtrl (CString Text /* = "Some Text" */)
  17. {
  18.     DefaultText = Text;
  19. }
  20. gxListCtrl::~gxListCtrl()
  21. {
  22. }
  23. BEGIN_MESSAGE_MAP(gxListCtrl, CListCtrl)
  24.     //{{AFX_MSG_MAP(gxListCtrl)
  25.     ON_WM_HSCROLL()
  26.     ON_WM_VSCROLL()
  27.     ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
  28.     ON_WM_LBUTTONDOWN()
  29. ON_WM_MOUSEWHEEL()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // gxListCtrl message handlers
  34. void 
  35. gxListCtrl::Resize (int cx, int cy)
  36. {
  37.     CRect Rect (0, 0, cx, cy);
  38.     MoveWindow (&Rect);
  39.     InvalidateRect (Rect);
  40.     SetColumnWidth (2, LVSCW_AUTOSIZE_USEHEADER);
  41. }
  42. CEdit* 
  43. gxListCtrl::EditSubItem (int Item, int Column)
  44. {
  45.     // The returned pointer should not be saved
  46.     // Make sure that the item is visible
  47.     if (!EnsureVisible (Item, TRUE)) 
  48.     {
  49. // InsertItemEx (Item);
  50. if (!EnsureVisible (Item, TRUE)) 
  51. return NULL;
  52.     }
  53.     // Make sure that nCol is valid
  54.     CHeaderCtrl* pHeader = (CHeaderCtrl*) GetDlgItem(0);
  55.     int nColumnCount = pHeader->GetItemCount();
  56.     if (Column >= nColumnCount || GetColumnWidth (Column) < 5)
  57. return NULL;
  58.     // Get the column offset
  59.     int Offset = 0;
  60.     for (int iColumn = 0; iColumn < Column; iColumn++)
  61. Offset += GetColumnWidth (iColumn);
  62.     CRect Rect;
  63.     GetItemRect (Item, &Rect, LVIR_BOUNDS);
  64.     // Now scroll if we need to expose the column
  65.     CRect ClientRect;
  66.     GetClientRect (&ClientRect);
  67.     if (Offset + Rect.left < 0 || Offset + Rect.left > ClientRect.right)
  68.     {
  69. CSize Size;
  70. if (Offset + Rect.left > 0)
  71. Size.cx = -(Offset - Rect.left);
  72. else
  73. Size.cx = Offset - Rect.left;
  74. Size.cy = 0;
  75. Scroll (Size);
  76. Rect.left -= Size.cx;
  77.     }
  78.     // Get Column alignment
  79.     LV_COLUMN lvCol;
  80.     lvCol.mask = LVCF_FMT;
  81.     GetColumn (Column, &lvCol);
  82.     DWORD dwStyle;
  83.     if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
  84. dwStyle = ES_LEFT;
  85.     else if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
  86. dwStyle = ES_RIGHT;
  87.     else dwStyle = ES_CENTER;
  88.     Rect.left += Offset+4;
  89.     Rect.right = Rect.left + GetColumnWidth (Column) - 3;
  90.     if (Rect.right > ClientRect.right)
  91. Rect.right = ClientRect.right;
  92.     dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
  93.     CEdit *pEdit = new gxEditCell (this, Item, Column, GetItemText (Item, Column));
  94.     pEdit->Create (dwStyle, Rect, this, IDC_EDITCELL);
  95.     return pEdit;
  96. }
  97. int 
  98. gxListCtrl::HitTestEx (CPoint& Point, int* pColumn)
  99. {
  100.     int ColumnNum = 0;
  101.     int Row = HitTest (Point, NULL);
  102.     
  103.     if (pColumn)
  104. *pColumn = 0;
  105.     // Make sure that the ListView is in LVS_REPORT
  106.     if ((GetWindowLong (m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT)
  107. return Row;
  108.     // Get the top and bottom row visible
  109.     Row = GetTopIndex();
  110.     int Bottom = Row + GetCountPerPage();
  111.     if (Bottom > GetItemCount())
  112.     Bottom = GetItemCount();
  113.     
  114.     // Get the number of columns
  115.     CHeaderCtrl* pHeader = (CHeaderCtrl*) GetDlgItem(0);
  116.     int nColumnCount = pHeader->GetItemCount();
  117.     // Loop through the visible rows
  118.     for(; Row <= Bottom; Row++)
  119.     {
  120. // Get bounding rect of item and check whether point falls in it.
  121. CRect Rect;
  122. GetItemRect (Row, &Rect, LVIR_BOUNDS);
  123. if (Rect.PtInRect (Point))
  124. {
  125. // Now find the column
  126. for (ColumnNum = 0; ColumnNum < nColumnCount; ColumnNum++)
  127. {
  128. int ColWidth = GetColumnWidth (ColumnNum);
  129. if (Point.x >= Rect.left && Point.x <= (Rect.left + ColWidth))
  130. {
  131. if (pColumn)
  132. *pColumn = ColumnNum;
  133. return Row;
  134. }
  135. Rect.left += ColWidth;
  136. }
  137. }
  138.     }
  139.     return -1;
  140. }
  141. BOOL hexNumberToInt (CString HexNumber, int& Number)
  142. {
  143.     char* pStopString;
  144.     Number = strtoul (HexNumber, &pStopString, 16);
  145.     return Number != ULONG_MAX;
  146. } // hexNumberToInt
  147. int gxListCtrl::InsertItemEx (int Item)
  148. {
  149.     int Result = InsertItem (Item + 1, DefaultText);
  150.     CString ItemVal, Temp;
  151.     if (Item == 0)
  152. ItemVal = "1000";
  153.     else
  154. {
  155. int HexVal;
  156. Temp = GetItemText (Item - 1, 1);
  157. hexNumberToInt (Temp, HexVal);
  158. ItemVal.Format ("%x", HexVal + 1);
  159. }
  160.     SetItemText (Item, 1, ItemVal);
  161.     SetColumnWidth (2, LVSCW_AUTOSIZE_USEHEADER);
  162.     return Result;
  163. }
  164. void gxListCtrl::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  165. {
  166.     if (GetFocus() != this) 
  167. SetFocus();
  168.     
  169.     CListCtrl::OnHScroll (nSBCode, nPos, pScrollBar);
  170. }
  171. void gxListCtrl::OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  172. {
  173.     if (GetFocus() != this) 
  174. SetFocus();
  175.     
  176.     CListCtrl::OnVScroll (nSBCode, nPos, pScrollBar);
  177. }
  178. void gxListCtrl::OnEndLabelEdit (NMHDR* pNMHDR, LRESULT* pResult) 
  179. {
  180.     LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;
  181.     LV_ITEM *plvItem = &plvDispInfo->item;
  182.     if (plvItem->pszText != NULL)
  183.     {
  184. SetItemText (plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
  185.     }
  186.     *pResult = FALSE;
  187. }
  188. void gxListCtrl::OnLButtonDown (UINT nFlags, CPoint Point) 
  189. {
  190.     CListCtrl::OnLButtonDown (nFlags, Point);
  191.     int Index;
  192.     int ColNum;
  193.     if ((Index = HitTestEx (Point, &ColNum)) != -1)
  194.     {
  195. // if (GetWindowLong (m_hWnd, GWL_STYLE) & LVS_EDITLABELS && ColNum == 1)
  196. if(ColNum == 1)
  197. EditSubItem (Index, ColNum);
  198.     }
  199. }
  200. BOOL gxListCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  201. {
  202. // TODO: Add your message handler code here and/or call default
  203.     if (GetFocus() != this) 
  204. SetFocus();
  205. return CListCtrl::OnMouseWheel(nFlags, zDelta, pt);
  206. }