227 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			6.5 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_STATUSBAR_H_
 | 
						|
#define _WIN32XX_STATUSBAR_H_
 | 
						|
 | 
						|
#include "wincore.h"
 | 
						|
 | 
						|
namespace Win32xx
 | 
						|
{
 | 
						|
 | 
						|
	//////////////////////////////////////
 | 
						|
	// Declaration of the CStatusBar class
 | 
						|
	//
 | 
						|
	class CStatusBar : public CWnd
 | 
						|
	{
 | 
						|
	public:
 | 
						|
		CStatusBar();
 | 
						|
		virtual ~CStatusBar() {}
 | 
						|
 | 
						|
	// Overridables
 | 
						|
		virtual void PreCreate(CREATESTRUCT& cs);
 | 
						|
		virtual void PreRegisterClass(WNDCLASS &wc);
 | 
						|
 | 
						|
	// Attributes
 | 
						|
		int GetParts();
 | 
						|
		HICON GetPartIcon(int iPart);
 | 
						|
		CRect GetPartRect(int iPart);
 | 
						|
		tString GetPartText(int iPart) const;
 | 
						|
		BOOL IsSimple();
 | 
						|
		BOOL SetPartIcon(int iPart, HICON hIcon);
 | 
						|
		BOOL SetPartText(int iPart, LPCTSTR szText, UINT Style = 0) const;
 | 
						|
		BOOL SetPartWidth(int iPart, int iWidth) const;
 | 
						|
 | 
						|
	// Operations
 | 
						|
		CStatusBar(const CStatusBar&);				// Disable copy construction
 | 
						|
		CStatusBar& operator = (const CStatusBar&); // Disable assignment operator
 | 
						|
 | 
						|
		BOOL CreateParts(int iParts, const int iPaneWidths[]) const;
 | 
						|
		void SetSimple(BOOL fSimple = TRUE);
 | 
						|
	};
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
 | 
						|
namespace Win32xx
 | 
						|
{
 | 
						|
 | 
						|
	//////////////////////////////////////
 | 
						|
	// Definitions for the CStatusBar class
 | 
						|
	//
 | 
						|
	inline CStatusBar::CStatusBar()
 | 
						|
	{
 | 
						|
	}
 | 
						|
 | 
						|
	inline BOOL CStatusBar::CreateParts(int iParts, const int iPaneWidths[]) const
 | 
						|
	// Sets the number of parts in a status window and the coordinate of the right edge of each part. 
 | 
						|
	// If an element of iPaneWidths is -1, the right edge of the corresponding part extends
 | 
						|
	//  to the border of the window
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		assert(iParts <= 256);	
 | 
						|
		
 | 
						|
		return (BOOL)SendMessage(SB_SETPARTS, iParts, (LPARAM)iPaneWidths);		
 | 
						|
	}
 | 
						|
 | 
						|
	inline int CStatusBar::GetParts()
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		return (int)SendMessage(SB_GETPARTS, 0L, 0L);
 | 
						|
	}
 | 
						|
 | 
						|
	inline HICON CStatusBar::GetPartIcon(int iPart)
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		return (HICON)SendMessage(SB_GETICON, (WPARAM)iPart, 0L);
 | 
						|
	}
 | 
						|
 | 
						|
	inline CRect CStatusBar::GetPartRect(int iPart)
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		
 | 
						|
		CRect rc;
 | 
						|
		SendMessage(SB_GETRECT, (WPARAM)iPart, (LPARAM)&rc);
 | 
						|
		return rc;
 | 
						|
	}
 | 
						|
 | 
						|
	inline tString CStatusBar::GetPartText(int iPart) const
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		tString PaneText;
 | 
						|
		
 | 
						|
		// Get size of Text array
 | 
						|
		int iChars = LOWORD (SendMessage(SB_GETTEXTLENGTH, iPart, 0L));
 | 
						|
 | 
						|
		std::vector<TCHAR> Text( iChars +1, _T('\0') );
 | 
						|
		TCHAR* pTextArray = &Text[0];
 | 
						|
 | 
						|
		SendMessage(SB_GETTEXT, iPart, (LPARAM)pTextArray);
 | 
						|
		PaneText = pTextArray;			
 | 
						|
		return PaneText;
 | 
						|
	}
 | 
						|
 | 
						|
	inline BOOL CStatusBar::IsSimple()
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		return (BOOL)SendMessage(SB_ISSIMPLE, 0L, 0L);
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CStatusBar::PreCreate(CREATESTRUCT &cs)
 | 
						|
	{
 | 
						|
		cs.style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | CCS_BOTTOM | SBARS_SIZEGRIP;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CStatusBar::PreRegisterClass(WNDCLASS &wc)
 | 
						|
	{
 | 
						|
		// Set the Window Class
 | 
						|
		wc.lpszClassName =  STATUSCLASSNAME;
 | 
						|
	}
 | 
						|
 | 
						|
	inline BOOL CStatusBar::SetPartText(int iPart, LPCTSTR szText, UINT Style) const
 | 
						|
	// Available Styles: Combinations of ...
 | 
						|
	//0					The text is drawn with a border to appear lower than the plane of the window.
 | 
						|
	//SBT_NOBORDERS		The text is drawn without borders.
 | 
						|
	//SBT_OWNERDRAW		The text is drawn by the parent window.
 | 
						|
	//SBT_POPOUT		The text is drawn with a border to appear higher than the plane of the window.
 | 
						|
	//SBT_RTLREADING	The text will be displayed in the opposite direction to the text in the parent window.
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		
 | 
						|
		BOOL bResult = FALSE;
 | 
						|
		if (SendMessage(SB_GETPARTS, 0L, 0L) >= iPart)
 | 
						|
			bResult = (BOOL)SendMessage(SB_SETTEXT, iPart | Style, (LPARAM)szText);
 | 
						|
 | 
						|
		return bResult;
 | 
						|
	}
 | 
						|
 | 
						|
	inline BOOL CStatusBar::SetPartIcon(int iPart, HICON hIcon)
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		return (BOOL)SendMessage(SB_SETICON, (WPARAM)iPart, (LPARAM) hIcon);
 | 
						|
	}
 | 
						|
 | 
						|
	inline BOOL CStatusBar::SetPartWidth(int iPart, int iWidth) const
 | 
						|
	{
 | 
						|
		// This changes the width of an existing pane, or creates a new pane
 | 
						|
		// with the specified width.
 | 
						|
		// A width of -1 for the last part sets the width to the border of the window.
 | 
						|
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		assert(iPart >= 0 && iPart <= 255);
 | 
						|
 | 
						|
		// Fill the PartWidths vector with the current width of the statusbar parts
 | 
						|
		int PartsCount = (int)SendMessage(SB_GETPARTS, 0L, 0L);
 | 
						|
		std::vector<int> PartWidths(PartsCount, 0);
 | 
						|
		int* pPartWidthArray = &PartWidths[0];
 | 
						|
		SendMessage(SB_GETPARTS, PartsCount, (LPARAM)pPartWidthArray);
 | 
						|
 | 
						|
		// Fill the NewPartWidths vector with the new width of the statusbar parts
 | 
						|
		int NewPartsCount = MAX(iPart+1, PartsCount);	
 | 
						|
		std::vector<int> NewPartWidths(NewPartsCount, 0);;
 | 
						|
		NewPartWidths = PartWidths;
 | 
						|
		int* pNewPartWidthArray = &NewPartWidths[0];
 | 
						|
		
 | 
						|
		if (0 == iPart)
 | 
						|
			pNewPartWidthArray[iPart] = iWidth;
 | 
						|
		else
 | 
						|
		{
 | 
						|
			if (iWidth >= 0)
 | 
						|
				pNewPartWidthArray[iPart] = pNewPartWidthArray[iPart -1] + iWidth;
 | 
						|
			else
 | 
						|
				pNewPartWidthArray[iPart] = -1;
 | 
						|
		}
 | 
						|
 | 
						|
		// Set the statusbar parts with our new parts count and part widths
 | 
						|
		BOOL bResult = (BOOL)SendMessage(SB_SETPARTS, NewPartsCount, (LPARAM)pNewPartWidthArray);
 | 
						|
 | 
						|
		return bResult;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void CStatusBar::SetSimple(BOOL fSimple /* = TRUE*/)
 | 
						|
	{
 | 
						|
		assert(::IsWindow(m_hWnd));
 | 
						|
		SendMessage(SB_SIMPLE, (WPARAM)fSimple, 0L);
 | 
						|
	}
 | 
						|
 | 
						|
} // namespace Win32xx
 | 
						|
 | 
						|
#endif // #ifndef _WIN32XX_STATUSBAR_H_
 |