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

ActiveX/DCOM/ATL

开发平台:

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. CBrush CTLabelEdit::m_brBkGnd(GetSysColor(COLOR_APPWORKSPACE));
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CTLabelEdit
  20. // Function name : WindowProcEdit
  21. // Description     : With this, edit control can beremoved from this
  22. // Return type : LRESULT CALLBACK 
  23. // Argument         : HWND hwnd
  24. // Argument         : UINT uMsg
  25. // Argument         : WPARAM wParam
  26. // Argument         : LPARAM lParam
  27. LRESULT CALLBACK WindowProcEdit(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  28. {
  29. switch (uMsg)
  30. {
  31. case WM_KILLFOCUS:
  32. {
  33. if (CTLabelEdit* pLabel = (CTLabelEdit*)GetWindowLong(hwnd, GWL_USERDATA))
  34. pLabel->HideEdit();
  35. }
  36. return 0;
  37. }
  38. return  CallWindowProc(CTLabelEdit::m_wndEditDefaultWndProc, hwnd,uMsg,wParam,lParam);
  39. }
  40. WNDPROC CTLabelEdit::m_wndEditDefaultWndProc = NULL;
  41. CWnd* CTLabelEdit::m_pWndEdit = NULL;
  42. // Function name : CTLabelEdit::CTLabelEdit
  43. // Description     : Default constructor
  44. // Return type : 
  45. // Argument         : LPCTSTR pDefaultText
  46. CTLabelEdit::CTLabelEdit(LPCTSTR pDefaultText):m_sDefaultString(pDefaultText)
  47. {
  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. ON_WM_PAINT()
  63. //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CTLabelEdit message handlers
  67. // Function name : CTLabelEdit::RegClassLabelEdit
  68. // Description     : Call this function to register a new class window
  69. // Return type : BOOL 
  70. BOOL CTLabelEdit::RegClassLabelEdit()
  71. {
  72. WNDCLASS wndClass;
  73. wndClass.style = CS_DBLCLKS;
  74. wndClass.lpfnWndProc = ::DefWindowProc;
  75. wndClass.cbClsExtra = NULL;
  76. wndClass.cbWndExtra = NULL;
  77. wndClass.hInstance = AfxGetInstanceHandle();
  78. wndClass.hIcon = NULL;
  79. wndClass.hCursor = NULL;
  80. wndClass.hbrBackground = (HBRUSH)m_brBkGnd;
  81. wndClass.lpszMenuName = NULL;
  82. wndClass.lpszClassName = wndClassName;
  83. return AfxRegisterClass(&wndClass);
  84. }
  85. // Function name : CTLabelEdit::PreSubclassWindow
  86. // Description     : To work this control, must be subclassed
  87. // Return type : void 
  88. void CTLabelEdit::PreSubclassWindow() 
  89. {
  90. CWnd::PreSubclassWindow();
  91. }
  92. // Function name : CTLabelEdit::OnLButtonDown
  93. // Description     : Because this control is in fact a stati control, this do not have a focus never. I forced this
  94. // Return type : void 
  95. // Argument         : UINT nFlags
  96. // Argument         : CPoint point
  97. void CTLabelEdit::OnLButtonDown(UINT nFlags, CPoint point) 
  98. {
  99. SetFocus();
  100. CWnd::OnLButtonDown(nFlags, point);
  101. }
  102. // Function name : CTLabelEdit::OnSetFocus
  103. // Description     : When control is focussed then edit will take the control. No?:)
  104. // Return type : void 
  105. // Argument         : CWnd* pOldWnd
  106. void CTLabelEdit::OnSetFocus(CWnd* pOldWnd) 
  107. {
  108. CWnd::OnSetFocus(pOldWnd);
  109. ShowEdit();
  110. }
  111. // Function name : CTLabelEdit::SetText
  112. // Description     : Put the text
  113. // Return type : void 
  114. // Argument         : LPCSTR lpszCaption
  115. void CTLabelEdit::SetText(LPCSTR lpszCaption)
  116. {
  117. CString sCaption(lpszCaption);
  118. SetWindowText(sCaption.IsEmpty() ? (LPCTSTR)m_sDefaultString : lpszCaption);
  119. }
  120. // Function name : CTLabelEdit::GetText
  121. // Description     : Return the text from this
  122. // Return type : CString 
  123. CString CTLabelEdit::GetText()
  124. {
  125. CString sCaption;
  126. GetWindowText(sCaption);
  127. sCaption = sCaption == m_sDefaultString ? _T("") : sCaption;
  128. return sCaption;
  129. }
  130. // Function name : CTLabelEdit::OnCtlColor
  131. // Description     : Put a decent color in edit mode!
  132. // Return type : HBRUSH 
  133. // Argument         : CDC* pDC
  134. // Argument         : CWnd* pWnd
  135. // Argument         : UINT nCtlColor
  136. HBRUSH CTLabelEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  137. {
  138. HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor);
  139. pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHT));
  140. // TODO: Return a different brush if the default is not desired
  141. return hbr;
  142. }
  143. // Function name : CTLabelEdit::IsEditDestroyable
  144. // Description     : This function retunr TRUE because in HideEdit the edit control have to be destroyed
  145. // Return type : BOOL 
  146. BOOL CTLabelEdit::IsEditDestroyable()
  147. {
  148. return TRUE;
  149. }
  150. // Function name : CTLabelEdit::ShowEdit
  151. // Description     : Create the edit control to allow editing in label control/
  152. // Return type : void 
  153. void CTLabelEdit::ShowEdit()
  154. {
  155. CRect rect; GetClientRect(rect);
  156. if (m_pWndEdit) HideEdit();
  157. m_pWndEdit = new CEdit();
  158. 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);
  159. ASSERT (m_pWndEdit && ::IsWindow(m_pWndEdit->m_hWnd));
  160. m_pWndEdit->SetFont(GetParent()->GetFont());
  161. CString sCaption;
  162. GetWindowText(sCaption);
  163. m_pWndEdit->SetWindowText(sCaption);
  164. m_pWndEdit->ShowWindow(SW_SHOW);
  165. ((CEdit*)m_pWndEdit)->SetSel(MAKELONG(0,-1));
  166. m_wndEditDefaultWndProc = (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)WindowProcEdit);
  167. CWnd* pWnd = (CWnd*)m_pWndEdit;
  168. SetWindowLong(pWnd->m_hWnd, GWL_USERDATA, (long)this);
  169. pWnd->SetWindowPos(0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_SHOWWINDOW);
  170. pWnd->SetFocus();
  171. }
  172. // Function name : CTLabelEdit::HideEdit
  173. // Description     : Hide or destroy the edit control. If edit is destroyable...
  174. // Return type : void 
  175. void CTLabelEdit::HideEdit()
  176. {
  177. if (::IsWindow(m_hWnd))
  178. if (m_pWndEdit && m_wndEditDefaultWndProc)
  179. if (::IsWindow(m_pWndEdit->m_hWnd))
  180. {
  181. (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)m_wndEditDefaultWndProc);
  182. m_wndEditDefaultWndProc = NULL;
  183. CString sCaption;
  184. m_pWndEdit->GetWindowText(sCaption);
  185. SetText(sCaption);
  186. if (IsEditDestroyable())
  187. {
  188. // Do not call DestroyWindow because, you have created m_pWndEdit with CreateE API function. OK?!
  189. ::DestroyWindow(m_pWndEdit->m_hWnd);
  190. delete m_pWndEdit;
  191. }
  192. else
  193. {
  194. CTLabelList* pList = (CTLabelList*)this;
  195. pList->ShowWindow(SW_SHOW);
  196. pList->GetWindowControl()->ShowWindow(SW_HIDE);
  197. }
  198. m_pWndEdit = NULL;
  199. }
  200. }
  201. // Function name : CTLabelList::ShowEdit
  202. // Description     : Show the list control in case CLabelList
  203. // Return type : void 
  204. void CTLabelList::ShowEdit()
  205. {
  206. CRect rect; GetClientRect(rect);
  207. CWnd* pWnd = GetWindowControl();
  208. if (m_pWndEdit)
  209. HideEdit();
  210. pWnd->ShowWindow(SW_SHOW);
  211. // For draw
  212. pWnd->SetWindowPos(&CWnd::wndBottom,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
  213. pWnd->SetFocus();
  214. m_pWndEdit = GetEditControl();
  215. ASSERT (m_pWndEdit != NULL);
  216. SetWindowLong(m_pWndEdit->m_hWnd, GWL_USERDATA, (long)this);
  217. m_wndEditDefaultWndProc = (WNDPROC)SetWindowLong(m_pWndEdit->m_hWnd, GWL_WNDPROC, (long)WindowProcEdit);
  218. ShowWindow(SW_HIDE); // for relay LButtonDown to this control...see wndBottom
  219. }
  220. // Function name : CTLabelEdit::Init
  221. // Description     : 
  222. // Return type : void 
  223. void CTLabelEdit::Init()
  224. {
  225. ASSERT (GetParent() != NULL);
  226. CRect rect; GetClientRect(rect);
  227. CString sCaption;
  228. GetWindowText(sCaption);
  229. SetText(sCaption);
  230. }
  231. // Function name : CTLabelEdit::OnPaint
  232. // Description     : OnDraw function...
  233. // Return type : void 
  234. void CTLabelEdit::OnPaint() 
  235. {
  236. CPaintDC dc(this); // device context for painting
  237. CRect rect; GetClientRect(rect);
  238. dc.DrawEdge(rect, EDGE_RAISED, BF_RECT);
  239. CString sCaption; GetWindowText(sCaption);
  240. dc.SetBkMode(TRANSPARENT);
  241. CFont* pFont = dc.SelectObject(&m_font);
  242. dc.DrawText(sCaption, rect, DT_CENTER | DT_VCENTER| DT_SINGLELINE);
  243. dc.SelectObject(pFont);
  244. }
  245. // Function name : CTLabelEdit::WindowProc
  246. // Description     : default window procedure
  247. // Return type : LRESULT 
  248. // Argument         : UINT message
  249. // Argument         : WPARAM wParam
  250. // Argument         : LPARAM lParam
  251. LRESULT CTLabelEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  252. {
  253. switch (message)
  254. {
  255. case WM_SETFONT:
  256. if (CFont* pFont = CFont::FromHandle((HFONT)wParam))
  257. {
  258. LOGFONT logFont;
  259. pFont->GetLogFont(&logFont);
  260. m_font.DeleteObject();
  261. m_font.CreateFontIndirect((const LOGFONT*)&logFont);
  262. Invalidate();
  263. break;
  264. }
  265. case WM_SETTEXT:
  266. {
  267. Invalidate();
  268. break;
  269. }
  270. }
  271. return CWnd::WindowProc(message, wParam, lParam);
  272. }