// ========================================================================== // Class Specification : COXPopupBarCtrl // ========================================================================== // Version: 9.3 // This software along with its related components, documentation and files ("The Libraries") // is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is // governed by a software license agreement ("Agreement"). Copies of the Agreement are // available at The Code Project (www.codeproject.com), as part of the package you downloaded // to obtain this file, or directly from our office. For a copy of the license governing // this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900. // ////////////////////////////////////////////////////////////////////////// // Properties: // NO Abstract class (does not have any objects) // YES Derived from CWnd // YES Is a Cwnd. // YES Two stage creation (constructor & Create()) // NO Has a message map // NO Needs a resource (template) // NO Persistent objects (saveable on disk) // NO Uses exceptions // ////////////////////////////////////////////////////////////////////////// // Desciption : /* We define Popup Bar control as any control that can be represented as top most popup window with items on it that can be chosen using mouse or keyboard. For example standard Popup Menu Bar or Color Picker from Word 97 are Popup Bar controls. Our Popup Bar can be graphically represented as: -------------------------------- | -------------------------- | | | Default | | <-- "Default" button. Always is located on the top. | -------------------------- | Size of this button calculated automatically. | --- --- --- --- --- --- | | | | | | | | | | | | | | | <-- | | --- --- --- --- --- --- | | | --- --- --- --- --- --- | | | | | | | | | | | | | | | | <-- | | --- --- --- --- --- --- | | | --- --- --- --- --- --- | | | | | | | | | | | | | | | | <-- | <-- "Common" buttons. You can set the number | --- --- --- --- --- --- | | of common buttons and its size. You can set | --- --- --- --- --- --- | | the number of rows used to display them. | | | | | | | | | | | | | | <-- | | --- --- --- --- --- --- | | | --- --- --- --- --- --- | | | | | | | | | | | | | | | | <-- | | --- --- --- --- --- --- | | -------------------------- | | | Custom | | <-- "Custom" button. Always is located in the bottom | -------------------------- | Size of this button calculated automatically. -------------------------------- Default and Custom buttons are optional and at least one common button has to be assigned to Popup Bar control. After displaying, Popup Bar control capture all mouse messages and hide itself if any mouse button was clicked or user press ESC, ENTER or SPACE button. If at the moment of clicking mouse wasn't over any button within Popup Bar or user pressed ESC then nothing was chosen. COXPopupBarCtrl is a generic class designed specifically as a base class to provide basic functionality of any Popup Bar control. Next are the main points about this class: 1) With any button (except Custom button) we associate DWORD value to uniquely identify them. In derived class you specify the logic of this value. It can be just a plain value or a pointer to any object, but it's up to implementor to provide logic that stands by that value. 2) COXPopupBarCtrl is created in two steps: constructor and Create function. In constructor you can specify number of common buttons, number of rows to display common buttons, common button size, the value that should be associated with Default button and the text that is going to be displayed on Default and Custom buttons. Constructor is defined as: COXPopupBarCtrl(UINT nButtons=20, UINT nRows=4, DWORD dwDefault=ID_POPUPBAR_DATA_NONE, CSize sizeButton=CSize(18,18), CString sDefaultButtonText=_T("Default"), CString sCustomButtonText=_T("Custom...")); In your derived class you can define your own predefined values to be used in the constructor. Create function physically create window. In create function you have to specify parent window of the control and optionally you can set specific COXPopupBarCtrl styles (will be listed below) and brush object to draw control's window background. This function is defined as: BOOL Create(CWnd* pParentWnd, UINT nPopupBarStyle=0, HBRUSH hbrBackground=NULL); nPopupBarStyle - popup bar style. Can be any combination of: POPUPBAR_NOTOOLTIP - tooltip won't be displayed POPUPBAR_NODEFAULT - default button won't be displayed POPUPBAR_NOCUSTOM - custom button won't be displayed POPUPBAR_NOFLAT - reserved for future use After creation you can change whatever control's attributes you want (including those specified in constructor and Create function) using next functions: void SetNumButtons(UINT nButtons); // --- Effect : set number of common buttons in the control void SetNumRows(UINT nRows); // --- Effect : set number of rows of common buttons in the control void SetPopupBarStyle(UINT nPopupBarStyle); // --- Effect : set control specific styles void SetDefaultData(DWORD dwDefault); // --- Effect : set the data of default button void SetButtonSize(CSize sizeButton); // --- Effect : set common button size void SetDefaultButtonText(CString sText); // --- Effect : set default button text void SetCustomButtonText(CString sText); // --- Effect : set default button text BOOL SetTextFont(CFont* pFont); // --- Effect : set font to draw text in buttons And you can retrieve them using next functions: UINT GetNumButtons(); // --- Returns: number of common buttons in the control UINT GetNumRows(); // --- Returns: number of rows of common buttons in the control UINT GetNumColumns(); // --- Returns: number of columns of common buttons in the control UINT GetPopupBarStyle(); // --- Returns: control specific styles DWORD GetDefaultData(); // --- Returns: data associated with default button CSize GetButtonSize(); // --- Returns: common button size CString GetDefaultButtonText(); // --- Returns: default button text CString GetCustomButtonText(); // --- Returns: custom button text CFont* GetTextFont(); // --- Returns: pointer to the font used to draw text in buttons (if doesnt set // returns NULL) 3) As I mentioned above any button (except Custom button) should be associated with DWORD value in order to be uniquely identified. Next function is provided to populate control with common button values (Default button value is set using another function SetDefaultData): BOOL SetButtonDataTable(DWORD* arrData, UINT nElements); // --- In : arrData - array of DWORD elements // nElements - the number of elements in the array BOOL SetButtonDataTable(ButtonDataTable& arrData); // --- In : arrData - CArray of DWORD elements. ButtonDataTable is defined as: // typedef CArray ButtonDataTable; Values associated with Common buttons can be retrieved using next function: ButtonDataTable* GetButtonDataTable(); As long as we associate unique values with any custom button we can use them to provide tooltips for all common buttons. We provide next function to set tooltips: BOOL SetToolTipTextTable(ButtonToolTipMap& arrToolTipText); // --- In : arrToolTipText - ButtonToolTipMap map array. ButtonToolTipMap is // defined as: // // typedef CMap ButtonToolTipMap; // BOOL SetToolTipTextTable(ButtonToolTipTable* arrToolTipText, UINT nElements); // --- In : arrToolTipText - array of ButtonToolTipTable structure elements. // This structure is defined as: // // typedef struct { // DWORD dwData; // LPCTSTR pszToolTipText; // } ButtonToolTipTable; // // where: // // dwData - value associated with button // pszToolTipText - tooltip text // // nElements - the number of elements in the array Tooltips can be retrieved using: ButtonToolTipMap* GetToolTipTextTable(); 4) The ultimate goal of using Popup Bar control is to provide the way user can pick on of displayed buttons (items). We call picked item as selected and you can get and programmatically set selected item using next function: void SetSelectedData(DWORD dwSelected); // --- Effect : set selected button using data associated with it DWORD GetSelectedData(); // --- Returns: data associated with selected button 5) Popup Bar control reminds modal dialog by functionality so we decided to provide function similar to CDialog::DoModal() function to display the control: virtual BOOL Pick(UINT nAlignment=ID_POPUPBAR_ALIGNBOTTOM, CRect* pParentRect=NULL, CSize sizeOffset=CSize(0,0)); // --- In : nAlignment - popup bar control alignment relatively to pParentRect // rectangle if it's not NULL or to parent window rectangle // otherwise. Can be one of: // // ID_POPUPBAR_ALIGNLEFT - control's window RightTop will // be displayed at the LeftBottom // point of relative rectangle // ID_POPUPBAR_ALIGNRIGHT - control's window LeftTop will // be displayed at the RightTop // point of relative rectangle // ID_POPUPBAR_ALIGNTOP - control's window LeftBottom will // be displayed at the LeftTop // point of relative rectangle // ID_POPUPBAR_ALIGNBOTTOM - control's window LeftTop will be // displayed at the LeftBottom // point of relative rectangle // // pParentRect - if it's not NULL then it will be used as relative // rectangle to position popup bar // sizeOffset - size of popup bar window position offset // --- Returns: TRUE if user selects any button, or FALSE otherwise // --- Effect : Displays popup bar control. To get data of selected button call // GetSelectedData function And here is an example of displaying of any Popup Bar control: COXPopupBarCtrl Picker; if(Picker.Create(this)) { if(Picker.Pick(ID_POPUPBAR_ALIGNBOTTOM)) { DWORD nData=Picker.GetSelectedData(); } } 6) In order to provide graphical representation of buttons in your derived class you'd probably need to overwrite next virtual functions: virtual void DrawButton(CDC* pDC, UINT nIndex); virtual void DrawDefaultButton(CDC* pDC); virtual void DrawCustomButton(CDC* pDC); virtual void DrawFrameRect(CDC* pDC, CRect& rect, UINT nIndex); // pDC - device context to draw in // nIndex - index of button to be drawn Wnen Custom button is pressed next virtual function is called: virtual BOOL OnCustomButton(); Overwrite it too in order to provide your own handling of custom button in derived class. 7) Next helper functions are defined: BOOL IsToolTip(); // --- Returns: TRUE if tooltips will be displayed or FALSE otherwise BOOL IsDefaultButton(); // --- Returns: TRUE if default button will be displayed or FALSE otherwise BOOL IsCustomButton(); // --- Returns: TRUE if custom button will be displayed or FALSE otherwise 8) As long as COXPopupBarCtrl is a generic class and you are hardly going to use it in you applications directly it's good idea to take look at the PopupBar sample that resides in .\Samples\gui\PopupBar subdirectory of your Ultimate Toolbox directory that provides an example of a number of COXPopupBarCtrl derived controls. And, of course, I should mention that our Color Picker Control (COXColorPickerCtrl class) is derived from COXPopupBarCtrl. */ #if !defined(_OXPOPUPBARCTRL_H_) #define _OXPOPUPBARCTRL_H_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "OXDllExt.h" #include "OXMainRes.h" #ifndef __AFXTEMPL_H__ #include #define __AFXTEMPL_H__ #endif // OXPopupBarCtrl.h : header file // // timer for checking mouse position #define IDT_OXPB_CHECKMOUSE 243 #define ID_OXPB_CHECKMOUSE_DELAY 200 // popup bar styles // // tooltip won't be displayed #define POPUPBAR_NOTOOLTIP 0x00000001 // default button won't be displayed #define POPUPBAR_NODEFAULT 0x00000002 // custom button won't be displayed #define POPUPBAR_NOCUSTOM 0x00000004 // reserved for future #define POPUPBAR_NOFLAT 0x00000008 // popup bar cannot be "torn-off" #define POPUPBAR_NOTEAROFF 0x00000010 // special data value specifies that none was chosen #define ID_POPUPBAR_DATA_NONE 0xffffffff // special index specifies that none was chosen #define ID_POPUPBAR_INDEX_NONE 0xffffffff // max number of buttons in the control #define ID_POPUPBAR_MAX_BUTTONS 256 // control's alignment // // control's window RightTop will be displayed at the LeftTop point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNLEFT 0x00000000 // control's window LeftTop will be displayed at the RightTop point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNRIGHT 0x00000001 // control's window LeftBottom will be displayed at the LeftTop point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNTOP 0x00000002 // control's window LeftTop will be displayed at the LeftBottom point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNBOTTOM 0x00000003 // control's window RightBottom will be displayed at the LeftBottom point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNLEFTBOTTOM 0x00000004 // control's window LeftBottom will be displayed at the RightBottom point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNRIGHTBOTTOM 0x00000005 // control's window RightBottom will be displayed at the RightTop point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNTOPRIGHT 0x00000006 // control's window RightTop will be displayed at the RightBottom point of parent window // or rect specified in COXPopupBarCtrl::Pick function #define ID_POPUPBAR_ALIGNBOTTOMRIGHT 0x00000007 // structure used to provide tooltips for buttons where // dwData - value associated with button // nID - tooltip text resource ID // typedef struct { DWORD dwData; int nID; } ButtonToolTipIDTable; // structure used to provide tooltips for buttons where // dwData - value associated with button // pszToolTipText - tooltip text // typedef struct { DWORD dwData; LPCTSTR pszToolTipText; } ButtonToolTipTable; // map array for tooltips typedef CMap ButtonToolTipMap; // array for data associated with buttons typedef CArray ButtonDataTable; // array for buttons rectangles typedef CArray ButtonRectTable; ///////////////////////////////////////////////////////////////////////////// // COXPopupBarCtrl window class OX_CLASS_DECL COXPopupBarCtrl : public CWnd { // Construction public: // --- In : nButtons - number of buttons in the popup bar (doesn't // include default and custom buttons) // nRows - number of button rows (cannot be more than the // number of buttons) // dwDefault - value to be associated with default button // sizeButton - size of buttons (not applicable for default and // custom buttons their size are calculated // automatically and depend on the size of // Popup Bar window) // sDefaultButtonText - text to be drawn on default button // sCustomButtonText - text to be drawn on custom button // nIDdefault - text resource ID to be drawn on // default button // nIDcustom - text resource ID to be drawn on // custom button // // --- Out : // --- Returns: // --- Effect : Constructs the object COXPopupBarCtrl(UINT nButtons, UINT nRows, DWORD dwDefault, CSize sizeButton, CString sDefaultButtonText, CString sCustomButtonText); COXPopupBarCtrl(UINT nButtons=20, UINT nRows=4, DWORD dwDefault=ID_POPUPBAR_DATA_NONE, CSize sizeButton=CSize(18,18), int nIDdefault=IDS_OX_BROWSECLRDEFAULT, int nIDcustom=IDS_OX_BROWSECLRCUSTOM); // Data protected: // array of data of buttons to be displayed ButtonDataTable m_arrData; // the number of common buttons shown in the control UINT m_nButtons; // the number of lines to use to display common buttons UINT m_nRows; // style of popup bar control // that defines control's appearance; UINT m_nPopupBarStyle; // array of tooltips // you can provide your own array of tooltips ButtonToolTipMap m_arrToolTipText; // control to display tooltips CToolTipCtrl m_ctlToolTip; // data of initially selected button DWORD m_dwSelected; // data associated with default button DWORD m_dwDefault; // size of common buttons CSize m_sizeButton; // text displayed on default button CString m_sDefaultButtonText; // text displayed on custom button CString m_sCustomButtonText; // Tooltip text displayed when mouse over tearoff bar CString m_sTearoffText; // Caption when the control is floating CString m_sCaption; // font used to draw text on buttons CFont m_font; // parent window CWnd* m_pParentWnd; // palette for 256-color displays CPalette m_CustomPalette; // last window message to be routed MSG m_lastMsg; // timer used to check the mouse position UINT_PTR m_nCheckMouseTimer; // flag that specified if current index should be updated during // checking mouse position BOOL m_bCheckMousePos; // coordinate of the last mouse position CPoint m_ptLastMousePos; // tracking bar, used when converting to floating state // CDC* m_pTrackingDC; // coordinate of the moving track bar CPoint m_ptLastTrack; // coordinate of the tracking rectangle CRect m_rectTrackBar; // last saved coordinate of the tracking rectangle CRect m_rectLastTrackBar; // last used thickness of the tracking rectangle CSize m_sizeLastTrackBar; // flag that specifies that last time when tracking bar was drawn // the dithered brush has been used BOOL m_bDitherLast; // ///////////////////////////////////////////////// ////////////////////////////////////////////// // data for inner use // Messages sent to popup bar window // // hide popup bar control and return TRUE from Pick function static UINT m_nOkMessage; // hide popup bar control and return FALSE from Pick function static UINT m_nCancelMessage; // hide popup bar control and call virtual OnCustomButton function. // Result of OnCustomButton function is used as a result of Pick function static UINT m_nCustomButtonPicked; // convert popup bar control to floating static UINT m_nTearoffMessage; // different margins we use to draw buttons on the control // // margin for window's edge CRect m_rectEdgeMargin; // margin for Common Buttons CRect m_rectButtonMargin; // margin for Default Button CRect m_rectDefaultButtonMargin; // margin for Custom Button CRect m_rectCustomButtonMargin; // margin for Tear off Bar CRect m_rectTearoffBarMargin; // selected button (non zero based index) // if m_nSelectedIndex=0 then default is selected // if m_nSelectedIndex=m_nButtons+1 then Custom is selected UINT m_nSelectedIndex; // current index (mouse is over or user moved to using keyboard) UINT m_nCurrentIndex; // window rect to place control (screen coordinates) CRect m_rect; // size of button to display Default button (client coordinates) CRect m_rectDefaultButton; // size of button to display Custom button (client coordinates) CRect m_rectCustomButton; // size of tear off bar (client coordinates) CRect m_rectTearoffBar; // to make thing really easy we introduce array of rects for all // Common Buttons on the control (client coordinates) ButtonRectTable m_arrButtonRect; // if true - mouse button (left or right) is pressed BOOL m_bMouseButtonPressed; // if true - mouse button was clicked in tear off bar BOOL m_bClickedInTearoffBar; // if true - menu has been torn off and is floating BOOL m_bFloating; // m_nState = 0 - control is active // m_nState = 1 - user selected some color // m_nState = 2 - user left control without selecting any color // m_nState = 3 - custom button was pressed UINT m_nState; // Attributes public: // --- In : // --- Out : // --- Returns: TRUE if tooltips will be displayed or FALSE otherwise // --- Effect : inline BOOL IsToolTip() const { return !(m_nPopupBarStyle & POPUPBAR_NOTOOLTIP); } // --- In : // --- Out : // --- Returns: TRUE if default button will be displayed or FALSE otherwise // --- Effect : inline BOOL IsDefaultButton() const { return !(m_nPopupBarStyle & POPUPBAR_NODEFAULT); } // --- In : // --- Out : // --- Returns: TRUE if custom button will be displayed or FALSE otherwise // --- Effect : inline BOOL IsCustomButton() const { return !(m_nPopupBarStyle & POPUPBAR_NOCUSTOM); } // --- In : // --- Out : // --- Returns: reserved for future use // --- Effect : inline BOOL IsFlat() const { return !(m_nPopupBarStyle & POPUPBAR_NOFLAT); } // --- In : // --- Out : // --- Returns: TRUE if popup bar can be torn-off or FALSE otherwise // --- Effect : inline BOOL IsTearOff() const { return !(m_nPopupBarStyle&POPUPBAR_NOTEAROFF) && !m_bFloating; } // --- In : // --- Out : // --- Returns: TRUE if popup bar is floating // --- Effect : inline BOOL IsFloating() const { return m_bFloating; } // Operations public: // --- In : pParentWnd - pointer to the parent window. // nPopupBarStyle - popup bar style. Can be any combination of: // POPUPBAR_NOTOOLTIP - tooltip won't be // displayed // POPUPBAR_NODEFAULT - default button won't // be displayed // POPUPBAR_NOCUSTOM - custom button won't // be displayed // POPUPBAR_NOFLAT - reserved for future use // POPUPBAR_NOTEAROFF - "Tear-off" is not available // --- Out : // --- Returns: reserved TRUE if succeed or FALSE otherwise // --- Effect : Creates popup bar control. After creation you can change whatever // control's attributes you want. To display control call Pick function BOOL Create(CWnd* pParentWnd, UINT nPopupBarStyle=POPUPBAR_NOTEAROFF, HBRUSH hbrBackground=NULL); // --- In : nAlignment - popup bar control alignment relatively to pParentRect // rectangle if it's not NULL or to parent window rectangle // otherwise. Can be one of: // // ID_POPUPBAR_ALIGNLEFT - control's window RightTop will // be displayed at the LeftBottom // point of relative rectangle // ID_POPUPBAR_ALIGNRIGHT - control's window LeftTop will // be displayed at the RightTop // point of relative rectangle // ID_POPUPBAR_ALIGNTOP - control's window LeftBottom will // be displayed at the LeftTop // point of relative rectangle // ID_POPUPBAR_ALIGNBOTTOM - control's window LeftTop will be // displayed at the LeftBottom // point of relative rectangle // ID_POPUPBAR_ALIGNLEFTBOTTOM - control's window // RightBottom will be // displayed at the LeftBottom // point of relative rectangle // ID_POPUPBAR_ALIGNRIGHTBOTTOM- control's window // LeftBottom will // be displayed at the RightBottom // point of relative rectangle // ID_POPUPBAR_ALIGNTOPRIGHT - control's window RightBottom // will be displayed at the RightTop // point of relative rectangle // ID_POPUPBAR_ALIGNBOTTOMRIGHT- control's window RightTop // will be displayed at the // RightBottom point of // relative rectangle // // pParentRect - if it's not NULL then it will be used as relative // rectangle to position popup bar // sizeOffset - size of popup bar window position offset // --- Out : // --- Returns: TRUE if user selects any button, or FALSE otherwise // --- Effect : Displays popup bar control. To get data of selected button call // GetSelectedData function virtual BOOL Pick(UINT nAlignment=ID_POPUPBAR_ALIGNBOTTOM, CRect* pParentRect=NULL, CSize sizeOffset=CSize(0,0)); // --- In : arrData - array of DWORD elements // nElements - the number of elements in the array // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : sets array of common buttons data BOOL SetButtonDataTable(DWORD* arrData, UINT nElements); // --- In : arrData - CArray of DWORD elements. // ButtonDataTable is defined as: // // typedef CArray ButtonDataTable; // // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : set array of common buttons data BOOL SetButtonDataTable(ButtonDataTable& arrData); // --- In : // --- Out : // --- Returns: pointer to array of common buttons data // --- Effect : get array of common buttons data inline ButtonDataTable* GetButtonDataTable() { return &m_arrData; } // --- In : nButtons - number of buttons. It cannot be more than // ID_POPUPBAR_MAX_BUTTONS // --- Out : // --- Returns: // --- Effect : set number of common buttons in the control inline void SetNumButtons(UINT nButtons) { if(IsFloating()) SendNotification(m_nCancelMessage); ASSERT(nButtons<=ID_POPUPBAR_MAX_BUTTONS && nButtons>0); m_nButtons=nButtons; } // --- In : // --- Out : // --- Returns: number of common buttons in the control // --- Effect : inline UINT GetNumButtons() const { return m_nButtons; } // --- In : nRows - number of rows. It cannot be more than // ID_POPUPBAR_MAX_BUTTONS // --- Out : // --- Returns: // --- Effect : set number of rows of common buttons in the control inline void SetNumRows(UINT nRows) { if(IsFloating()) SendNotification(m_nCancelMessage); ASSERT(nRows<=ID_POPUPBAR_MAX_BUTTONS && nRows>0); m_nRows=nRows; } // --- In : // --- Out : // --- Returns: number of rows of common buttons in the control // --- Effect : inline UINT GetNumRows() const { return m_nRows; } // --- In : // --- Out : // --- Returns: number of columns of common buttons in the control // --- Effect : UINT GetNumColumns() const; // --- In : arrToolTipText - ButtonToolTipMap map array. // ButtonToolTipMap is defined as: // // typedef CMap ButtonToolTipMap; // // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : set array of tooltips associated with common buttons BOOL SetToolTipTextTable(ButtonToolTipMap& arrToolTipText); // --- In : arrToolTipText - array of ButtonToolTipTable structure elements. // This structure is defined as: // // typedef struct { // DWORD dwData; // LPCTSTR pszToolTipText; // } ButtonToolTipTable; // // where: // // dwData - value associated with button // pszToolTipText - tooltip text // // nElements - the number of elements in the array // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : set array of tooltips associated with common buttons BOOL SetToolTipTextTable(ButtonToolTipTable* arrToolTipText, UINT nElements); // --- In : arrToolTipText - array of ButtonToolTipIDTable structure // elements. This structure is defined as: // // typedef struct { // DWORD dwData; // int nID; // } ButtonToolTipTable; // // where: // // dwData - value associated with button // nID - tooltip text resource ID // // nElements - the number of elements in the array // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : set array of tooltips associated with common buttons BOOL SetToolTipTextIDTable(ButtonToolTipIDTable* arrToolTipText, UINT nElements); // --- In : // --- Out : // --- Returns: pointer to ButtonToolTipMap of tooltips // --- Effect : get array of tooltips associated with common buttons inline ButtonToolTipMap* GetToolTipTextTable() { return &m_arrToolTipText; } // --- In : nPopupBarStyle - popup bar style. // Can be any combination of: // // POPUPBAR_NOTOOLTIP - tooltip won't be // displayed // POPUPBAR_NODEFAULT - default button won't // be displayed // POPUPBAR_NOCUSTOM - custom button won't // be displayed // POPUPBAR_NOFLAT - reserved for future use // POPUPBAR_NOTEAROFF - "Tear-off" is not available // --- Out : // --- Returns: // --- Effect : set control specific styles inline void SetPopupBarStyle(UINT nPopupBarStyle) { m_nPopupBarStyle=nPopupBarStyle; } // --- In : // --- Out : // --- Returns: control specific styles // --- Effect : inline UINT GetPopupBarStyle() const { return m_nPopupBarStyle; } // --- In : dwSelected - value associated with button // --- Out : // --- Returns: // --- Effect : set selected button using data associated with it inline void SetSelectedData(DWORD dwSelected) { m_dwSelected=dwSelected; } // --- In : // --- Out : // --- Returns: data associated with selected button // --- Effect : inline DWORD GetSelectedData() const { return m_dwSelected; } // --- In : dwDefault - value associated with button // --- Out : // --- Returns: // --- Effect : set the data of default button inline void SetDefaultData(DWORD dwDefault) { m_dwDefault=dwDefault; } // --- In : // --- Out : // --- Returns: data associated with default button // --- Effect : inline DWORD GetDefaultData() const { return m_dwDefault; } // --- In : sizeButton - common button size // --- Out : // --- Returns: // --- Effect : set common button size inline void SetButtonSize(CSize sizeButton) { m_sizeButton=sizeButton; } // --- In : // --- Out : // --- Returns: common button size // --- Effect : inline CSize GetButtonSize() const { return m_sizeButton; } // --- In : sText - text to be displayed in default button // --- Out : // --- Returns: // --- Effect : set default button text inline void SetDefaultButtonText(const CString& sText) { m_sDefaultButtonText=sText; } // --- In : // --- Out : // --- Returns: default button text // --- Effect : inline CString GetDefaultButtonText() const { return m_sDefaultButtonText; } // --- In : sText - text to be displayed in custom button // --- Out : // --- Returns: // --- Effect : set default button text inline void SetCustomButtonText(const CString& sText) { m_sCustomButtonText=sText; } // --- In : // --- Out : // --- Returns: custom button text // --- Effect : inline CString GetCustomButtonText() const { return m_sCustomButtonText; } // --- In : sText - text to be displayed in caption when popup bar // is floating // --- Out : // --- Returns: // --- Effect : sets caption text inline void SetCaptionText(CString sText) { m_sCaption=sText; } // --- In : // --- Out : // --- Returns: text displayed in caption when a popup bar is floating // --- Effect : inline CString GetCaptionText() const { return m_sCaption; } // --- In : sText - tooltip text displayed when mouse over tearoff bar // --- Out : // --- Returns: // --- Effect : sets caption text inline void SetTearoffText(CString sText) { m_sTearoffText=sText; } // --- In : // --- Out : // --- Returns: tooltip text displayed when mouse over tearoff bar // --- Effect : inline CString GetTearoffText() const { return m_sTearoffText; } // --- In : pFont - pointer to CFont object // --- Out : // --- Returns: // --- Effect : set font to draw text in buttons BOOL SetTextFont(CFont* pFont); // --- In : // --- Out : // --- Returns: pointer to the font used to draw text in buttons (if doesnt set // returns NULL) // --- Effect : inline CFont* GetTextFont() { return (HFONT)m_font==NULL ? NULL : &m_font; } // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(COXPopupBarCtrl) public: virtual BOOL PreTranslateMessage(MSG* pMsg); //}}AFX_VIRTUAL public: virtual ~COXPopupBarCtrl(); // implementation protected: // calculate size of window and location of default and // custom buttons within the control BOOL CalcWindowSize(); // user for sure want to control displaying of the control BOOL AdjustWindowPosition(UINT nAlignment=ID_POPUPBAR_ALIGNBOTTOM, CRect* pParentRect=NULL, CSize sizeMargin=CSize(0,0)); // find index of button in the control // 0 - default button // 1 ... m_nButtons - common button(s) // m_nButtons+1 - custom button UINT GetIndexFromData(DWORD dwData); UINT GetIndexFromPoint(CPoint point); // returns index of the first button on the control UINT GetFirstButtonIndex(); // returns index of the last button on the control UINT GetLastButtonIndex(); void RedrawElement(UINT nIndex); // --- In : // --- Out : // --- Returns: BOOL if succeed or FALSE otherwise // --- Effect : physically set tooltips to every button on the control including // default and custom buttons BOOL PopulateToolTip(); // converts the popup bar ctrl to a tear off bar control BOOL ConvertToTearOff(); // Sends a message to either this window (not floating), // or the parent (if floating) void SendNotification(UINT nMessage); // functions that implement tracking functionality void MoveTrackBar(CPoint pt); BOOL TrackBar(); void EndTrackBar(); void CancelTrackBar(); void DrawTrackingRect(BOOL bRemoveRect); ////////////////////////////////////////////// // overwrite next functions in your derived class to provide your // own drawing routines // // pDC - device context to draw in // nIndex - index of button to be drawn // virtual void DrawBackground(CDC* pDC); virtual void DrawButton(CDC* pDC, UINT nIndex); virtual void DrawTearoffBar(CDC* pDC); virtual void DrawDefaultButton(CDC* pDC); virtual void DrawCustomButton(CDC* pDC); virtual void DrawFrameRect(CDC* pDC, CRect& rect, UINT nIndex); ////////////////////////////////////////////////////////////////// virtual void OnMouseButtonDown(CPoint point); virtual void OnMouseButtonUp(CPoint point); // overwrite next function to provide your own handling of custom button in derived class virtual BOOL OnCustomButton(); // called every time current index being changed virtual void OnChangeCurrentIndex(UINT newCurrentIndex); // called every time selected index being changed virtual void OnChangeSelectedIndex(UINT newSelectedIndex); // Generated message map functions protected: //{{AFX_MSG(COXPopupBarCtrl) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnPaint(); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnQueryNewPalette(); afx_msg void OnPaletteChanged(CWnd* pFocusWnd); afx_msg void OnClose(); afx_msg void OnDestroy(); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); afx_msg void OnTimer(UINT nIDEvent); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg LRESULT OnFloatStatus(WPARAM wParam, LPARAM lParam); afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpcs); afx_msg BOOL OnNcActivate(BOOL bActive); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(_OXPOPUPBARCTRL_H_)