HMXListBox.cpp
上传用户:yinguanfa
上传日期:2022-02-19
资源大小:400k
文件大小:9k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // HMXListBox.cpp : implementation file
  2. //
  3. /********************************************************************
  4. created: 2001/10/25
  5. file: HMXListBox
  6. author: Massimo Colurcio
  7. homepage: http://www.softhor.com/developmentarea
  8. email: m.colurcio@softhor.com
  9. purpose: new kind of CListBox class
  10. special thanks to Davide Calabro' (tooltip from BtnST)
  11. *********************************************************************/
  12. #include "stdafx.h"
  13. #include "HMXListBox.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CHMXListBox
  21. CHMXListBox::CHMXListBox()
  22. {
  23. m_bEnableEditing = true;
  24. m_clrBkGnd = GetSysColor(COLOR_WINDOW);
  25. m_clrText = GetSysColor(COLOR_WINDOWTEXT);
  26. }
  27. CHMXListBox::~CHMXListBox()
  28. {
  29. m_fntText.DeleteObject();
  30. }
  31. BEGIN_MESSAGE_MAP(CHMXListBox, CListBox)
  32. //{{AFX_MSG_MAP(CHMXListBox)
  33. ON_WM_CTLCOLOR_REFLECT()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CHMXListBox message handlers
  38. HBRUSH CHMXListBox::CtlColor(CDC* pDC, UINT nCtlColor) 
  39. {
  40. // TODO: Change any attributes of the DC here
  41. pDC->SetBkColor(m_clrBkGnd);
  42. pDC->SetTextColor(m_clrText);
  43. // TODO: Return a non-NULL brush if the parent's handler should not be called
  44. return (HBRUSH)m_brsBkGnd;
  45. }
  46. /********************************************************************
  47. created: 2001/10/25
  48. in: clr, bRedraw
  49. out: none
  50. return: always true;
  51. purpose: set background color
  52. *********************************************************************/
  53. bool CHMXListBox::SetBkClr(COLORREF clr)
  54. {
  55. m_clrBkGnd = clr;
  56. m_brsBkGnd.DeleteObject();
  57. m_brsBkGnd.CreateSolidBrush(clr);
  58. Invalidate();
  59. return true;
  60. }
  61. /********************************************************************
  62. created: 2001/10/25
  63. in: none
  64. out: clr
  65. return: always true
  66. purpose: return background color
  67. *********************************************************************/
  68. bool CHMXListBox::GetBkClr(COLORREF & clr)
  69. {
  70. clr = m_clrBkGnd;
  71. return true;
  72. }
  73. /********************************************************************
  74. created: 2001/10/25
  75. in: clr, bRedraw
  76. out: none
  77. return: always true;
  78. purpose: set Text color
  79. *********************************************************************/
  80. bool CHMXListBox::SetTextClr(COLORREF clr)
  81. {
  82. m_clrText = clr;
  83. Invalidate();
  84. return true;
  85. }
  86. /********************************************************************
  87. created: 2001/10/25
  88. in: none
  89. out: clr
  90. return: always true
  91. purpose: get text color
  92. *********************************************************************/
  93. bool CHMXListBox::GetTextClr(COLORREF & clr)
  94. {
  95. clr = m_clrText;
  96. return true;
  97. }
  98. /********************************************************************
  99. created: 2001/10/25
  100. in: nHeight, bBold, bItalic, sFaceName
  101. out: none
  102. return: always true
  103. purpose: set the font for the control
  104. *********************************************************************/
  105. bool CHMXListBox::SetTextFont( LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName )
  106. {
  107. LOGFONT lgfnt;
  108. lgfnt.lfHeight = -MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), 72);    
  109. lgfnt.lfWidth = 0; 
  110. lgfnt.lfEscapement = 0;    
  111. lgfnt.lfOrientation = 0;    
  112. lgfnt.lfWeight = bBold?FW_BOLD:FW_DONTCARE; 
  113. lgfnt.lfItalic = bItalic?TRUE:FALSE;    
  114. lgfnt.lfUnderline = FALSE;    
  115. lgfnt.lfStrikeOut = FALSE;    
  116. lgfnt.lfCharSet = DEFAULT_CHARSET; 
  117. lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS;    
  118. lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS;    
  119. lgfnt.lfQuality = DEFAULT_QUALITY; 
  120. lgfnt.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;    
  121. strcpy( lgfnt.lfFaceName, sFaceName );
  122. return SetTextFont( lgfnt );
  123. return true;
  124. }
  125. /********************************************************************
  126. created: 2001/10/25
  127. in: lgFont
  128. out: none
  129. return: always true
  130. purpose: set the font for the control
  131. *********************************************************************/
  132. bool CHMXListBox::SetTextFont( const LOGFONT& lgfnt )
  133. {
  134. m_fntText.DeleteObject();
  135. m_fntText.CreateFontIndirect( &lgfnt );
  136. SetFont( &m_fntText, TRUE );
  137. return true;
  138. }
  139. /********************************************************************
  140. created: 2001/10/25
  141. in: none
  142. out: lgFont
  143. return: always true
  144. purpose: get text font
  145. *********************************************************************/
  146. bool CHMXListBox::GetTextFont( LOGFONT* plgfnt)
  147. {
  148. GetFont()->GetObject( sizeof(LOGFONT), (void*)plgfnt);
  149. return true;
  150. }
  151. /********************************************************************
  152. created: 2001/10/25
  153. in: bEditing
  154. out: none
  155. return: always true
  156. purpose: enable / diable editing
  157. *********************************************************************/
  158. bool CHMXListBox::EnableEditing(bool bEnableEditing)
  159. {
  160. m_bEnableEditing = bEnableEditing;
  161. return true;
  162. }
  163. LRESULT CHMXListBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  164. {
  165. // TODO: Add your specialized code here and/or call the base class
  166. if( !m_bEnableEditing )
  167. if( message == WM_LBUTTONDOWN || message == WM_LBUTTONDBLCLK || 
  168. message == WM_RBUTTONDOWN || message == WM_RBUTTONDBLCLK || 
  169. message == WM_KEYDOWN )
  170. return FALSE;
  171. return CListBox::WindowProc(message, wParam, lParam);
  172. }
  173. /********************************************************************
  174. created: 2001/10/25
  175. in: bBold
  176. out: none
  177. return: always true
  178. purpose: set font bold
  179. *********************************************************************/
  180. bool CHMXListBox::SetFontBold( bool bBold )
  181. {
  182. LOGFONT lgfnt;
  183. GetTextFont( &lgfnt );
  184. lgfnt.lfWeight = bBold?FW_BOLD:FW_DONTCARE; 
  185. SetTextFont( lgfnt );
  186. return true;
  187. }
  188. /********************************************************************
  189. created: 2001/10/25
  190. in: bItalic
  191. out: none
  192. return: always true
  193. purpose: set the font italic
  194. *********************************************************************/
  195. bool CHMXListBox::SetFontItalic( bool bItalic )
  196. {
  197. LOGFONT lgfnt;
  198. GetTextFont( &lgfnt );
  199. lgfnt.lfItalic = bItalic ? TRUE : FALSE; 
  200. SetTextFont( lgfnt );
  201. return true;
  202. }
  203. /********************************************************************
  204. created: 2001/10/25
  205. in: nHeight
  206. out: none
  207. return: always true
  208. purpose: set the font height
  209. *********************************************************************/
  210. bool CHMXListBox::SetFontHeight( int nHeight )
  211. {
  212. LOGFONT lgfnt;
  213. GetTextFont( &lgfnt );
  214. lgfnt.lfHeight = -MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), 72);    
  215. lgfnt.lfWidth = 0; 
  216. SetTextFont( lgfnt );
  217. return true;
  218. }
  219. /********************************************************************
  220. created: 2001/10/25
  221. in: sFaceName
  222. out: none
  223. return: always true
  224. purpose: set the font face name
  225. *********************************************************************/
  226. bool CHMXListBox::SetFontFaceName( const CString& sFaceName )
  227. {
  228. LOGFONT lgfnt;
  229. GetTextFont( &lgfnt );
  230. strcpy( lgfnt.lfFaceName, sFaceName );
  231. SetTextFont( lgfnt );
  232. return true;
  233. }
  234. /********************************************************************
  235. created: 2001/10/25
  236. in: none
  237. out: none
  238. return: always true
  239. purpose: init tooltip
  240. *********************************************************************/
  241. bool CHMXListBox::InitToolTip()
  242. {
  243. if (m_tt.m_hWnd == NULL) {
  244. m_tt.Create(this);
  245. m_tt.Activate(true);
  246. m_tt.SendMessage(TTM_SETMAXTIPWIDTH, 0, 400);
  247. }
  248. return true;
  249. }
  250. /********************************************************************
  251. created: 2001/10/25
  252. in: sText, bActivate
  253. out: none
  254. return: always true
  255. purpose: set tooltip text
  256. *********************************************************************/
  257. bool CHMXListBox::SetToolTipText(const CString& sText, bool bActivate)
  258. {
  259. InitToolTip(); 
  260. // If there is no tooltip defined then add it
  261. if (m_tt.GetToolCount() == 0)
  262. {
  263. CRect rect; 
  264. GetClientRect(rect);
  265. m_tt.AddTool(this, sText, rect, 1);
  266. }
  267. m_tt.UpdateTipText(sText, this, 1);
  268. m_tt.Activate(bActivate);
  269. return true;
  270. }
  271. /********************************************************************
  272. created: 2001/10/25
  273. in: bActivate
  274. out: none
  275. return: always true
  276. purpose: activate/deactivate tooltip
  277. *********************************************************************/
  278. bool CHMXListBox::ActivateToolTip(bool bActivate)
  279. {
  280. if (m_tt.GetToolCount() == 0)
  281. return false;
  282. // Activate tooltip
  283. m_tt.Activate(bActivate);
  284. return true;
  285. }
  286. /********************************************************************
  287. created: 2001/10/25
  288. in: see CWnd::PretanslateMessage
  289. out: see CWnd::PretanslateMessage
  290. return: see CWnd::PretanslateMessage
  291. purpose: let tooltip works
  292. *********************************************************************/
  293. BOOL CHMXListBox::PreTranslateMessage(MSG* pMsg) 
  294. {
  295. InitToolTip();
  296. m_tt.RelayEvent(pMsg);
  297. return CListBox::PreTranslateMessage(pMsg);