6aa9bd0f77
Now with some actual consensus on what the updater will do!
710 lines
20 KiB
C++
710 lines
20 KiB
C++
// 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_
|