CBmpMenu.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:8k
源码类别:

游戏

开发平台:

Visual C++

  1. //********************************************************
  2. //                                                            
  3. // FILENAME : CBmpMenu.h
  4. // CONTENTS : CBmpMenu class header file.
  5. //
  6. //  Copyright(c), 1999-2000.   
  7. // All rights reserved   
  8. //                                                        
  9. //  Author :  Dipti Deogade
  10. //                                                        
  11. //***************************************************************************************
  12. //** REVISION LIST **********************************************************************
  13. //     
  14. // Number Date Author Description
  15. //
  16. //
  17. //***************************************************************************************
  18. #if !defined(AFX_CBMPMENU_H__53F51970_5150_11D3_AB49_0004AC25CC15__INCLUDED_)
  19. #define AFX_CBMPMENU_H__53F51970_5150_11D3_AB49_0004AC25CC15__INCLUDED_
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif // _MSC_VER > 1000
  23. //Internal user defined messages
  24. #define WM_LBUTTONDOWNAFTER WM_USER + 101
  25. #define WM_RESETDATA WM_USER + 102
  26. #define WM_POPUPSUBMENU WM_USER + 103
  27. //Global contants
  28. #define MENU_SELECTFIRSTITEM 0x0100
  29. #define OBM_CHECK 32760 //OEM bitmap id for checkmark...taken from winuser.h
  30. //***************************************************************************************
  31. // The CBmpMenu class provides a way to create popup menus with vertical bitmap
  32. //(like windows start bitmap). Also an user can show a child controls by the
  33. //side of menu items. CBmpMenu window provides a placeholder window for child controls.
  34. //The menu behavior is implemented using a toolbar window, of type MenuToolBar class. 
  35. //
  36. //In order to use CBmpMenu class, user needs to use the functions implemented by CMenu for 
  37. //showing a popup menu. All the Microsoft documentation for popup menus applies to CBmpMenu class.
  38. //Only the deviations from that documentation are described below:-
  39. //
  40. // 1) An additional constructor has been implemented to pass on the vertical
  41. // bitmap handle, bitmap width etc.
  42. //
  43. //     CBmpMenu(int nBitmapW=0, BOOL bShowBmp4SubMenu=FALSE, HBITMAP hBitmap=0, BOOL bStretchBmp=TRUE);
  44. //    nBitmapW = Width of the blank space to be shown to the left side of menu items in a popup menu.
  45. //    bShowBmp4SubMenu = If TRUE, then blank space is shown for all submenus of a popup menu
  46. //   If FALSE, then blank space is shown only for main menu.
  47. //    hBitmap = If a valid handle is passed then this bitmap is drawn on the blank space
  48. //    bStretchBmp = If TRUE, then bitmap is drawn using StretchBlt.
  49. //  If False, then the blank space is filled with pattern brush created from the bitmap
  50. //
  51. // 2) The parameters passed in the message WM_ENTERMENULOOP, to the owner window of the 
  52. //    menu has been changed.
  53. //
  54. //   WM_ENTERMENULOOP:
  55. //    wParam = (HMENU)hMenu;  //handle of menu which is entering the modal loop
  56. //    lParam = (HEND)hWindow; //handle of menu window(menu window is of type CBmpMenu)
  57. //
  58. //   Remarks:
  59. //    If user wants to show a child control e.g. slider control to the left side of the control,
  60. //   then he needs to handle WM_ENTERMENULOOP in the owner window of the menu. Create child
  61. //   control with hWindow as parent and place them in the menu window using MoveWindow. User should
  62. //   take care that control is placed only in the blank space. Otherwise, it may not draw properly.
  63. //
  64. //***************************************************************************************
  65. /////////////////////////////////////////////////////////////////////////////
  66. // MenuToolBar window
  67. class MenuToolBar : public CToolBar
  68. {
  69. private:
  70. int m_nSelectedItem; //Index of the hot item
  71. int m_nLastLBDownIndex; //Index of the button for which left mouse click event was last processed
  72. CFont m_oMenuFont; //Stores the menu font
  73. CPoint m_oHoverPt; //Stores the last point in the client area of toolbar window, for which WM_MOSEHOVER was created
  74. int m_nLastHoverIndex; //Index of the button for which WM_MOUSEHOVE message was last created
  75. // Construction
  76. public:
  77. MenuToolBar(); //default constructor
  78. // Attributes
  79. public:
  80. // Operations
  81. public:
  82. // Overrides
  83. // ClassWizard generated virtual function overrides
  84. //{{AFX_VIRTUAL(MenuToolBar)
  85. protected:
  86. virtual void OnCustomDrawNotify(LPARAM lParam, LRESULT* pResult ); //NM_CUSTOMDRAW handler
  87. virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  88. virtual void OnMouseMove(UINT nFlags, CPoint point);
  89. //}}AFX_VIRTUAL
  90. // Implementation
  91. public:
  92. virtual ~MenuToolBar();
  93. // Generated message map functions
  94. protected:
  95. //{{AFX_MSG(MenuToolBar)
  96. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  97. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  98. afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) ;
  99. afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  100. //}}AFX_MSG
  101. void OnPostLbuttonMsg(UINT nFlags, LPARAM point); //Called from OnLbuttonDown using PostMessage
  102. BOOL KeyboardFilter(UINT nChar, UINT nRepCnt, UINT nFlags) ; //Helper function used by OnKeyDown
  103. BOOL Draw3DCheckmark(CDC& dc, const CRect rc, BOOL bSelected, HBITMAP hbmCheck,
  104. BOOL bDrawSunkenBdr, BOOL bGrayImage); //Helper function used by OnCustomDrawNotify
  105. //to draw image in checked menu item
  106. DECLARE_MESSAGE_MAP()
  107. };
  108. /////////////////////////////////////////////////////////////////////////////
  109. // CBmpMenu window
  110. class CBmpMenu : public CWnd, public CMenu
  111. {
  112. DECLARE_DYNAMIC(CBmpMenu);
  113. // Construction
  114. public:
  115. //Constructor
  116. CBmpMenu(int nBitmapW=0, BOOL bShowBmp4SubMenu=FALSE, HBITMAP hBitmap=0, BOOL bStretchBmp=TRUE);
  117. //CMenu overridables
  118. BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, CRect* pMenuItemRect=NULL);
  119. void operator delete( void* p ){ delete(p);};
  120. // Attributes
  121. public:
  122. CWnd* m_pOwnerWnd; //pointer to owner window
  123. // Operations
  124. public:
  125. // Overrides
  126. // ClassWizard generated virtual function overrides
  127. //{{AFX_VIRTUAL(CBmpMenu)
  128. public:
  129. virtual BOOL DestroyWindow();
  130. protected:
  131. virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  132. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  133. //}}AFX_VIRTUAL
  134. public:
  135. // Implementation
  136. virtual ~CBmpMenu();
  137. BOOL Attach( HMENU hMenu );
  138. HMENU Detach();
  139. void DestroyRootMenu(); //Destroys all the menu windows starting from root menu window
  140. void DestroySubMenus(); //Destroys all submenu windows of this menu window
  141. // Generated message map functions
  142. protected:
  143. void InitToolBarData(CToolBar* pToolBar, CPoint pt, CRect* pRect); //Used to initialize toolbar and for menu window placement
  144. void Cleanup(); //deletes allocated memory 
  145. //{{AFX_MSG(CBmpMenu)
  146. afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  147. afx_msg void OnPaint();
  148. //}}AFX_MSG
  149. void PopupSubMenu(WPARAM wp, BOOL bSelectFirstItem);
  150. //pops up submenu at point CPoint(LOWORD(wp), HIWORD(wp)).
  151. //If bSelectFirstItem is TRUE then the first item in the submenu is shown as a hot item.
  152. DECLARE_MESSAGE_MAP()
  153. private:
  154. void PositionMenuWindow(CPoint pt, CRect* pItemRect, CRect rect); //Main menu window placement procedure
  155. BOOL PositionSubMenu(CPoint pt, CRect menuRect, BOOL bRtAlign, BOOL bDnAlign); //submenu window placement procedure
  156. CBmpMenu* m_pSubMenuWnd; //pointer to submenu window
  157. HBITMAP m_hBitmap; //handle of vertical bitmap
  158. BOOL m_bShowBmpAll; //Flag which indicates whether leave a vertical blank space for all submenus or not
  159. BOOL m_bStretchBmp;  //Flag indicating whether to use StretchBlt or PatBlt for filling up blank space
  160. int m_nTBOffSet;    //Width of blank space to be shown to left side of menu items
  161. BOOL m_bSubMenu; //Flag indicating whether this menu is a submenu or not
  162. MenuToolBar* m_pToolbar; //pointer to the toolbar window
  163. };
  164. /////////////////////////////////////////////////////////////////////////////
  165. HBITMAP GetSysColorBitmap(HDC hDC, HBITMAP hSourceBitmap, BOOL bMono, BOOL bSelected);
  166. //returns a bitmap with changed background colours of the image passed in hSourceBitmap
  167. /////////////////////////////////////////////////////////////////////////////
  168. //{{AFX_INSERT_LOCATION}}
  169. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  170. #endif // !defined(AFX_CBMPMENU_H__53F51970_5150_11D3_AB49_0004AC25CC15__INCLUDED_)