QComboBox.h
上传用户:cszhwei
上传日期:2007-01-01
资源大小:37k
文件大小:9k
源码类别:

组合框控件

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 9/16/98 2:20:55 PM
  5.   Comments: QComboBox.h : header file
  6.  ************************************/
  7. #if !defined(AFX_QCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_)
  8. #define AFX_QCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_
  9. #if _MSC_VER >= 1000
  10. #pragma once
  11. #endif // _MSC_VER >= 1000
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CQComboBox window
  14. #include <afxtempl.h>
  15. #define defaultRGBBkGnd RGB(192,192,192)
  16. #define wndClassName _T("QComboBox")
  17. #define IDListBox 0x3E8
  18. #define IDEDIT 0x3E9
  19. #define defaultEditStyle ES_AUTOHSCROLL | ES_NOHIDESEL | 0x200
  20. #define defaultListBoxStyle LBS_DISABLENOSCROLL
  21. #define defaultSizeDY 21
  22. #define defaultSizeDX 13
  23. #define defaultDropDownKey VK_F4
  24. #define defaultSelChange _T("QCBN_SELCHANGE")
  25. #define defaultLoading _T("QCBN_LOADING")
  26. #define defaultLoaded _T("QCBN_LOADED")
  27. #define QIDTIMERFIRST 1000
  28. #define QIDTIMERSTARTLOADITEMS QIDTIMERFIRST
  29. #define QIDTIMERLOADITEMS QIDTIMERFIRST + 1
  30. #define QTIMESTARTLOADITEMS 3000
  31. #define QTIMELOADITEMS 128
  32. class CQComboBox;
  33. typedef LPCTSTR (*TLine) (int iLine, LPARAM& lParamItem, LPARAM lParam = 0);
  34. typedef int (*TLinePartial) (LPCTSTR lpszItempartial, LPARAM lParam = 0);
  35. typedef int (CQComboBox::*TLoadFunction) (int nLineFrom, int nHowMany = +1); 
  36. class CQComboBox : public CWnd
  37. {
  38. // Construction
  39. public:
  40. class CWindowProcs
  41. {
  42. public:
  43. CWindowProcs()
  44. {
  45. };
  46. protected:
  47. // Store infos about one window, such as window procedure
  48. struct SWindowProcedure
  49. {
  50. CWnd* m_pWnd;
  51. WNDPROC m_oldWndProcWnd;
  52. SWindowProcedure(CWnd* pWnd, WNDPROC wndProc)
  53. {
  54. if (m_pWnd = pWnd)
  55. m_oldWndProcWnd = (WNDPROC)::SetWindowLong(m_pWnd->m_hWnd, GWL_WNDPROC, (long)wndProc);
  56. };
  57. virtual ~SWindowProcedure()
  58. {
  59. if (m_pWnd)
  60. ::SetWindowLong(m_pWnd->m_hWnd, GWL_WNDPROC, (long)m_oldWndProcWnd);
  61. }
  62. };
  63. // Maps with window procedure of all windows controls registered
  64. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureEdit;
  65. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureListBox;
  66. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureParent;
  67. public:
  68. // Add, Get, Remove Edit elements
  69. void AddEdit(CWnd* pEdit, WNDPROC wndProc)
  70. {
  71. m_mapWindowProcedureEdit[pEdit->m_hWnd] = new SWindowProcedure(pEdit, wndProc);
  72. };
  73. SWindowProcedure* GetEditStructure(HWND hWnd)
  74. {
  75. SWindowProcedure* pEditSW = NULL;
  76. m_mapWindowProcedureEdit.Lookup(hWnd, pEditSW);
  77. return pEditSW;
  78. };
  79. WNDPROC GetOldEditProcedure(HWND hWnd)
  80. {
  81. return GetEditStructure(hWnd)->m_oldWndProcWnd;
  82. }
  83. void RemoveEdit(CWnd* pEdit)
  84. {
  85. if (SWindowProcedure* pSW = GetEditStructure(pEdit->m_hWnd))
  86. {
  87. delete pSW;
  88. m_mapWindowProcedureEdit.RemoveKey(pEdit->m_hWnd);
  89. }
  90. };
  91. // Add, Get, Remove ListControl elements
  92. void AddListBox(CWnd* pListBox, WNDPROC wndProc)
  93. {
  94. m_mapWindowProcedureListBox[pListBox->m_hWnd] = new SWindowProcedure(pListBox, wndProc);
  95. };
  96. SWindowProcedure* GetListBoxStructure(HWND hWnd)
  97. {
  98. SWindowProcedure* pListBoxSW = NULL;
  99. m_mapWindowProcedureListBox.Lookup(hWnd, pListBoxSW);
  100. return pListBoxSW;
  101. };
  102. WNDPROC GetOldListBoxProcedure(HWND hWnd)
  103. {
  104. return GetListBoxStructure(hWnd)->m_oldWndProcWnd;
  105. }
  106. void RemoveListBox(CWnd* pListBox)
  107. {
  108. if (SWindowProcedure* pSW = GetListBoxStructure(pListBox->m_hWnd))
  109. {
  110. delete pSW;
  111. m_mapWindowProcedureListBox.RemoveKey(pListBox->m_hWnd);
  112. }
  113. };
  114. // Add, Get, Remove Parent elements
  115. void AddParent(CWnd* pParentWnd, WNDPROC wndProc)
  116. {
  117. if (!GetParentStructure(pParentWnd->m_hWnd))
  118. m_mapWindowProcedureParent[pParentWnd->m_hWnd] = new SWindowProcedure( pParentWnd, wndProc );
  119. };
  120. SWindowProcedure* GetParentStructure(HWND hWnd)
  121. {
  122. SWindowProcedure* pParentSW = NULL;
  123. m_mapWindowProcedureParent.Lookup(hWnd, pParentSW);
  124. return pParentSW;
  125. };
  126. WNDPROC GetOldParentProcedure(HWND hWnd)
  127. {
  128. return GetParentStructure(hWnd)->m_oldWndProcWnd;
  129. }
  130. void RemoveParent(CWnd* pParent)
  131. {
  132. if (SWindowProcedure* pSW = GetParentStructure(pParent->m_hWnd))
  133. {
  134. delete pSW;
  135. m_mapWindowProcedureParent.RemoveKey(pParent->m_hWnd);
  136. }
  137. };
  138. };
  139. static CWindowProcs m_wndProcs;
  140. CQComboBox(TLine fctLine, TLinePartial fctLinePartial, LPARAM lParam = 0);
  141. // Attributes
  142. public:
  143. // Operations
  144. public:
  145. // Overrides
  146. // ClassWizard generated virtual function overrides
  147. //{{AFX_VIRTUAL(CQComboBox)
  148. protected:
  149. virtual void PreSubclassWindow();
  150. virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
  151. //}}AFX_VIRTUAL
  152. // Implementation
  153. public:
  154. virtual int GetCountItem();
  155. virtual void SetCountItems(int nCount);
  156. virtual int GetVisibleCount();
  157. virtual int SetMultipleHeight(int nMHeight = 5);
  158. virtual double SetRateWidth(double dWidthList = 0);
  159. virtual void SetCurrentItem(int nIndex);
  160. virtual int GetCurrentItem();
  161. BOOL ForwardMessage(UINT nMsg, WPARAM wParam, LPARAM lParam);
  162. virtual BOOL IsDropedDown();
  163. virtual void DropDown(BOOL bDown = TRUE);
  164. virtual CListBox* GetListBox();
  165. virtual CEdit* GetEdit();
  166. static BOOL RegClassQComboBox();
  167. virtual ~CQComboBox();
  168. virtual LPCTSTR Line(int nLine, LPARAM& lParamItem);
  169. virtual int LinePartial(LPCTSTR lpszItemPartial);
  170. virtual int LoadPartial(int nLineFrom, int nHowMany = +1);
  171. // Statical functions
  172. static LRESULT CALLBACK ListBoxWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  173. static LRESULT CALLBACK EditWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  174. static LRESULT CALLBACK ParentWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  175. // Generated message map functions
  176. protected:
  177. static UINT m_nSelChange;
  178. static UINT m_nLoading;
  179. static UINT m_nLoaded;
  180. static CMap<CQComboBox*,CQComboBox*, BOOL, BOOL> m_mapUnloadedQCombos;
  181. //
  182. struct QSnapLoader
  183. {
  184. CQComboBox* m_pParent;
  185. struct SNodeItemsInfo
  186. {
  187. static int m_nCountRef;
  188. int m_nItemLine;
  189. int m_nCount;
  190. int m_nItemLB;
  191. SNodeItemsInfo* m_pNextNode;
  192. SNodeItemsInfo* m_pPrevNode;
  193. SNodeItemsInfo(int nItemLine, int nCount, int nItemLB)
  194. {
  195. m_nItemLine = nItemLine;
  196. m_nCount = nCount;
  197. m_nItemLB = nItemLB;
  198. m_pNextNode = NULL;
  199. m_pPrevNode = NULL;
  200. m_nCountRef++;
  201. }
  202. ~SNodeItemsInfo()
  203. {
  204. m_nCountRef--;
  205. }
  206. int GetLastLine()
  207. {
  208. return m_nItemLine + m_nCount;
  209. }
  210. int GetLastItem()
  211. {
  212. return m_nItemLB + m_nCount;
  213. }
  214. };
  215. SNodeItemsInfo* m_pFirstNode;
  216. public:
  217. virtual int GetItemLine(int nItemLB);
  218. virtual CString GetListNodes();
  219. void SetParent(CQComboBox* pParent);
  220.  QSnapLoader();
  221. virtual int Load(int nItemFrom, int nHowMany);
  222. virtual  ~QSnapLoader();
  223. };
  224. friend struct CQComboBox::QSnapLoader;
  225. public:
  226. static CQComboBox* GetFirstQComboBox();
  227. virtual BOOL IsAlreadyLoad();
  228. QSnapLoader m_QuickLoader;
  229. protected:
  230. int m_nCountItems;
  231. virtual int LoadPartialListBox(int nLineFrom, int nHowMany = +1);
  232. virtual int AlreadyLoadPartialListBox(int nLineFrom, int nHowMany = +1);
  233. int m_nCountVisible;
  234. //
  235. TLine m_fctLine;
  236. TLinePartial m_fctLinePartial;
  237. TLoadFunction m_fctLoadFunction;
  238. int m_nMultipleHeight;
  239. double m_dWidthList;
  240. virtual void SelectCurrentItem();
  241. virtual void Search(LPCTSTR lpszFindItem);
  242. BOOL OnInit();
  243. static CQComboBox* m_pActiveMCBox;
  244. virtual void DrawButton(CDC* pDC, CRect r, BOOL bDown = FALSE);
  245. virtual void Resize();
  246. CListBox* m_pListBox;
  247. CEdit* m_pEdit;
  248. static CFont m_font;
  249. static CBrush m_brBkGnd;
  250. //{{AFX_MSG(CQComboBox)
  251. afx_msg void OnDestroy();
  252. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  253. afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
  254. afx_msg void OnPaint();
  255. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  256. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  257. afx_msg void OnSetFocus(CWnd* pOldWnd);
  258. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  259. afx_msg void OnTimer(UINT nIDEvent);
  260. //}}AFX_MSG
  261. DECLARE_MESSAGE_MAP()
  262. private:
  263. LPARAM m_lParam;
  264. BOOL m_bCaptured;
  265. void SetButton();
  266. void ReleaseButton();
  267. CRect m_rectBtn;
  268. };
  269. /////////////////////////////////////////////////////////////////////////////
  270. //{{AFX_INSERT_LOCATION}}
  271. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  272. #endif // !defined(AFX_QCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_)