DropListBox.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:6k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 10/16/98 9:46:06 AM
  5.   Comments: DropListBox.cpp : implementation file
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "xpropertieswnd.h"
  9. #include "DropListBox.h"
  10. #include "PageListCtrl.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CDropListBox
  18. // Function name : CDropListBox::CDropListBox
  19. // Description     : Default consturctor
  20. // Return type : 
  21. CDropListBox::CDropListBox()
  22. {
  23. m_pNotifyClass = NULL;
  24. m_bCancel = FALSE;
  25. m_nSelectedItem = -1;
  26. }
  27. // Function name : CDropListBox::~CDropListBox
  28. // Description     : Virtual destructor
  29. // Return type : 
  30. CDropListBox::~CDropListBox()
  31. {
  32. }
  33. BEGIN_MESSAGE_MAP(CDropListBox, CListBox)
  34. //{{AFX_MSG_MAP(CDropListBox)
  35. ON_WM_MOUSEMOVE()
  36. ON_WM_LBUTTONDOWN()
  37. ON_WM_KEYDOWN()
  38. ON_WM_KILLFOCUS()
  39. //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CDropListBox message handlers
  43. #define IDLISTBOX 1000
  44. // Function name : CDropListBox::_Create
  45. // Description     : Create the list box.
  46. // Return type : BOOL 
  47. // Argument         : CControlsWnd_CComboBox* pNotifyClass
  48. CWnd* CDropListBox::Create(CControlsWnd_CComboBox* pNotifyClass)
  49. {
  50. // Do not call this twice
  51. ASSERT (!::IsWindow(GetSafeHwnd()));
  52. // if (CListBox::Create(WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER ,CRect(0,0,0,0), GetDesktopWindow(), IDLISTBOX))
  53. if (CWnd::CreateEx(WS_EX_TOOLWINDOW, _T("LISTBOX"), NULL, WS_POPUP | WS_VSCROLL | WS_HSCROLL | WS_BORDER , 0,0,0,0 , pNotifyClass->GetWindowNotify()->m_hWnd, NULL))
  54. {
  55. m_pNotifyClass = pNotifyClass;
  56. // ModifyStyleEx(0, WS_EX_TOOLWINDOW);
  57. SetFont(m_pNotifyClass->GetWindowNotify()->GetFont());
  58. return this;
  59. }
  60. return NULL;
  61. }
  62. // Function name : CDropListBox::Load
  63. // Description     : Load Items into list box
  64. // Return type : void 
  65. // Argument         : LPCTSTR lpszItems
  66. // Argument         : TCHAR c
  67. void CDropListBox::Load(LPCTSTR lpszItems, TCHAR c)
  68. {
  69. ASSERT (m_pNotifyClass);
  70. ResetContent();
  71. LPTSTR lpszItem = (LPTSTR)lpszItems;
  72. while (lpszItem)
  73. {
  74. LPTSTR lpszNItem = _tcschr(lpszItem, c);
  75. AddString(lpszNItem ? CString(lpszItem, lpszNItem - lpszItem) : CString(lpszItem));
  76. lpszItem = lpszNItem ? lpszNItem + 1 : NULL;
  77. }
  78. }
  79. // Function name : CDropListBox::Show
  80. // Description     : Show the window
  81. // Return type : BOOL 
  82. // Argument         : CRect rect
  83. void CDropListBox::Show(CRect rect, int nLines)
  84. {
  85. // You must call Load function before
  86. ASSERT(::IsWindow(GetSafeHwnd()));
  87. {
  88. nLines = abs(nLines);
  89. m_pNotifyClass->GetWindowNotify()->ClientToScreen(rect);
  90. int h = GetItemHeight(0); h = h == LB_ERR ? 16 : h;
  91. int nDY = max(1,min(nLines, GetCount())) * (h + 1);
  92. CRect rMove(rect);
  93. rMove.bottom = rMove.top + nDY;
  94. MoveWindow(rMove);
  95. GetWindowRect(rMove);
  96. nDY = rMove.Height();
  97. if (nDY + rect.bottom < GetSystemMetrics(SM_CYSCREEN))
  98. {
  99. rect.top = rect.bottom;
  100. rect.bottom = rect.top + nDY;
  101. }
  102. else
  103. {
  104. rect.bottom = rect.top;
  105. rect.top = rect.bottom - nDY;
  106. }
  107. MoveWindow(rect);
  108. SetWindowPos(&CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
  109. ShowWindow(SW_SHOW);
  110. SetFocus();
  111. SetCapture();
  112. }
  113. }
  114. // Function name : CDropListBox::OnMouseMove
  115. // Description     : MouseMove
  116. // Return type : void 
  117. // Argument         : UINT nFlags
  118. // Argument         : CPoint point
  119. void CDropListBox::OnMouseMove(UINT nFlags, CPoint point) 
  120. {
  121. CRect rect; GetClientRect(rect);
  122. if (rect.PtInRect(point))
  123. {
  124. BOOL bOutside = TRUE;
  125. int nItem  = ItemFromPoint(point, bOutside);
  126. if (nItem != GetCurSel())
  127. SetCurSel(nItem);
  128. }
  129. CListBox::OnMouseMove(nFlags, point);
  130. }
  131. // Function name : CDropListBox::OnLButtonDown
  132. // Description     : 
  133. // Return type : void 
  134. // Argument         : UINT nFlags
  135. // Argument         : CPoint point
  136. void CDropListBox::OnLButtonDown(UINT nFlags, CPoint point) 
  137. {
  138. CListBox::OnLButtonDown(nFlags, point);
  139. CRect rectClient; GetClientRect(rectClient);
  140. CRect rectWindow; GetWindowRect(rectWindow);
  141. CPoint pointScreen(point);
  142. ClientToScreen(&pointScreen);
  143. LPARAM lPoint = MAKELPARAM(pointScreen.x, pointScreen.y);
  144. UINT ht = SendMessage(WM_NCHITTEST,0,lPoint);
  145. if ((!rectWindow.PtInRect(pointScreen)) || (ht == HTCLIENT))
  146. {
  147. Close(ht != HTCLIENT);
  148. return;
  149. }
  150. // ASSERT(rectWindow.PtInRect(pointScreen))
  151. ReleaseCapture();
  152. SendMessage(WM_NCLBUTTONDOWN, ht, lPoint);
  153. SetCapture();
  154. }
  155. // Function name : CDropListBox::OnKeyDown
  156. // Description     : 
  157. // Return type : void 
  158. // Argument         : UINT nChar
  159. // Argument         : UINT nRepCnt
  160. // Argument         : UINT nFlags
  161. void CDropListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  162. {
  163. switch (nChar)
  164. {
  165. case VK_RETURN:
  166. case VK_CANCEL:
  167. {
  168. Close(nChar == VK_CANCEL);
  169. return;
  170. }
  171. }
  172. CListBox::OnKeyDown(nChar, nRepCnt, nFlags);
  173. SelChange();
  174. }
  175. // Function name : CDropListBox::Close
  176. // Description     : 
  177. // Return type : void 
  178. // Argument         : BOOL bCancel
  179. void CDropListBox::Close(BOOL bCancel)
  180. {
  181. m_bCancel = bCancel;
  182. SelChange();
  183. // m_nSelectedItem este valid doar daca m_bCancel = FALSE;
  184. if (m_pNotifyClass)
  185. m_pNotifyClass->Close(m_bCancel);
  186. }
  187. // Function name : CDropListBox::SelChange
  188. // Description     : Selection is change
  189. // Return type : void 
  190. void CDropListBox::SelChange()
  191. {
  192. if (m_nSelectedItem != GetCurSel())
  193. {
  194. m_nSelectedItem = GetCurSel();
  195. CString text; GetText(m_nSelectedItem, text);
  196. m_pNotifyClass->OnSelectItem(text, m_nSelectedItem);
  197. }
  198. }
  199. // Function name : CDropListBox::OnKillFocus
  200. // Description     : 
  201. // Return type : void 
  202. // Argument         : CWnd* pNewWnd
  203. void CDropListBox::OnKillFocus(CWnd* pNewWnd) 
  204. {
  205. CListBox::OnKillFocus(pNewWnd);
  206. m_pNotifyClass->Close(TRUE);
  207. }