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

CA认证

开发平台:

Visual C++

  1. // EditCell.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "....minica.h"
  5. #include "ListCtrl.h"
  6. #include "EditCell.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // gxEditCell
  14. gxEditCell::gxEditCell (gxListCtrl* pCtrl, int iItem, int iSubItem, CString sInitText)
  15. :   bEscape (FALSE)
  16. {
  17.     pListCtrl = pCtrl;
  18.     Item = iItem;
  19.     SubItem = iSubItem;
  20.     InitText = sInitText;
  21. }
  22. gxEditCell::~gxEditCell()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(gxEditCell, CEdit)
  26.     //{{AFX_MSG_MAP(gxEditCell)
  27.     ON_WM_KILLFOCUS()
  28.     ON_WM_NCDESTROY()
  29.     ON_WM_CHAR()
  30.     ON_WM_CREATE()
  31.     ON_WM_GETDLGCODE()
  32. ON_WM_KEYUP()
  33. ON_WM_KEYDOWN()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // gxEditCell message handlers
  38. void 
  39. gxEditCell::SetListText()
  40. {
  41.     CString Text;
  42.     GetWindowText (Text);
  43.     // Send Notification to parent of ListView ctrl
  44.     LV_DISPINFO dispinfo;
  45.     dispinfo.hdr.hwndFrom = GetParent()->m_hWnd;
  46.     dispinfo.hdr.idFrom = GetDlgCtrlID();
  47.     dispinfo.hdr.code = LVN_ENDLABELEDIT;
  48.     dispinfo.item.mask = LVIF_TEXT;
  49.     dispinfo.item.iItem = Item;
  50.     dispinfo.item.iSubItem = SubItem;
  51.     dispinfo.item.pszText = bEscape ? NULL : LPTSTR ((LPCTSTR) Text);
  52.     dispinfo.item.cchTextMax = Text.GetLength();
  53.     GetParent()->GetParent()->SendMessage (WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM) &dispinfo);
  54. }
  55. BOOL 
  56. gxEditCell::PreTranslateMessage (MSG* pMsg) 
  57. {
  58.     if (pMsg->message == WM_KEYDOWN)
  59.     {
  60.     if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_DELETE || 
  61. pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_TAB || 
  62. pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || GetKeyState (VK_CONTROL))
  63. {
  64. ::TranslateMessage (pMsg);
  65. ::DispatchMessage (pMsg);
  66. return TRUE;      // DO NOT process further
  67. }
  68.     }
  69.     return CEdit::PreTranslateMessage (pMsg);
  70. }
  71. void 
  72. gxEditCell::OnKillFocus (CWnd* pNewWnd) 
  73. {
  74.     CEdit::OnKillFocus(pNewWnd);
  75.     SetListText();
  76.     DestroyWindow();
  77. }
  78. void 
  79. gxEditCell::OnNcDestroy() 
  80. {
  81.     CEdit::OnNcDestroy();
  82.     
  83.     delete this;
  84. }
  85. void 
  86. gxEditCell::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags) 
  87. {
  88.     // Up and down are in the OnKeyDown so that the user can hold down the arrow
  89.     // keys to scroll through the entries.
  90.     BOOL Control = GetKeyState (VK_CONTROL) < 0;
  91.     switch (nChar)
  92.     {
  93. case VK_UP :
  94. {
  95. if (Item > 0)
  96. pListCtrl->EditSubItem (Item - 1, SubItem);
  97. return;
  98. }
  99. case VK_DOWN :
  100. {
  101. pListCtrl->EditSubItem (Item + 1, SubItem);
  102. return;
  103. }
  104. case VK_HOME :
  105. {
  106. if (!Control)
  107. break;
  108. pListCtrl->EditSubItem (0, SubItem);
  109. return;
  110. }
  111. case VK_END :
  112. {
  113. if (!Control)
  114. break;
  115. int Count = pListCtrl->GetItemCount() - 1;
  116. pListCtrl->EditSubItem (Count, SubItem);
  117. return;
  118. }
  119.     }
  120.     
  121.     CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  122. }
  123. void 
  124. gxEditCell::OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags) 
  125. {
  126.     switch (nChar)
  127.     {
  128. case VK_NEXT :
  129. {
  130. int Count = pListCtrl->GetItemCount();
  131. int NewItem = Item + pListCtrl->GetCountPerPage();
  132. if (Count > NewItem)
  133. pListCtrl->EditSubItem (NewItem, SubItem);
  134. else
  135. pListCtrl->EditSubItem (Count - 1, SubItem);
  136. return;
  137. }
  138. case VK_PRIOR :
  139. {
  140. int NewItem = Item - pListCtrl->GetCountPerPage();
  141. if (NewItem > 0)
  142. pListCtrl->EditSubItem (NewItem, SubItem);
  143. else
  144. pListCtrl->EditSubItem (0, SubItem);
  145. return;
  146. }
  147.     }
  148.     
  149.     CEdit::OnKeyUp (nChar, nRepCnt, nFlags);
  150. }
  151. void 
  152. gxEditCell::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
  153. {
  154.     BOOL Shift = GetKeyState (VK_SHIFT) < 0;
  155.     switch (nChar)
  156.     {
  157. case VK_ESCAPE :
  158. {
  159. if (nChar == VK_ESCAPE)
  160. bEscape = TRUE;
  161. GetParent()->SetFocus();
  162. return;
  163. }
  164. case VK_RETURN :
  165. {
  166. SetListText();
  167. //光标跳到下一单元
  168. pListCtrl->EditSubItem (Item + 1, 1);
  169. return;
  170. }
  171. case VK_TAB :
  172. {
  173. if (Shift)
  174. {
  175. if (SubItem > 0)
  176. pListCtrl->EditSubItem (Item, SubItem - 1);
  177. else
  178. {
  179. if (Item > 0)
  180. pListCtrl->EditSubItem (Item - 1, 2);
  181. }
  182. }
  183. else
  184. {
  185. if (SubItem < 2)
  186. pListCtrl->EditSubItem (Item, SubItem + 1);
  187. else
  188. pListCtrl->EditSubItem (Item + 1, 0);
  189. }
  190. return;
  191. }
  192.     }
  193.     CEdit::OnChar (nChar, nRepCnt, nFlags);
  194.     // Resize edit control if needed
  195.     // Get text extent
  196.     CString Text;
  197.     GetWindowText (Text);
  198.     CWindowDC DC (this);
  199.     CFont *pFont = GetParent()->GetFont();
  200.     CFont *pFontDC = DC.SelectObject (pFont);
  201.     CSize Size = DC.GetTextExtent (Text);
  202.     DC.SelectObject (pFontDC);
  203.     Size.cx += 5;     // add some extra buffer
  204.     // Get client rect
  205.     CRect Rect, ParentRect;
  206.     GetClientRect (&Rect);
  207.     GetParent()->GetClientRect (&ParentRect);
  208.     // Transform rect to parent coordinates
  209.     ClientToScreen (&Rect);
  210.     GetParent()->ScreenToClient (&Rect);
  211.     // Check whether control needs to be resized and whether there is space to grow
  212.     if (Size.cx > Rect.Width())
  213.     {
  214. if (Size.cx + Rect.left < ParentRect.right )
  215. Rect.right = Rect.left + Size.cx;
  216. else
  217. Rect.right = ParentRect.right;
  218. MoveWindow (&Rect);
  219.     }
  220. }
  221. int 
  222. gxEditCell::OnCreate (LPCREATESTRUCT lpCreateStruct) 
  223. {
  224.     if (CEdit::OnCreate (lpCreateStruct) == -1)
  225. return -1;
  226.     // Set the proper font
  227.     CFont* Font = GetParent()->GetFont();
  228.     SetFont (Font);
  229.     SetWindowText (InitText);
  230.     SetFocus();
  231.     SetSel (0, -1);
  232.     return 0;
  233. }
  234. UINT 
  235. gxEditCell::OnGetDlgCode() 
  236. {
  237.     return CEdit::OnGetDlgCode() | DLGC_WANTARROWS | DLGC_WANTTAB;
  238. }