summaryrefslogtreecommitdiff
path: root/Shutdown/PersistPosWindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'Shutdown/PersistPosWindow.h')
-rw-r--r--Shutdown/PersistPosWindow.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/Shutdown/PersistPosWindow.h b/Shutdown/PersistPosWindow.h
new file mode 100644
index 0000000..74aff51
--- /dev/null
+++ b/Shutdown/PersistPosWindow.h
@@ -0,0 +1,112 @@
+// PersistPosWindow.h: interface for the CPersistPosWindow class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#if !defined(AFX_PERSISTPOSWINDOW_H__7D209B81_ED68_11D3_8378_0020182B97FC__INCLUDED_)
+#define AFX_PERSISTPOSWINDOW_H__7D209B81_ED68_11D3_8378_0020182B97FC__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#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
+ string sPrefix(m_szPrefix);
+
+ // Load the Window Position from the registry
+ wp.rcNormalPosition.top = settings.GetInt(sPrefix + _T("_top"), -1);
+ wp.rcNormalPosition.left = settings.GetInt(sPrefix + _T("_left"), -1);
+ wp.rcNormalPosition.bottom = settings.GetInt(sPrefix + _T("_bottom"), -1);
+ wp.rcNormalPosition.right = settings.GetInt(sPrefix + _T("_right"), -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 goes in front of each Registry Entry
+ string sPrefix(m_szPrefix);
+
+ // Write to the registry
+ settings.WriteInt(sPrefix + _T("_top"), wp.rcNormalPosition.top);
+ settings.WriteInt(sPrefix + _T("_left"), wp.rcNormalPosition.left);
+ settings.WriteInt(sPrefix + _T("_bottom"), wp.rcNormalPosition.bottom);
+ settings.WriteInt(sPrefix + _T("_right"), wp.rcNormalPosition.right);
+
+ return true;
+}
+
+
+#endif // !defined(AFX_PERSISTPOSWINDOW_H__7D209B81_ED68_11D3_8378_0020182B97FC__INCLUDED_)