--- /dev/null
+// MSJ
+// It it works contact Paul DiLascia
+// if not you're own your own
+
+#include "StdAfx.h"
+#include "WindowPlacement.h"
+
+CWindowPlacement::CWindowPlacement()
+{
+ // Note: "length" is inherited from WINDOWPLACEMENT
+ length = sizeof(WINDOWPLACEMENT);
+ m_showCmd = -1;
+}
+
+CWindowPlacement::~CWindowPlacement()
+{
+}
+
+//////////////////
+// Restore window placement from profile key
+BOOL CWindowPlacement::Restore(LPCTSTR lpKeyName, CWnd* pWnd)
+{
+ if (!GetProfileWP(lpKeyName))
+ return FALSE;
+ // Only restore if window intersets the screen.
+ //
+ CRect rcTemp;
+ CRect rcScreen(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
+ if (!::IntersectRect(&rcTemp, &rcNormalPosition, &rcScreen))
+ return FALSE;
+
+ pWnd->SetWindowPlacement(this);
+ return TRUE;
+}
+
+//////////////////
+// Get window placement from profile.
+BOOL CWindowPlacement::GetProfileWP(LPCTSTR lpKeyName)
+{
+ CWinApp *pApp = AfxGetApp();
+ ASSERT_VALID(pApp);
+
+ m_showCmd = pApp->GetProfileInt(lpKeyName, _T("wp.showCmd"), -1);
+ if (m_showCmd == -1)
+ return FALSE;
+ showCmd = m_showCmd;
+ flags = pApp->GetProfileInt(lpKeyName, _T("wp.flags"), flags);
+
+ ptMinPosition.x = pApp->GetProfileInt(lpKeyName, _T("wp.ptMinPosition.x"),ptMinPosition.x);
+ ptMinPosition.y = pApp->GetProfileInt(lpKeyName, _T("wp.ptMinPosition.y"),ptMinPosition.y);
+ ptMaxPosition.x = pApp->GetProfileInt(lpKeyName, _T("wp.ptMaxPosition.x"),ptMaxPosition.x);
+ ptMaxPosition.y = pApp->GetProfileInt(lpKeyName, _T("wp.ptMaxPosition.y"),ptMaxPosition.y);
+
+ RECT& rc = rcNormalPosition; // because I hate typing
+ rc.left = pApp->GetProfileInt(lpKeyName, _T("wp.left"), rc.left);
+ rc.right = pApp->GetProfileInt(lpKeyName, _T("wp.right"), rc.right);
+ rc.top = pApp->GetProfileInt(lpKeyName, _T("wp.top"), rc.top);
+ rc.bottom= pApp->GetProfileInt(lpKeyName, _T("wp.bottom"), rc.bottom);
+ return TRUE;
+}
+
+////////////////
+// Save window placement in app profile
+void CWindowPlacement::Save(LPCTSTR lpKeyName, CWnd* pWnd)
+{
+ pWnd->GetWindowPlacement(this);
+ WriteProfileWP(lpKeyName);
+}
+
+//////////////////
+// Write window placement to app profile
+void CWindowPlacement::WriteProfileWP(LPCTSTR lpKeyName)
+{
+ CWinApp *pApp = AfxGetApp();
+ ASSERT_VALID(pApp);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.showCmd"), showCmd);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.flags"), flags);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.ptMinPosition.x"), ptMinPosition.x);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.ptMinPosition.y"), ptMinPosition.y);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.ptMaxPosition.x"), ptMaxPosition.x);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.ptMaxPosition.y"), ptMaxPosition.y);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.left"), rcNormalPosition.left);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.right"), rcNormalPosition.right);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.top"), rcNormalPosition.top);
+ pApp->WriteProfileInt(lpKeyName, _T("wp.bottom"),rcNormalPosition.bottom);
+}
+
+// The ugly casts are required to help the VC++ 3.0 compiler decide which
+// operator<< or operator>> to use. If you're using VC++ 4.0 or later, you
+// can delete this stuff.
+//
+#if (_MSC_VER < 1000) // 1000 = VC++ 4.0
+#define UINT_CAST (LONG)
+#define UINT_CASTREF (LONG&)
+#else
+#define UINT_CAST
+#define UINT_CASTREF
+#endif
+
+//////////////////
+// Write window placement to archive
+// WARNING: archiving functions are untested.
+CArchive& operator<<(CArchive& ar, const CWindowPlacement& wp)
+{
+ ar << UINT_CAST wp.length;
+ ar << UINT_CAST wp.flags;
+ ar << UINT_CAST wp.showCmd;
+ ar << wp.ptMinPosition;
+ ar << wp.ptMaxPosition;
+ ar << wp.rcNormalPosition;
+ return ar;
+}
+
+//////////////////
+// Read window placement from archive
+// WARNING: archiving functions are untested.
+CArchive& operator>>(CArchive& ar, CWindowPlacement& wp)
+{
+ ar >> UINT_CASTREF wp.length;
+ ar >> UINT_CASTREF wp.flags;
+ ar >> UINT_CASTREF wp.showCmd;
+ ar >> wp.ptMinPosition;
+ ar >> wp.ptMaxPosition;
+ ar >> wp.rcNormalPosition;
+ return ar;
+}
+