diff options
author | Andrew <forkk@forkk.net> | 2013-12-09 12:04:05 -0600 |
---|---|---|
committer | Andrew <forkk@forkk.net> | 2013-12-09 12:04:05 -0600 |
commit | 7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c (patch) | |
tree | 52097b57dc7d18ec4e35ef3a8e554af2d91545e8 /mmc_updater/depends/win32cpp/rebar.h | |
parent | 9410dd042ea62224fa3e0eb3b525abbdf0c316ee (diff) | |
parent | 220e07aef4a34dca9f31ae0c5bb994e5c594125d (diff) | |
download | MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.gz MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.lz MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.tar.xz MultiMC-7f52bed9e3f559adcbcf3f3c1c7ac2251964db8c.zip |
Merge branch 'feature_updater' into develop
Diffstat (limited to 'mmc_updater/depends/win32cpp/rebar.h')
-rw-r--r-- | mmc_updater/depends/win32cpp/rebar.h | 709 |
1 files changed, 709 insertions, 0 deletions
diff --git a/mmc_updater/depends/win32cpp/rebar.h b/mmc_updater/depends/win32cpp/rebar.h new file mode 100644 index 00000000..1a339dca --- /dev/null +++ b/mmc_updater/depends/win32cpp/rebar.h @@ -0,0 +1,709 @@ +// Win32++ Version 7.2 +// Released: 5th AUgust 2011 +// +// David Nash +// email: dnash@bigpond.net.au +// url: https://sourceforge.net/projects/win32-framework +// +// +// Copyright (c) 2005-2011 David Nash +// +// Permission is hereby granted, free of charge, to +// any person obtaining a copy of this software and +// associated documentation files (the "Software"), +// to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, +// merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom +// the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice +// shall be included in all copies or substantial portions +// of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +// OR OTHER DEALINGS IN THE SOFTWARE. +// +//////////////////////////////////////////////////////// + + +#ifndef _WIN32XX_REBAR_H_ +#define _WIN32XX_REBAR_H_ + +#include "wincore.h" +#include "gdi.h" + + +namespace Win32xx +{ + + struct ReBarTheme + { + BOOL UseThemes; // TRUE if themes are used + COLORREF clrBkgnd1; // Colour 1 for rebar background + COLORREF clrBkgnd2; // Colour 2 for rebar background + COLORREF clrBand1; // Colour 1 for rebar band background. Use NULL if not required + COLORREF clrBand2; // Colour 2 for rebar band background. Use NULL if not required + BOOL FlatStyle; // Bands are rendered with flat rather than raised style + BOOL BandsLeft; // Position bands left on rearrange + BOOL LockMenuBand; // Lock MenuBar's band in dedicated top row, without gripper + BOOL RoundBorders; // Use rounded band borders + BOOL ShortBands; // Allows bands to be shorter than maximum available width + BOOL UseLines; // Displays horizontal lines between bands + }; + + //////////////////////////////////// + // Declaration of the CReBar class + // + class CReBar : public CWnd + { + public: + CReBar(); + virtual ~CReBar(); + + // Operations + BOOL DeleteBand(const int nBand) const; + int HitTest(RBHITTESTINFO& rbht); + HWND HitTest(POINT pt); + int IDToIndex(UINT uBandID) const; + BOOL InsertBand(const int nBand, REBARBANDINFO& rbbi) const; + BOOL IsBandVisible(int nBand) const; + void MaximizeBand(UINT uBand, BOOL fIdeal = FALSE); + void MinimizeBand(UINT uBand); + BOOL MoveBand(UINT uFrom, UINT uTo); + void MoveBandsLeft(); + BOOL ResizeBand(const int nBand, const CSize& sz) const; + BOOL ShowGripper(int nBand, BOOL fShow) const; + BOOL ShowBand(int nBand, BOOL fShow) const; + BOOL SizeToRect(CRect& rect) const; + + // Attributes + int GetBand(const HWND hWnd) const; + CRect GetBandBorders(int nBand) const; + int GetBandCount() const; + BOOL GetBandInfo(const int nBand, REBARBANDINFO& rbbi) const; + CRect GetBandRect(int i) const; + UINT GetBarHeight() const; + BOOL GetBarInfo(REBARINFO& rbi) const; + HWND GetMenuBar() {return m_hMenuBar;} + ReBarTheme& GetReBarTheme() {return m_Theme;} + UINT GetRowCount() const; + int GetRowHeight(int nRow) const; + UINT GetSizeofRBBI() const; + HWND GetToolTips() const; + BOOL SetBandBitmap(const int nBand, const CBitmap* pBackground) const; + BOOL SetBandColor(const int nBand, const COLORREF clrFore, const COLORREF clrBack) const; + BOOL SetBandInfo(const int nBand, REBARBANDINFO& rbbi) const; + BOOL SetBarInfo(REBARINFO& rbi) const; + void SetMenuBar(HWND hMenuBar) {m_hMenuBar = hMenuBar;} + void SetReBarTheme(ReBarTheme& Theme); + + protected: + //Overridables + virtual BOOL OnEraseBkgnd(CDC* pDC); + virtual void PreCreate(CREATESTRUCT& cs); + virtual void PreRegisterClass(WNDCLASS &wc); + virtual LRESULT WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam); + + private: + CReBar(const CReBar&); // Disable copy construction + CReBar& operator = (const CReBar&); // Disable assignment operator + + ReBarTheme m_Theme; + BOOL m_bIsDragging; + HWND m_hMenuBar; + LPARAM m_Orig_lParam; + }; + +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +namespace Win32xx +{ + + /////////////////////////////////// + // Definitions for the CReBar class + // + inline CReBar::CReBar() : m_bIsDragging(FALSE), m_hMenuBar(0), m_Orig_lParam(0L) + { + ZeroMemory(&m_Theme, sizeof(ReBarTheme)); + } + + inline CReBar::~CReBar() + { + } + + inline BOOL CReBar::DeleteBand(int nBand) const + // Deletes a band from a rebar control. + { + assert(::IsWindow(m_hWnd)); + return (BOOL)SendMessage(RB_DELETEBAND, nBand, 0L); + } + + inline int CReBar::GetBand(HWND hWnd) const + // Returns the zero based band number for this window handle + { + assert(::IsWindow(m_hWnd)); + + int nResult = -1; + if (NULL == hWnd) return nResult; + + for (int nBand = 0; nBand < GetBandCount(); ++nBand) + { + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_CHILD; + GetBandInfo(nBand, rbbi); + if (rbbi.hwndChild == hWnd) + nResult = nBand; + } + + return nResult; + } + + inline CRect CReBar::GetBandBorders(int nBand) const + // Retrieves the borders of a band. + { + assert(::IsWindow(m_hWnd)); + + CRect rc; + SendMessage(RB_GETBANDBORDERS, nBand, (LPARAM)&rc); + return rc; + } + + inline int CReBar::GetBandCount() const + // Retrieves the count of bands currently in the rebar control. + { + assert(::IsWindow(m_hWnd)); + return (int)SendMessage(RB_GETBANDCOUNT, 0L, 0L); + } + + inline BOOL CReBar::GetBandInfo(int nBand, REBARBANDINFO& rbbi) const + // Retrieves information about a specified band in a rebar control. + { + assert(::IsWindow(m_hWnd)); + assert(nBand >= 0); + + // REBARBANDINFO describes individual BAND characteristics + rbbi.cbSize = GetSizeofRBBI(); + return (BOOL)SendMessage(RB_GETBANDINFO, nBand, (LPARAM)&rbbi); + } + + inline CRect CReBar::GetBandRect(int i) const + // Retrieves the bounding rectangle for a given band in a rebar control. + { + assert(::IsWindow(m_hWnd)); + CRect rc; + SendMessage(RB_GETRECT, i, (LPARAM)&rc); + return rc; + } + + inline UINT CReBar::GetBarHeight() const + // Retrieves the height of the rebar control. + { + assert(::IsWindow(m_hWnd)); + return (UINT)SendMessage(RB_GETBARHEIGHT, 0L, 0L); + } + + inline BOOL CReBar::GetBarInfo(REBARINFO& rbi) const + // Retrieves information about the rebar control and the image list it uses. + { + assert(::IsWindow(m_hWnd)); + + // REBARINFO describes overall rebar control characteristics + rbi.cbSize = GetSizeofRBBI(); + return (BOOL)SendMessage(RB_GETBARINFO, 0L, (LPARAM)&rbi); + } + + inline UINT CReBar::GetRowCount() const + // Retrieves the number of rows of bands in a rebar control. + { + assert(::IsWindow(m_hWnd)); + return (UINT)SendMessage(RB_GETROWCOUNT, 0L, 0L); + } + + inline int CReBar::GetRowHeight(int nRow) const + // Retrieves the height of a specified row in a rebar control. + { + assert(::IsWindow(m_hWnd)); + return (int)SendMessage(RB_GETROWHEIGHT, nRow, 0L); + } + + inline UINT CReBar::GetSizeofRBBI() const + // The size of the REBARBANDINFO struct changes according to _WIN32_WINNT + // sizeof(REBARBANDINFO) can report an incorrect size for older Window versions, + // or newer Window version without XP themes enabled. + // Use this function to get a safe size for REBARBANDINFO. + { + assert(::IsWindow(m_hWnd)); + + UINT uSizeof = sizeof(REBARBANDINFO); + + #if defined REBARBANDINFO_V6_SIZE // only defined for VS2008 or higher + #if !defined (_WIN32_WINNT) || _WIN32_WINNT >= 0x0600 + if ((GetWinVersion() < 2600) || (GetComCtlVersion() < 610)) // Vista and Vista themes? + uSizeof = REBARBANDINFO_V6_SIZE; + #endif + #endif + + return uSizeof; + } + + inline HWND CReBar::GetToolTips() const + // Retrieves the handle to any ToolTip control associated with the rebar control. + { + assert(::IsWindow(m_hWnd)); + return (HWND)SendMessage(RB_GETTOOLTIPS, 0L, 0L); + } + + inline int CReBar::HitTest(RBHITTESTINFO& rbht) + // Determines which portion of a rebar band is at a given point on the screen, + // if a rebar band exists at that point. + { + assert(::IsWindow(m_hWnd)); + return (int)SendMessage(RB_HITTEST, 0L, (LPARAM)&rbht); + } + + inline HWND CReBar::HitTest(POINT pt) + // Return the child HWND at the given point + { + assert(::IsWindow(m_hWnd)); + + // Convert the point to client co-ordinates + ScreenToClient(pt); + + // Get the rebar band with the point + RBHITTESTINFO rbhti = {0}; + rbhti.pt = pt; + int iBand = HitTest(rbhti); + + if (iBand >= 0) + { + // Get the rebar band's hWnd + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_CHILD; + GetBandInfo(iBand, rbbi); + + return rbbi.hwndChild; + } + else + return NULL; + } + + inline int CReBar::IDToIndex(UINT uBandID) const + // Converts a band identifier to a band index in a rebar control. + { + assert(::IsWindow(m_hWnd)); + return (int)SendMessage(RB_IDTOINDEX, (WPARAM)uBandID, 0L); + } + + inline BOOL CReBar::InsertBand(int nBand, REBARBANDINFO& rbbi) const + // Inserts a new band in a rebar control. + { + assert(::IsWindow(m_hWnd)); + + rbbi.cbSize = GetSizeofRBBI(); + return (BOOL)SendMessage(RB_INSERTBAND, nBand, (LPARAM)&rbbi); + } + + inline BOOL CReBar::IsBandVisible(int nBand) const + // Returns true if the band is visible + { + assert(::IsWindow(m_hWnd)); + + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_STYLE; + GetBandInfo(nBand, rbbi); + + return !(rbbi.fStyle & RBBS_HIDDEN); + } + + inline BOOL CReBar::OnEraseBkgnd(CDC* pDC) + { + BOOL Erase = TRUE; + if (!m_Theme.UseThemes) + Erase = FALSE; + + if (!m_Theme.clrBkgnd1 && !m_Theme.clrBkgnd2 && !m_Theme.clrBand1 && !m_Theme.clrBand2) + Erase = FALSE; + + if (Erase) + { + CRect rcReBar = GetClientRect(); + int BarWidth = rcReBar.Width(); + int BarHeight = rcReBar.Height(); + + // Create and set up our memory DC + CMemDC MemDC(pDC); + MemDC.CreateCompatibleBitmap(pDC, BarWidth, BarHeight); + + // Draw to ReBar background to the memory DC + rcReBar.right = 600; + MemDC.GradientFill(m_Theme.clrBkgnd1, m_Theme.clrBkgnd2, rcReBar, TRUE); + if (BarWidth >= 600) + { + rcReBar.left = 600; + rcReBar.right = BarWidth; + MemDC.SolidFill(m_Theme.clrBkgnd2, rcReBar); + } + + if (m_Theme.clrBand1 || m_Theme.clrBand2) + { + // Draw the individual band backgrounds + for (int nBand = 0 ; nBand < GetBandCount(); ++nBand) + { + if (IsBandVisible(nBand)) + { + if (nBand != GetBand(m_hMenuBar)) + { + // Determine the size of this band + CRect rcBand = GetBandRect(nBand); + + // Determine the size of the child window + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_CHILD ; + GetBandInfo(nBand, rbbi); + CRect rcChild; + ::GetWindowRect(rbbi.hwndChild, &rcChild); + int ChildWidth = rcChild.right - rcChild.left; + + // Determine our drawing rectangle + CRect rcDraw = rcBand; + rcDraw.bottom = rcDraw.top + (rcBand.bottom - rcBand.top)/2; + int xPad = IsXPThemed()? 2: 0; + rcDraw.left -= xPad; + + // Fill the Source CDC with the band's background + CMemDC SourceDC(pDC); + SourceDC.CreateCompatibleBitmap(pDC, BarWidth, BarHeight); + CRect rcBorder = GetBandBorders(nBand); + rcDraw.right = rcBand.left + ChildWidth + rcBorder.left; + SourceDC.SolidFill(m_Theme.clrBand1, rcDraw); + rcDraw.top = rcDraw.bottom; + rcDraw.bottom = rcBand.bottom; + SourceDC.GradientFill(m_Theme.clrBand1, m_Theme.clrBand2, rcDraw, FALSE); + + // Set Curve amount for rounded edges + int Curve = m_Theme.RoundBorders? 12 : 0; + + // Create our mask for rounded edges using RoundRect + CMemDC MaskDC(pDC); + MaskDC.CreateCompatibleBitmap(pDC, BarWidth, BarHeight); + + rcDraw.top = rcBand.top; + if (!m_Theme.FlatStyle) + ::InflateRect(&rcDraw, 1, 1); + + int left = rcDraw.left; + int right = rcDraw.right; + int top = rcDraw.top; + int bottom = rcDraw.bottom; + int cx = rcDraw.right - rcBand.left + xPad; + int cy = rcDraw.bottom - rcBand.top; + + if (m_Theme.FlatStyle) + { + MaskDC.SolidFill(RGB(0,0,0), rcDraw); + MaskDC.BitBlt(left, top, cx, cy, &MaskDC, left, top, PATINVERT); + MaskDC.RoundRect(left, top, right, bottom, Curve, Curve); + } + else + { + MaskDC.SolidFill(RGB(0,0,0), rcDraw); + MaskDC.RoundRect(left, top, right, bottom, Curve, Curve); + MaskDC.BitBlt(left, top, cx, cy, &MaskDC, left, top, PATINVERT); + } + + // Copy Source DC to Memory DC using the RoundRect mask + MemDC.BitBlt(left, top, cx, cy, &SourceDC, left, top, SRCINVERT); + MemDC.BitBlt(left, top, cx, cy, &MaskDC, left, top, SRCAND); + MemDC.BitBlt(left, top, cx, cy, &SourceDC, left, top, SRCINVERT); + + // Extra drawing to prevent jagged edge while moving bands + if (m_bIsDragging) + { + CClientDC ReBarDC(this); + ReBarDC.BitBlt(rcDraw.right - ChildWidth, rcDraw.top, ChildWidth, cy, &MemDC, rcDraw.right - ChildWidth, rcDraw.top, SRCCOPY); + } + } + } + } + } + + if (m_Theme.UseLines) + { + // Draw lines between bands + for (int j = 0; j < GetBandCount()-1; ++j) + { + rcReBar = GetBandRect(j); + rcReBar.left = MAX(0, rcReBar.left - 4); + rcReBar.bottom +=2; + MemDC.DrawEdge(rcReBar, EDGE_ETCHED, BF_BOTTOM | BF_ADJUST); + } + } + + // Copy the Memory DC to the window's DC + pDC->BitBlt(0, 0, BarWidth, BarHeight, &MemDC, 0, 0, SRCCOPY); + } + + return Erase; + } + + inline void CReBar::PreCreate(CREATESTRUCT &cs) + // Sets the CREATESTRUCT paramaters prior to window creation + { + cs.style = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | + CCS_NODIVIDER | RBS_VARHEIGHT | RBS_BANDBORDERS ; + + cs.cy = 100; + } + + inline void CReBar::PreRegisterClass(WNDCLASS &wc) + { + // Set the Window Class + wc.lpszClassName = REBARCLASSNAME; + } + + inline void CReBar::MaximizeBand(UINT uBand, BOOL fIdeal /*= FALSE*/) + // Resizes a band in a rebar control to either its ideal or largest size. + { + assert(::IsWindow(m_hWnd)); + SendMessage(RB_MAXIMIZEBAND, (WPARAM)uBand, (LPARAM)fIdeal); + } + + inline void CReBar::MinimizeBand(UINT uBand) + // Resizes a band in a rebar control to its smallest size. + { + assert(::IsWindow(m_hWnd)); + SendMessage(RB_MINIMIZEBAND, (WPARAM)uBand, 0L); + } + + inline BOOL CReBar::MoveBand(UINT uFrom, UINT uTo) + // Moves a band from one index to another. + { + assert(::IsWindow(m_hWnd)); + return (BOOL)SendMessage(RB_MOVEBAND, (WPARAM)uFrom, (LPARAM)uTo); + } + + inline void CReBar::MoveBandsLeft() + // Repositions the bands so they are left justified + { + assert(::IsWindow(m_hWnd)); + + int OldrcTop = -1; + for (int nBand = GetBandCount() -1; nBand >= 0; --nBand) + { + CRect rc = GetBandRect(nBand); + if (rc.top != OldrcTop) + { + // Maximize the last band on each row + if (IsBandVisible(nBand)) + { + ::SendMessage(GetHwnd(), RB_MAXIMIZEBAND, nBand, 0L); + OldrcTop = rc.top; + } + } + } + } + + inline BOOL CReBar::ResizeBand(int nBand, const CSize& sz) const + // Sets a band's size + { + assert(::IsWindow(m_hWnd)); + + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_SIZE; + + GetBandInfo(nBand, rbbi); + rbbi.cx = sz.cx + 2; + rbbi.cxMinChild = sz.cx + 2; + rbbi.cyMinChild = sz.cy; + rbbi.cyMaxChild = sz.cy; + + return SetBandInfo(nBand, rbbi ); + } + + inline BOOL CReBar::SetBandBitmap(int nBand, const CBitmap* pBackground) const + // Sets the band's bitmaps + { + assert(::IsWindow(m_hWnd)); + assert(pBackground); + + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_STYLE; + GetBandInfo(nBand, rbbi); + rbbi.fMask |= RBBIM_BACKGROUND; + rbbi.hbmBack = *pBackground; + + return (BOOL)SendMessage(RB_SETBANDINFO, nBand, (LPARAM)&rbbi); + } + + inline BOOL CReBar::SetBandColor(int nBand, COLORREF clrFore, COLORREF clrBack) const + // Sets the band's color + // Note: No effect with XP themes enabled + // No effect if a bitmap has been set + { + assert(::IsWindow(m_hWnd)); + + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_COLORS; + rbbi.clrFore = clrFore; + rbbi.clrBack = clrBack; + + return (BOOL)SendMessage(RB_SETBANDINFO, nBand, (LPARAM)&rbbi); + } + + inline BOOL CReBar::SetBandInfo(int nBand, REBARBANDINFO& rbbi) const + // Sets the characteristics of a rebar control. + { + assert(::IsWindow(m_hWnd)); + assert(nBand >= 0); + + // REBARBANDINFO describes individual BAND characteristics0 + rbbi.cbSize = GetSizeofRBBI(); + return (BOOL)SendMessage(RB_SETBANDINFO, nBand, (LPARAM)&rbbi); + } + + inline BOOL CReBar::SetBarInfo(REBARINFO& rbi) const + // REBARINFO associates an image list with the rebar + // A band will also need to set RBBIM_IMAGE + { + assert(::IsWindow(m_hWnd)); + + rbi.cbSize = GetSizeofRBBI(); + return (BOOL)SendMessage(RB_SETBARINFO, 0L, (LPARAM)&rbi); + } + + inline void CReBar::SetReBarTheme(ReBarTheme& Theme) + { + m_Theme.UseThemes = Theme.UseThemes; + m_Theme.clrBkgnd1 = Theme.clrBkgnd1; + m_Theme.clrBkgnd2 = Theme.clrBkgnd2; + m_Theme.clrBand1 = Theme.clrBand1; + m_Theme.clrBand2 = Theme.clrBand2; + m_Theme.BandsLeft = Theme.BandsLeft; + m_Theme.LockMenuBand = Theme.LockMenuBand; + m_Theme.ShortBands = Theme.ShortBands; + m_Theme.UseLines = Theme.UseLines; + m_Theme.FlatStyle = Theme.FlatStyle; + m_Theme.RoundBorders = Theme.RoundBorders; + + if (IsWindow()) + { + if (m_Theme.LockMenuBand) + ShowGripper(GetBand(m_hMenuBar), FALSE); + else + ShowGripper(GetBand(m_hMenuBar), TRUE); + + Invalidate(); + } + } + + inline BOOL CReBar::ShowBand(int nBand, BOOL fShow) const + // Show or hide a band + { + assert(::IsWindow(m_hWnd)); + return (BOOL)SendMessage(RB_SHOWBAND, (WPARAM)nBand, (LPARAM)fShow); + } + + inline BOOL CReBar::ShowGripper(int nBand, BOOL fShow) const + // Show or hide the band's gripper + { + assert(::IsWindow(m_hWnd)); + + REBARBANDINFO rbbi = {0}; + rbbi.cbSize = GetSizeofRBBI(); + rbbi.fMask = RBBIM_STYLE; + GetBandInfo(nBand, rbbi); + if (fShow) + { + rbbi.fStyle |= RBBS_GRIPPERALWAYS; + rbbi.fStyle &= ~RBBS_NOGRIPPER; + } + else + { + rbbi.fStyle &= ~RBBS_GRIPPERALWAYS; + rbbi.fStyle |= RBBS_NOGRIPPER; + } + + return SetBandInfo(nBand, rbbi); + } + + inline BOOL CReBar::SizeToRect(CRect& rect) const + // Attempts to find the best layout of the bands for the given rectangle. + // The rebar bands will be arranged and wrapped as necessary to fit the rectangle. + { + assert(::IsWindow(m_hWnd)); + return (BOOL)SendMessage(RB_SIZETORECT, 0, (LPARAM) (LPRECT)rect); + } + + inline LRESULT CReBar::WndProcDefault(UINT uMsg, WPARAM wParam, LPARAM lParam) + { + switch (uMsg) + { + case WM_MOUSEMOVE: + if (m_Theme.UseThemes && m_Theme.LockMenuBand) + { + // We want to lock the first row in place, but allow other bands to move! + // Use move messages to limit the resizing of bands + int y = GET_Y_LPARAM(lParam); + + if (y <= GetRowHeight(0)) + return 0L; // throw this message away + } + break; + case WM_LBUTTONDOWN: + m_Orig_lParam = lParam; // Store the x,y position + m_bIsDragging = TRUE; + break; + case WM_LBUTTONUP: + if (m_Theme.UseThemes && m_Theme.LockMenuBand) + { + // Use move messages to limit the resizing of bands + int y = GET_Y_LPARAM(lParam); + + if (y <= GetRowHeight(0)) + { + // Use x,y from WM_LBUTTONDOWN for WM_LBUTTONUP position + lParam = m_Orig_lParam; + } + } + m_bIsDragging = FALSE; + break; + case UWM_GETREBARTHEME: + { + ReBarTheme& rm = GetReBarTheme(); + return (LRESULT)&rm; + } + case UWM_TOOLBAR_RESIZE: + { + HWND hToolBar = (HWND)wParam; + LPSIZE pToolBarSize = (LPSIZE)lParam; + ResizeBand(GetBand(hToolBar), *pToolBarSize); + } + break; + } + + // pass unhandled messages on for default processing + return CWnd::WndProcDefault(uMsg, wParam, lParam); + } + +} // namespace Win32xx + +#endif // #ifndef _WIN32XX_REBAR_H_ |