TLabelEdit.cpp
上传用户:cnjubao
上传日期:2007-01-02
资源大小:34k
文件大小:8k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 8/23/98 19:32:46
  5.   Comments: TLabelEdit.cpp : implementation file
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "TLabelEdit.h"
  9. #include "TLabelList.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. // Name of the window class
  16. #define wndClassName _T("TLabelEdit")
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CTLabelEdit
  19. // Function name : WindowProcEdit
  20. // Description     : With this, edit control can beremoved from this
  21. // Return type : LRESULT CALLBACK 
  22. // Argument         : HWND hwnd
  23. // Argument         : UINT uMsg
  24. // Argument         : WPARAM wParam
  25. // Argument         : LPARAM lParam
  26. LRESULT CALLBACK WindowProcEdit(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  27. {
  28. switch (uMsg)
  29. {
  30. case WM_KILLFOCUS:
  31. {
  32. if (CTLabelEdit* pLabel = (CTLabelEdit*)GetWindowLong(hwnd, GWL_USERDATA))
  33. pLabel->HideEdit();
  34. }
  35. return 0;
  36. }
  37. return  CallWindowProc(CTLabelEdit::m_wndEditDefaultWndProc, hwnd,uMsg,wParam,lParam);
  38. }
  39. WNDPROC CTLabelEdit::m_wndEditDefaultWndProc = NULL;
  40. CWnd* CTLabelEdit::m_pWndEdit = NULL;
  41. // Function name : CTLabelEdit::CTLabelEdit
  42. // Description     : Default constructor
  43. // Return type : 
  44. // Argument         : LPCTSTR pDefaultText
  45. CTLabelEdit::CTLabelEdit(LPCTSTR pDefaultText):m_sDefaultString(pDefaultText)
  46. {
  47. RegClassLabelEdit();
  48. }
  49. // Function name : CTLabelEdit::~CTLabelEdit
  50. // Description     : virtual destructor
  51. // Return type : 
  52. CTLabelEdit::~CTLabelEdit()
  53. {
  54. if (m_pWndEdit && IsEditDestroyable()) delete m_pWndEdit;
  55. m_pWndEdit = NULL;
  56. }
  57. BEGIN_MESSAGE_MAP(CTLabelEdit, CWnd)
  58. //{{AFX_MSG_MAP(CTLabelEdit)
  59. ON_WM_LBUTTONDOWN()
  60. ON_WM_SETFOCUS()
  61. ON_WM_CTLCOLOR()
  62. //}}AFX_MSG_MAP
  63. END_MESSAGE_MAP()
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CTLabelEdit message handlers
  66. // Function name : CTLabelEdit::RegClassLabelEdit
  67. // Description     : Call this function to register a new class window
  68. // Return type : BOOL 
  69. BOOL CTLabelEdit::RegClassLabelEdit()
  70. {
  71. WNDCLASS wndClass;
  72. wndClass.style = CS_DBLCLKS;
  73. wndClass.lpfnWndProc = ::DefWindowProc;
  74. wndClass.cbClsExtra = NULL;
  75. wndClass.cbWndExtra = NULL;
  76. wndClass.hInstance = AfxGetInstanceHandle();
  77. wndClass.hIcon = NULL;
  78. wndClass.hCursor = NULL;
  79. wndClass.hbrBackground = NULL;
  80. wndClass.lpszMenuName = NULL;
  81. wndClass.lpszClassName = wndClassName;
  82. return AfxRegisterClass(&wndClass);
  83. }
  84. // Function name : CTLabelEdit::PreSubclassWindow
  85. // Description     : To work this control, must be subclassed
  86. // Return type : void 
  87. void CTLabelEdit::PreSubclassWindow() 
  88. {
  89. ASSERT (GetParent() != NULL);
  90. CWnd::PreSubclassWindow();
  91. CRect rect; GetClientRect(rect);
  92. if (m_wndStatic.Create(_T(""), WS_VISIBLE | WS_CHILD | SS_CENTERIMAGE | SS_LEFT , rect, this))
  93. m_wndStatic.SetFont(GetParent()->GetFont());
  94. CString sCaption;
  95. GetWindowText(sCaption);
  96. SetText(sCaption);
  97. }
  98. // Function name : CTLabelEdit::OnLButtonDown
  99. // Description     : Because this control is in fact a stati control, this do not have a focus never. I forced this
  100. // Return type : void 
  101. // Argument         : UINT nFlags
  102. // Argument         : CPoint point
  103. void CTLabelEdit::OnLButtonDown(UINT nFlags, CPoint point) 
  104. {
  105. SetFocus();
  106. CWnd::OnLButtonDown(nFlags, point);
  107. }
  108. // Function name : CTLabelEdit::OnSetFocus
  109. // Description     : When control is focussed then edit will take the control. No?:)
  110. // Return type : void 
  111. // Argument         : CWnd* pOldWnd
  112. void CTLabelEdit::OnSetFocus(CWnd* pOldWnd) 
  113. {
  114. CWnd::OnSetFocus(pOldWnd);
  115. ShowEdit();
  116. }
  117. // Function name : CTLabelEdit::SetText
  118. // Description     : Put the text
  119. // Return type : void 
  120. // Argument         : LPCSTR lpszCaption
  121. void CTLabelEdit::SetText(LPCSTR lpszCaption)
  122. {
  123. CString sCaption(lpszCaption);
  124. m_wndStatic.SetWindowText(sCaption.IsEmpty() ? (LPCTSTR)m_sDefaultString : lpszCaption);
  125. }
  126. // Function name : CTLabelEdit::GetText
  127. // Description     : Return the text from this
  128. // Return type : CString 
  129. CString CTLabelEdit::GetText()
  130. {
  131. CString sCaption;
  132. m_wndStatic.GetWindowText(sCaption);
  133. sCaption = sCaption == m_sDefaultString ? _T("") : sCaption;
  134. return sCaption;
  135. }
  136. // Function name : CTLabelEdit::OnCtlColor
  137. // Description     : Put a decent color in edit mode!
  138. // Return type : HBRUSH 
  139. // Argument         : CDC* pDC
  140. // Argument         : CWnd* pWnd
  141. // Argument         : UINT nCtlColor
  142. HBRUSH CTLabelEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  143. {
  144. HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor);
  145. pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHT));
  146. // TODO: Return a different brush if the default is not desired
  147. return hbr;
  148. }
  149. // Function name : CTLabelEdit::IsEditDestroyable
  150. // Description     : This function retunr TRUE because in HideEdit the edit control have to be destroyed
  151. // Return type : BOOL 
  152. BOOL CTLabelEdit::IsEditDestroyable()
  153. {
  154. return TRUE;
  155. }
  156. // Function name : CTLabelEdit::ShowEdit
  157. // Description     : Create the edit control to allow editing in label control/
  158. // Return type : void 
  159. void CTLabelEdit::ShowEdit()
  160. {
  161. CRect rect; GetClientRect(rect);
  162. if (m_pWndEdit) HideEdit();
  163. m_pWndEdit = new CEdit();
  164. m_pWndEdit->CreateEx(WS_EX_CLIENTEDGE, _T("Edit"),NULL, WS_CHILD | ES_NOHIDESEL | ES_LEFT | ES_AUTOHSCROLL , rect.left, rect.top, rect.Width(), rect.Height(), m_hWnd, NULL);
  165. ASSERT (m_pWndEdit && ::IsWindow(m_pWndEdit->m_hWnd));
  166. m_pWndEdit->SetFont(GetParent()->GetFont());
  167. CString sCaption;
  168. m_wndStatic.GetWindowText(sCaption);
  169. m_pWndEdit->SetWindowText(sCaption);
  170. m_pWndEdit->ShowWindow(SW_SHOW);
  171. m_wndStatic.ShowWindow(SW_HIDE);
  172. ((CEdit*)m_pWndEdit)->SetSel(MAKELONG(0,-1));
  173. m_wndEditDefaultWndProc = (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)WindowProcEdit);
  174. CWnd* pWnd = (CWnd*)m_pWndEdit;
  175. SetWindowLong(pWnd->m_hWnd, GWL_USERDATA, (long)this);
  176. pWnd->SetWindowPos(0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_SHOWWINDOW);
  177. pWnd->SetFocus();
  178. }
  179. // Function name : CTLabelEdit::HideEdit
  180. // Description     : Hide or destroy the edit control. If edit is destroyable...
  181. // Return type : void 
  182. void CTLabelEdit::HideEdit()
  183. {
  184. if (::IsWindow(m_hWnd))
  185. if (m_pWndEdit && m_wndEditDefaultWndProc)
  186. if (::IsWindow(m_pWndEdit->m_hWnd))
  187. {
  188. (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)m_wndEditDefaultWndProc);
  189. m_wndEditDefaultWndProc = NULL;
  190. CString sCaption;
  191. m_pWndEdit->GetWindowText(sCaption);
  192. SetText(sCaption);
  193. if (IsEditDestroyable())
  194. {
  195. // Do not call DestroyWindow because, you have created m_pWndEdit with CreateE API function. OK?!
  196. ::DestroyWindow(m_pWndEdit->m_hWnd);
  197. delete m_pWndEdit;
  198. }
  199. else
  200. {
  201. CTLabelList* pList = (CTLabelList*)this;
  202. pList->ShowWindow(SW_SHOW);
  203. pList->GetWindowControl()->ShowWindow(SW_HIDE);
  204. }
  205. m_pWndEdit = NULL;
  206. CWnd* pWnd = (CWnd*)&m_wndStatic;
  207. pWnd->ShowWindow(SW_SHOW);
  208. pWnd->SetWindowPos(0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_SHOWWINDOW);
  209. }
  210. }
  211. // Function name : CTLabelList::ShowEdit
  212. // Description     : Show the list control in case CLabelList
  213. // Return type : void 
  214. void CTLabelList::ShowEdit()
  215. {
  216. CRect rect; GetClientRect(rect);
  217. CWnd* pWnd = GetWindowControl();
  218. if (m_pWndEdit)
  219. HideEdit();
  220. pWnd->ShowWindow(SW_SHOW);
  221. m_wndStatic.ShowWindow(SW_HIDE);
  222. // For draw
  223. pWnd->SetWindowPos(&CWnd::wndBottom,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
  224. pWnd->SetFocus();
  225. m_pWndEdit = GetEditControl();
  226. ASSERT (m_pWndEdit != NULL);
  227. SetWindowLong(m_pWndEdit->m_hWnd, GWL_USERDATA, (long)this);
  228. m_wndEditDefaultWndProc = (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)WindowProcEdit);
  229. ShowWindow(SW_HIDE); // for relay LButtonDown to this control...see wndBottom
  230. }