diff options
Diffstat (limited to 'common/persistwinpos.h')
| -rw-r--r-- | common/persistwinpos.h | 137 | 
1 files changed, 137 insertions, 0 deletions
| diff --git a/common/persistwinpos.h b/common/persistwinpos.h new file mode 100644 index 0000000..b2c6d98 --- /dev/null +++ b/common/persistwinpos.h @@ -0,0 +1,137 @@ +//  +// AUTHOR +// N. Nielsen +// +// LICENSE +// This software is in the public domain. +// +// 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 author(s) 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. +//  +// SUPPORT +// Send bug reports to: <nielsen@memberwebs.com> +// + +#ifndef __PERSISTPOSWINDOW_H__ +#define __PERSISTPOSWINDOW_H__ + +#include "regsettings.h" + +template<class T> +class CPersistPosWindow   +{ +public: +	CPersistPosWindow(LPCTSTR szPrefix) +		{ m_szPrefix = szPrefix; }; + +	bool LoadPosition(CRegSettings& settings); +	bool SavePosition(CRegSettings& settings); + +protected: +	LPCTSTR m_szPrefix;		// Prefix for Registry Entries +}; + +template <class T> +bool CPersistPosWindow<T>::LoadPosition(CRegSettings& settings) +{ +	// Pointer to the Window Class +	T* pThis = (T*)this; + +	// Init WINDOWPLACEMENT Structure +	WINDOWPLACEMENT wp; +	wp.length =	sizeof(WINDOWPLACEMENT); +	wp.flags = 0; +	wp.showCmd = SW_SHOWNA; +	// Not worrying about these for now +	// Probably okay +	wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; +	wp.ptMinPosition.x = wp.ptMinPosition.y = 0; + + +	// This prefix is used before each Registry Entry +	TCHAR sPrefix[MAX_PATH]; +	_tcsncpy(sPrefix, m_szPrefix, MAX_PATH); + +	LPTSTR sEnd = sPrefix + _tcslen(sPrefix); + +	// Load the Window Position from the registry +	_tcsncat(sPrefix, _T("_top"), MAX_PATH); +	wp.rcNormalPosition.top = settings.GetInt(sPrefix, -1); +	*sEnd = 0; _tcsncat(sPrefix, _T("_left"), MAX_PATH); +	wp.rcNormalPosition.left = settings.GetInt(sPrefix, -1); +	*sEnd = 0; _tcsncat(sPrefix, _T("_bottom"), MAX_PATH); +	wp.rcNormalPosition.bottom = settings.GetInt(sPrefix, -1); +	*sEnd = 0; _tcsncat(sPrefix, _T("_right"), MAX_PATH); +	wp.rcNormalPosition.right = settings.GetInt(sPrefix, -1); + + +	// Make sure each of them got a value from the Registry +	// If not don't proceed +	if(wp.rcNormalPosition.top != -1 && +	   wp.rcNormalPosition.left != -1 && +	   wp.rcNormalPosition.bottom != -1 && +	   wp.rcNormalPosition.right != -1) +	{ + +		// Check if on screen or not +		WINDOWPLACEMENT wpScreen; +		wpScreen.length = sizeof(WINDOWPLACEMENT); +		wpScreen.flags = 0; + +		GetWindowPlacement(GetDesktopWindow(), &wpScreen); +		 +		// See if Desktop Window and our Window Intersect +		// If not don't proceed +		RECT rcTemp; +		if(IntersectRect(&rcTemp, &wpScreen.rcNormalPosition,  +					  &wp.rcNormalPosition)) +		{ + +			// Move and Size the actual Window +			SetWindowPlacement(*pThis, &wp); +			return true; + +		} +	} + +	return false; +} + +template <class T> +bool CPersistPosWindow<T>::SavePosition(CRegSettings& settings) +{ +	// Pointer to our Window Class +	T* pThis = (T*)this; +	 +	WINDOWPLACEMENT wp; +	wp.length =	sizeof(WINDOWPLACEMENT); +	wp.flags = 0; + +	// Get the Current Placement +	GetWindowPlacement(*pThis, &wp); + +	// This prefix is used before each Registry Entry +	TCHAR sPrefix[MAX_PATH]; +	_tcsncpy(sPrefix, m_szPrefix, MAX_PATH); + +	LPTSTR sEnd = sPrefix + _tcslen(sPrefix); + + +	_tcsncat(sPrefix, _T("_top"), MAX_PATH); +	settings.WriteInt(sPrefix, wp.rcNormalPosition.top); +	*sEnd = 0; _tcsncat(sPrefix, _T("_left"), MAX_PATH); +	settings.WriteInt(sPrefix, wp.rcNormalPosition.left); +	*sEnd = 0; _tcsncat(sPrefix, _T("_bottom"), MAX_PATH); +	settings.WriteInt(sPrefix, wp.rcNormalPosition.bottom); +	*sEnd = 0; _tcsncat(sPrefix, _T("_right"), MAX_PATH); +	settings.WriteInt(sPrefix, wp.rcNormalPosition.right); + +	return true; +} + +#endif  | 
