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

多媒体编程

开发平台:

Visual C++

  1. // ResizableDialog.cpp : implementation file
  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 "ResizableDialog.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CResizableDialog
  25. inline void CResizableDialog::PrivateConstruct()
  26. {
  27. m_bEnableSaveRestore = FALSE;
  28. m_dwGripTempState = 1;
  29. }
  30. CResizableDialog::CResizableDialog()
  31. {
  32. PrivateConstruct();
  33. }
  34. CResizableDialog::CResizableDialog(UINT nIDTemplate, CWnd* pParentWnd)
  35. : CCmdUIDialog(nIDTemplate, pParentWnd)
  36. {
  37. PrivateConstruct();
  38. }
  39. CResizableDialog::CResizableDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
  40. : CCmdUIDialog(lpszTemplateName, pParentWnd)
  41. {
  42. PrivateConstruct();
  43. }
  44. CResizableDialog::~CResizableDialog()
  45. {
  46. }
  47. BEGIN_MESSAGE_MAP(CResizableDialog, CCmdUIDialog)
  48. //{{AFX_MSG_MAP(CResizableDialog)
  49. ON_WM_GETMINMAXINFO()
  50. ON_WM_SIZE()
  51. ON_WM_DESTROY()
  52. ON_WM_CREATE()
  53. ON_WM_ERASEBKGND()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CResizableDialog message handlers
  58. int CResizableDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  59. {
  60. if (__super::OnCreate(lpCreateStruct) == -1)
  61. return -1;
  62. // child dialogs don't want resizable border or size grip,
  63. // nor they can handle the min/max size constraints
  64. BOOL bChild = GetStyle() & WS_CHILD;
  65. if (!bChild)
  66. {
  67. // keep client area
  68. CRect rect;
  69. GetClientRect(&rect);
  70. // set resizable style
  71. ModifyStyle(DS_MODALFRAME, WS_POPUP | WS_THICKFRAME);
  72. // adjust size to reflect new style
  73. ::AdjustWindowRectEx(&rect, GetStyle(),
  74. ::IsMenu(GetMenu()->GetSafeHmenu()), GetExStyle());
  75. SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_FRAMECHANGED|
  76. SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOREPOSITION);
  77. // set the initial size as the min track size
  78. SetMinTrackSize(rect.Size());
  79. }
  80. // create and init the size-grip
  81. if (!CreateSizeGrip(!bChild))
  82. return -1;
  83. return 0;
  84. }
  85. void CResizableDialog::OnDestroy() 
  86. {
  87. if (m_bEnableSaveRestore)
  88. SaveWindowRect(m_sSection, m_bRectOnly);
  89. // remove child windows
  90. RemoveAllAnchors();
  91. __super::OnDestroy();
  92. }
  93. void CResizableDialog::OnSize(UINT nType, int cx, int cy) 
  94. {
  95. CWnd::OnSize(nType, cx, cy);
  96. if (nType == SIZE_MAXHIDE || nType == SIZE_MAXSHOW)
  97. return; // arrangement not needed
  98. if (nType == SIZE_MAXIMIZED)
  99. HideSizeGrip(&m_dwGripTempState);
  100. else
  101. ShowSizeGrip(&m_dwGripTempState);
  102. // update grip and layout
  103. UpdateSizeGrip();
  104. ArrangeLayout();
  105. }
  106. void CResizableDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
  107. {
  108. MinMaxInfo(lpMMI);
  109. }
  110. // NOTE: this must be called after setting the layout
  111. //       to have the dialog and its controls displayed properly
  112. void CResizableDialog::EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly)
  113. {
  114. m_sSection = pszSection;
  115. m_bEnableSaveRestore = TRUE;
  116. m_bRectOnly = bRectOnly;
  117. // restore immediately
  118. LoadWindowRect(pszSection, bRectOnly);
  119. }
  120. BOOL CResizableDialog::OnEraseBkgnd(CDC* pDC) 
  121. {
  122. // Windows XP doesn't like clipping regions ...try this!
  123. EraseBackground(pDC);
  124. return TRUE;
  125. /* ClipChildren(pDC); // old-method (for safety)
  126. return CDialog::OnEraseBkgnd(pDC);
  127. */
  128. }