summaryrefslogtreecommitdiff
path: root/common/persistwinpos.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/persistwinpos.h')
-rw-r--r--common/persistwinpos.h137
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