ResizableState.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // ResizableState.cpp: implementation of the CResizableState class.
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. //
  5. // Copyright (C) 2000-2002 by Paolo Messina
  6. // (http://www.geocities.com/ppescher - ppescher@yahoo.com)
  7. //
  8. // The contents of this file are subject to the Artistic License (the "License").
  9. // You may not use this file except in compliance with the License. 
  10. // You may obtain a copy of the License at:
  11. // http://www.opensource.org/licenses/artistic-license.html
  12. //
  13. // If you find this code useful, credits would be nice!
  14. //
  15. /////////////////////////////////////////////////////////////////////////////
  16. #include "stdafx.h"
  17. #include "ResizableState.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[]=__FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. //////////////////////////////////////////////////////////////////////
  24. // Construction/Destruction
  25. //////////////////////////////////////////////////////////////////////
  26. CResizableState::CResizableState()
  27. {
  28. }
  29. CResizableState::~CResizableState()
  30. {
  31. }
  32. // used to save/restore window's size and position
  33. // either in the registry or a private .INI file
  34. // depending on your application settings
  35. #define PLACEMENT_ENT _T("WindowPlacement")
  36. #define PLACEMENT_FMT  _T("%d,%d,%d,%d,%d,%d")
  37. BOOL CResizableState::SaveWindowRect(LPCTSTR pszSection, BOOL bRectOnly)
  38. {
  39. CString data;
  40. WINDOWPLACEMENT wp;
  41. ZeroMemory(&wp, sizeof(WINDOWPLACEMENT));
  42. wp.length = sizeof(WINDOWPLACEMENT);
  43. if (!GetResizableWnd()->GetWindowPlacement(&wp))
  44. return FALSE;
  45. RECT& rc = wp.rcNormalPosition; // alias
  46. if (bRectOnly) // save size/pos only (normal state)
  47. {
  48. // use screen coordinates
  49. GetResizableWnd()->GetWindowRect(&rc);
  50. data.Format(PLACEMENT_FMT, rc.left, rc.top,
  51. rc.right, rc.bottom, SW_NORMAL, 0);
  52. }
  53. else // save also min/max state
  54. {
  55. // use workspace coordinates
  56. data.Format(PLACEMENT_FMT, rc.left, rc.top,
  57. rc.right, rc.bottom, wp.showCmd, wp.flags);
  58. }
  59. return AfxGetApp()->WriteProfileString(pszSection, PLACEMENT_ENT, data);
  60. }
  61. BOOL CResizableState::LoadWindowRect(LPCTSTR pszSection, BOOL bRectOnly)
  62. {
  63. CString data;
  64. WINDOWPLACEMENT wp;
  65. data = AfxGetApp()->GetProfileString(pszSection, PLACEMENT_ENT);
  66. if (data.IsEmpty()) // never saved before
  67. return FALSE;
  68. ZeroMemory(&wp, sizeof(WINDOWPLACEMENT));
  69. wp.length = sizeof(WINDOWPLACEMENT);
  70. if (!GetResizableWnd()->GetWindowPlacement(&wp))
  71. return FALSE;
  72. RECT& rc = wp.rcNormalPosition; // alias
  73. if (_stscanf(data, PLACEMENT_FMT, &rc.left, &rc.top,
  74. &rc.right, &rc.bottom, &wp.showCmd, &wp.flags) == 6)
  75. {
  76. if (bRectOnly) // restore size/pos only
  77. {
  78. CRect rect(rc);
  79. return GetResizableWnd()->SetWindowPos(NULL, rect.left, rect.top,
  80. rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER |
  81. SWP_NOREPOSITION);
  82. }
  83. else // restore also min/max state
  84. {
  85. return GetResizableWnd()->SetWindowPlacement(&wp);
  86. }
  87. }
  88. return FALSE;
  89. }