/* ============================================================================ xoblite -> an alternative shell based on Blackbox for Windows Copyright © 2002-2005 Karl-Henrik Henriksson [qwilk] Copyright © 2001-2004 The Blackbox for Windows Development Team http://xoblite.net/ - #bb4win on irc.freenode.net ============================================================================ Blackbox for Windows is free software, released under the GNU General Public License (GPL version 2 or later), with an extension that allows linking of proprietary modules under a controlled interface. What this means is that plugins etc. are allowed to be released under any license the author wishes. Please note, however, that the original Blackbox gradient math code used in Blackbox for Windows is available under the BSD license. http://www.fsf.org/licenses/gpl.html http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. For additional license information, please read the included license.html ============================================================================ */ #ifndef __MENU_H #define __MENU_H #include <windows.h> #include <vector> #define HIDE_CHILDREN 1 #define HIDE_THIS 0 #define HIDE_PARENTS -1 #define ALIGN_LEFT 1 #define ALIGN_TOP 1 #define ALIGN_CENTER 0 #define ALIGN_RIGHT -1 #define ALIGN_BOTTOM -1 using namespace std; class MenuItem; typedef vector<MenuItem*>::iterator MENUITERATOR; //=========================================================================== // Menu is a class that contains a set of MenuItems. This class manages // the underlying _tsystem window that is used to render the menuitems. class Menu { public: Menu(HINSTANCE hInstance); virtual ~Menu(); // Displays the popup with upper left corners at // @param x location on the screen // @param y location on the screen void Show(int x, int y); /// Displays the popup at a location that the popup consider to be reasonable void Show(); // Adds the MenuItem m to the popup menu. Menu will free the object when // it is no longer needed // @param m pointer to a menuitem object to be added void AddMenuItem(MenuItem* m); // Sorted add void AddMenuItem(MenuItem *m, bool (*pfnSort)(void *, MenuItem *, MenuItem *), void *pvSortParam); // Deletes the entire list of menu items, and deletes the objects that it refers to void DeleteMenuItems(); // Returns TRUE if this popupmenu is a pinned state // @return if the popup is pinned bool IsPinned(){return m_bPinned;}; bool HasMoved() {return m_bMoved;}; // Sets the pinned state of the popup // @param bPinned TRUE to set pinned, FALSE to un-pin void SetPinned(bool bPinned){m_bPinned = bPinned;}; // Hides the popup menu // 1. this and all below this // 2. this and all above this // 3. only this popupmenu void Hide(int h); // Returns the associated window // @return handle to the associated window HWND GetWindow(); // Calls paint on each menu item void Paint(); // Calls mouse message on each menu item void Mouse(UINT nMsg, int x, int y); // This window is activated or de-activated void Activate(int fActive, HWND hWnd); /// Timer message has been sent to this window void Time(int nTimer); /// NC hit test has been sent to this window LRESULT NcHitTest(int x, int y); /// WM_COMMAND has been sent... LRESULT Command(WPARAM wParam, LPARAM lParam); // Paints a border around the popupmenu // @param hDC handle to a device context on which the Border is painted void PaintBorder(HDC hDC); // Sets the parent menu of this menu // @param pParent Menu pointer pointing at the parent object void SetParent(Menu* pParent); // Adds a child popup menu to this menu // @param pChild Menu pinter pointing at the child object void AddChild(Menu* pChild); // Removes a popupmenu from the vector of children // @param pChild pointer to the popupmenu object to be removed void RemoveChild(Menu* pChild); // Returns the parent object of this popupmenu // @return Returns the parent popupmenu object, NULL if there is no parent object Menu* GetParent(); // The user is moving the popupmenu void Moving(); bool IsActive(); WIN32_FIND_DATA data; // Sorts the menuitems in this menu void Sort(int beginOffset, int endOffset); // Validate the width and transparency of this menu void Validate(); // Do actually validate next time validate is called void Invalidate(); // Called when the mouse leaves the menu void MouseLeave(); // Respond to the WM_SHOWWINDOW message virtual void OnShow(bool fShow) { } // Respond to the WM_TIMER message virtual void OnTimer(int nTimer) { } // Respond to messages in the WM_USER range virtual bool OnUser(int nMessage, WPARAM wParam, LPARAM lParam, LRESULT &lResult); //protected: // Utility method used to find and deactivate the currently selected menu item // @param pMenuIterator will upon return point at the deselected menu item // @return true if one was deselected, false otherwuse bool FindActiveAndDeactivate(MENUITERATOR* pMenuIterator); // Utility method that reutrns true if hWnd is a children of this menue // @param hWnd the window to be checked // @return true if hWnd is a children, false otherwise bool IsChildWindow(HWND hWnd); // Timer callback used to monitor the position of the mouse static void CALLBACK TrackMouseProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); // True if the menu is validated for size and transparency, false otherwise bool m_bValidated; // The string title of the popupmenu char* m_pszTitle; // Handle to the window that is the popup menu HWND m_hWnd; // The parent popup menu. The root popup menue does not have any parent. Menu* m_pParent; // A vector of pointers to children menues vector<Menu*> m_Children; // A vector of menuitems that is associated with this popup menu vector<MenuItem*> m_MenuItems; // Handle to the instace of this process HINSTANCE m_hInstance; // The number of popupmenu objects loaded static int m_nInstances; HBITMAP bitmap; // If this popupmenu is pinned or not bool m_bPinned; bool m_bMoved; // If the mouse is currently over this window bool m_bMouseOver; // menu.frame gradient cache HDC cachedMenuFrame; bool cachedMenuFrameExists; }; //==================== LRESULT CALLBACK MenuWindowProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam); //=========================================================================== #endif /* __MENU_H */
w | e | b | c | p | p |
|