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

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 9/16/98 2:20:55 PM
  5.   Comments: MultiColumnComboBox.h : header file
  6.  ************************************/
  7. #if !defined(AFX_MULTICOLUMNCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_)
  8. #define AFX_MULTICOLUMNCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_
  9. #if _MSC_VER >= 1000
  10. #pragma once
  11. #endif // _MSC_VER >= 1000
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CMultiColumnComboBox window
  14. #include <afxtempl.h>
  15. #include <afxcmn.h>
  16. #define defaultRGBBkGnd RGB(255,255,255)
  17. #define wndClassName _T("MultiColumnComboBox")
  18. #define IDLISTCTRL 0x3E8
  19. #define IDEDIT 0x3E9
  20. #define defaultEditStyle ES_AUTOHSCROLL | ES_NOHIDESEL | 0x200
  21. #define defaultListCtrlStyle LVS_NOSORTHEADER | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER
  22. #define defaultSizeDY 17
  23. #define defaultDropDownKey VK_F4
  24. #define defaultSelChange _T("MCCBN_SELCHANGE")
  25. class CMultiColumnComboBox : public CWnd
  26. {
  27. // Construction
  28. public:
  29. static UINT m_nSelChange;
  30. class CWindowProcs
  31. {
  32. public:
  33. CWindowProcs()
  34. {
  35. };
  36. protected:
  37. // Store infos about one window, such as window procedure
  38. struct SWindowProcedure
  39. {
  40. CWnd* m_pWnd;
  41. WNDPROC m_oldWndProcWnd;
  42. SWindowProcedure(CWnd* pWnd, WNDPROC wndProc)
  43. {
  44. if (m_pWnd = pWnd)
  45. m_oldWndProcWnd = (WNDPROC)::SetWindowLong(m_pWnd->m_hWnd, GWL_WNDPROC, (long)wndProc);
  46. };
  47. virtual ~SWindowProcedure()
  48. {
  49. if (m_pWnd)
  50. ::SetWindowLong(m_pWnd->m_hWnd, GWL_WNDPROC, (long)m_oldWndProcWnd);
  51. }
  52. };
  53. // Maps with window procedure of all windows controls registered
  54. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureEdit;
  55. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureListCtrl;
  56. CMap<HWND,HWND, SWindowProcedure*, SWindowProcedure*> m_mapWindowProcedureParent;
  57. public:
  58. // Add, Get, Remove Edit elements
  59. void AddEdit(CWnd* pEdit, WNDPROC wndProc)
  60. {
  61. m_mapWindowProcedureEdit[pEdit->m_hWnd] = new SWindowProcedure(pEdit, wndProc);
  62. };
  63. SWindowProcedure* GetEditStructure(HWND hWnd)
  64. {
  65. SWindowProcedure* pEditSW = NULL;
  66. m_mapWindowProcedureEdit.Lookup(hWnd, pEditSW);
  67. return pEditSW;
  68. };
  69. WNDPROC GetOldEditProcedure(HWND hWnd)
  70. {
  71. return GetEditStructure(hWnd)->m_oldWndProcWnd;
  72. }
  73. void RemoveEdit(CWnd* pEdit)
  74. {
  75. if (SWindowProcedure* pSW = GetEditStructure(pEdit->m_hWnd))
  76. {
  77. delete pSW;
  78. m_mapWindowProcedureEdit.RemoveKey(pEdit->m_hWnd);
  79. }
  80. };
  81. // Add, Get, Remove ListControl elements
  82. void AddListCtrl(CWnd* pListCtrl, WNDPROC wndProc)
  83. {
  84. m_mapWindowProcedureListCtrl[pListCtrl->m_hWnd] = new SWindowProcedure(pListCtrl, wndProc);
  85. };
  86. SWindowProcedure* GetListCtrlStructure(HWND hWnd)
  87. {
  88. SWindowProcedure* pListCtrlSW = NULL;
  89. m_mapWindowProcedureListCtrl.Lookup(hWnd, pListCtrlSW);
  90. return pListCtrlSW;
  91. };
  92. WNDPROC GetOldListCtrlProcedure(HWND hWnd)
  93. {
  94. return GetListCtrlStructure(hWnd)->m_oldWndProcWnd;
  95. }
  96. void RemoveListCtrl(CWnd* pListCtrl)
  97. {
  98. if (SWindowProcedure* pSW = GetListCtrlStructure(pListCtrl->m_hWnd))
  99. {
  100. delete pSW;
  101. m_mapWindowProcedureListCtrl.RemoveKey(pListCtrl->m_hWnd);
  102. }
  103. };
  104. // Add, Get, Remove Parent elements
  105. void AddParent(CWnd* pParentWnd, WNDPROC wndProc)
  106. {
  107. ASSERT (pParentWnd != NULL);
  108. if (!GetParentStructure(pParentWnd->m_hWnd))
  109. m_mapWindowProcedureParent[pParentWnd->m_hWnd] = new SWindowProcedure( pParentWnd, wndProc );
  110. };
  111. SWindowProcedure* GetParentStructure(HWND hWnd)
  112. {
  113. SWindowProcedure* pParentSW = NULL;
  114. m_mapWindowProcedureParent.Lookup(hWnd, pParentSW);
  115. return pParentSW;
  116. };
  117. WNDPROC GetOldParentProcedure(HWND hWnd)
  118. {
  119. return GetParentStructure(hWnd)->m_oldWndProcWnd;
  120. }
  121. void RemoveParent(CWnd* pParent)
  122. {
  123. if (SWindowProcedure* pSW = GetParentStructure(pParent->m_hWnd))
  124. {
  125. delete pSW;
  126. m_mapWindowProcedureParent.RemoveKey(pParent->m_hWnd);
  127. }
  128. };
  129. };
  130. static CWindowProcs m_wndProcs;
  131. CMultiColumnComboBox(int nColumnKey = 0);
  132. // Attributes
  133. public:
  134. // Operations
  135. public:
  136. // Overrides
  137. // ClassWizard generated virtual function overrides
  138. //{{AFX_VIRTUAL(CMultiColumnComboBox)
  139. protected:
  140. virtual void PreSubclassWindow();
  141. virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
  142. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  143. //}}AFX_VIRTUAL
  144. // Implementation
  145. public:
  146. virtual int SetMultipleHeight(int nMHeight = 5);
  147. virtual double SetRateWidth(double dWidthList = 0);
  148. virtual void SetCurrentItem(int nIndex);
  149. virtual int GetCurrentItem();
  150. void ForwardMessage(UINT nMsg, WPARAM wParam, LPARAM lParam);
  151. virtual BOOL IsDropedDown();
  152. virtual void DropDown(BOOL bDown = TRUE);
  153. virtual CListCtrl* GetListCtrl();
  154. virtual CEdit* GetEdit();
  155. static BOOL RegClassMultiColumnComboBox();
  156. virtual ~CMultiColumnComboBox();
  157. virtual void CaptureListCtrl();
  158. // Statical functions
  159. static LRESULT CALLBACK ListCtrlWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  160. static LRESULT CALLBACK EditWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  161. static LRESULT CALLBACK ParentWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
  162. // Generated message map functions
  163. protected:
  164. int m_nSelectedItem;
  165. int m_nCurrentItem;
  166. BOOL m_bFirstShow;
  167. int m_nMultipleHeight;
  168. double m_dWidthList;
  169. virtual BOOL SelectCurrentItem();
  170. int m_nColumnKey;
  171. virtual void Search(LPCTSTR lpszFindItem);
  172. virtual BOOL OnInit();
  173. static CMultiColumnComboBox* m_pActiveMCBox;
  174. virtual void DrawButton(CDC* pDC, CRect r, BOOL bDown = FALSE);
  175. virtual void Resize();
  176. CListCtrl* m_pListCtrl;
  177. CEdit* m_pEdit;
  178. static CFont m_font;
  179. static CBrush m_brBkGnd;
  180. //{{AFX_MSG(CMultiColumnComboBox)
  181. afx_msg void OnDestroy();
  182. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  183. afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
  184. afx_msg void OnPaint();
  185. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  186. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  187. afx_msg void OnSetFocus(CWnd* pOldWnd);
  188. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  189. afx_msg void OnSize(UINT nType, int cx, int cy);
  190. afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  191. //}}AFX_MSG
  192. DECLARE_MESSAGE_MAP()
  193. private:
  194. BOOL m_bCaptured;
  195. void SetButton();
  196. void ReleaseButton();
  197. CRect m_rectBtn;
  198. };
  199. /////////////////////////////////////////////////////////////////////////////
  200. //{{AFX_INSERT_LOCATION}}
  201. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  202. #endif // !defined(AFX_MULTICOLUMNCOMBOBOX_H__1385ADA1_4D4F_11D2_8693_0040055C08D9__INCLUDED_)