CoolListBox.cpp
上传用户:czfddz
上传日期:2013-03-20
资源大小:1517k
文件大小:7k
源码类别:

酒店行业

开发平台:

C/C++

  1. /*####################################################################
  2. Filename:  coollistbox.cpp
  3. ----------------------------------------------------
  4. Remarks: ...
  5. ----------------------------------------------------
  6.   ####################################################################*/
  7. #include "stdafx.h"
  8. #include "resource.h"
  9. #include "CoolListBox.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #include "CoolTabCtrl.h"
  16. /*####################################################################
  17. ------------------------------------------------
  18.   CListBoxItem class
  19. ------------------------------------------------
  20.   ####################################################################*/
  21. CListBoxItem::CListBoxItem(int nIndex, int nImage, CString strText, CCoolListBox *parent)
  22. {
  23. m_nIndex = nIndex;
  24. m_nImage = nImage;
  25. m_strText = strText;
  26. m_parent  = parent;
  27. ID = 0;
  28. }
  29. void CListBoxItem::SetTipText(LPCTSTR strTipText)
  30. {
  31. m_strTipText = strTipText;
  32. }
  33. /*########################################################################
  34.   ------------------------------------------------
  35.    class CCoolListBox
  36.   ------------------------------------------------
  37.   ########################################################################*/
  38. CCoolListBox::CCoolListBox()
  39. {
  40. m_nHotItem  = - 1;
  41. }
  42. CCoolListBox::~CCoolListBox()
  43. {
  44. while(!m_aItems.IsEmpty())
  45. {
  46. CListBoxItem* pItem = m_aItems.RemoveHead();
  47. delete pItem;
  48. pItem = NULL;
  49. }
  50. }
  51. BOOL CCoolListBox::Create(DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID)
  52. {
  53. // Make sure that the control is owner drawn.
  54. dwStyle |= LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT;
  55. if (!CListBox::Create(dwStyle, rect, pParentWnd, nID))
  56. {
  57. return FALSE;
  58. }
  59. // Set the font used by the bar.
  60. SetFont(CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)));
  61. return TRUE;
  62. }
  63. /*########################################################################
  64.   -------------------------------------
  65.    CCoolListBox message handlers
  66.   -------------------------------------
  67.   ########################################################################*/
  68. BEGIN_MESSAGE_MAP(CCoolListBox, CListBox)
  69. //{{AFX_MSG_MAP(CCoolListBox)
  70. ON_WM_MEASUREITEM_REFLECT()
  71. ON_WM_DRAWITEM_REFLECT()
  72. ON_WM_LBUTTONDOWN()
  73. ON_WM_LBUTTONUP()
  74. ON_WM_MOUSEMOVE()
  75. ON_WM_TIMER()
  76. ON_WM_CREATE()
  77. ON_WM_SIZE()
  78. ON_BN_CLICKED(IDC_UPBUTTON, OnUpButton)
  79. ON_BN_CLICKED(IDC_DOWNBUTTON, OnDownButton)
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. int CCoolListBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  83. {
  84. if (CListBox::OnCreate(lpCreateStruct) == -1)
  85. return -1;
  86. m_wndTipctrl.Create(CSize(100,100),this,TIPS_AUTOSIZE | TIPS_TRANSPARENT);
  87. m_wndUpButton.Create("", WS_VISIBLE | WS_CHILD, CRect(0, 0, 0, 0), this, IDC_UPBUTTON);
  88. m_wndDownButton.Create("", WS_VISIBLE | WS_CHILD, CRect(0, 0, 0, 0), this, IDC_DOWNBUTTON);
  89. return 0;
  90. }
  91. void CCoolListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  92. {
  93. lpMeasureItemStruct->itemHeight = 48;
  94. }
  95. void CCoolListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
  96. {
  97. CListBoxItem* pItem = (CListBoxItem*)lpDIS->itemData;
  98. if (pItem == NULL) return;
  99.     CDC*  pDC    = CDC::FromHandle(lpDIS->hDC);
  100. CRect rcItem = lpDIS->rcItem;
  101. pDC->SetBkMode(TRANSPARENT);
  102. CPoint ptIcon;
  103. ptIcon.x = (rcItem.Width() - 32) / 2;
  104. ptIcon.y = rcItem.top + 2;
  105. // pDC->FillSolidRect(rcItem, RGB(255, 255, 255));
  106. m_imagelist.Draw(pDC, pItem->m_nImage, ptIcon, 0);
  107. CRect rcText(rcItem);
  108. rcText.top += 34;
  109. if ((m_nHotItem == lpDIS->itemID) && m_bHilight)
  110. {
  111. pDC->SetTextColor(RGB(0, 0, 255));
  112. }
  113. else
  114. {
  115. pDC->SetTextColor(RGB(0, 0, 0));
  116. }
  117. pDC->DrawText(pItem->m_strText, rcText, DT_CENTER | DT_SINGLELINE);
  118. }
  119. void CCoolListBox::OnLButtonDown(UINT nFlags, CPoint point) 
  120. {
  121. CListBox::OnLButtonDown(nFlags, point);
  122. int nIndex = GetCurSel();
  123. if (nIndex != -1)
  124. {
  125. CListBoxItem *pItem = (CListBoxItem*)GetItemData(nIndex);
  126. if (pItem != NULL)
  127. {
  128. AfxGetMainWnd()->SendMessage(WM_COMMAND, pItem->ID, 0);
  129. }
  130. else
  131. {
  132. AfxMessageBox("No Message");
  133. }
  134. }
  135. }
  136. void CCoolListBox::OnLButtonUp(UINT nFlags, CPoint point) 
  137. {
  138. m_bLBDown = false;
  139. int nIndex = GetCurSel();
  140.     SetCurSel(nIndex);
  141. CListBox::OnLButtonUp(nFlags, point);
  142. }
  143. void CCoolListBox::OnMouseMove(UINT nFlags, CPoint point) 
  144. {
  145. m_point = point;
  146. SetTimer (1, 10, NULL);
  147. CListBox::OnMouseMove(nFlags, point);
  148. }
  149. void CCoolListBox::OnUpButton()
  150. {
  151. if (GetTopIndex() > 0)
  152. {
  153. SetTopIndex(GetTopIndex() - 1);
  154. ReLocation();
  155. Invalidate();
  156. }
  157. }
  158. void CCoolListBox::OnDownButton()
  159. {
  160. if (GetTopIndex() < this->GetCount() - 1)
  161. {
  162. SetTopIndex(GetTopIndex() + 1);
  163. ReLocation();
  164. Invalidate();
  165. return;
  166. }
  167. }
  168. void CCoolListBox::OnSize(UINT nType, int cx, int cy)
  169. {
  170. ReLocation();
  171. }
  172. void CCoolListBox::OnTimer(UINT nIDEvent) 
  173. {  
  174. if (nIDEvent == 1)
  175. {
  176. CRect rcWindow;
  177. GetWindowRect (rcWindow);
  178. CPoint point;
  179. GetCursorPos (&point);
  180. if (rcWindow.PtInRect(point)) 
  181. {
  182. m_bHilight = true;
  183. BOOL bOutSide;
  184. int nIndex = ItemFromPoint(m_point, bOutSide);
  185. if (nIndex != m_nHotItem && !bOutSide) 
  186. {
  187. //SetCurSel(nIndex);
  188. CRect rect;
  189. GetItemRect(m_nHotItem, &rect);
  190. InvalidateRect(&rect);
  191. m_nHotItem = nIndex;
  192. GetItemRect(nIndex, &rect);
  193. InvalidateRect(&rect);
  194. ClientToScreen(&rect);
  195. m_wndTipctrl.SetRect(rect);
  196. CListBoxItem* pItem = GetItem(nIndex);
  197. if (pItem != NULL)
  198. {
  199. m_wndTipctrl.SetText(pItem->m_strTipText);
  200. m_wndTipctrl.SetTitle(pItem->m_strText);
  201. m_wndTipctrl.SetDelayTime(15);
  202. m_wndTipctrl.SetIcon(m_imagelist.ExtractIcon(pItem->m_nImage), CSize(32, 32));
  203. m_wndTipctrl.Show(point);
  204. }
  205. }
  206. }
  207. else 
  208. {
  209. m_bHilight = false;
  210. CRect rect;
  211. GetItemRect(m_nHotItem, &rect);
  212. InvalidateRect(&rect);
  213. m_nHotItem = - 1;
  214. KillTimer(1);
  215. }
  216. }
  217. CListBox::OnTimer(nIDEvent);
  218. }
  219. /*########################################################################
  220.   ------------------------------------------------
  221.   ------------------------------------------------
  222.   ########################################################################*/
  223. int CCoolListBox::AddItem(int nImage, LPCTSTR strText,UINT id, LPCTSTR strTipText)
  224. {
  225. CListBoxItem* pItem;
  226. int nindex = AddString(strText);
  227. pItem = new CListBoxItem(nindex, nImage, strText, this);
  228. pItem->SetTipText(strTipText);
  229. pItem->ID = id;
  230. ASSERT(pItem != NULL);
  231. m_aItems.AddTail(pItem);
  232. SetItemData(nindex, DWORD(pItem));
  233. return nindex;
  234. }
  235. BOOL CCoolListBox::SetImagelist(UINT uBitmap)
  236. {
  237. m_imagelist.DeleteImageList();
  238. m_imagelist.Create(32, 32, ILC_COLOR24|ILC_MASK, 8, 1);
  239. CBitmap bitmap;
  240. bitmap.LoadBitmap(uBitmap);
  241. m_imagelist.Add(&bitmap, RGB(255,0,255));
  242. return TRUE;
  243. }
  244. CListBoxItem* CCoolListBox::GetItem(int nIndex)
  245. {
  246. // Get the menu item.
  247. POSITION pos = m_aItems.FindIndex(nIndex);
  248. if (pos == 0) return NULL;
  249. CListBoxItem* pItem = m_aItems.GetAt(pos);
  250. ASSERT(pItem);
  251. return pItem;
  252. }
  253. void CCoolListBox::ReLocation()
  254. {
  255. CRect rect;
  256. GetClientRect(&rect);
  257. CRect rc(rect);
  258. rc.right -= 3; rc.top += 3;
  259. rc.left = rc.right - 12;
  260. rc.bottom = rc.top + 12;
  261. m_wndUpButton.MoveWindow(rc);
  262. rc = rect;
  263. rc.right -= 3; rc.bottom -= 3;
  264. rc.left = rc.right - 12;
  265. rc.top = rc.bottom - 12;
  266. m_wndDownButton.MoveWindow(rc);
  267. }