DlgItemResizer.cpp
上传用户:sdnygcb
上传日期:2007-01-02
资源大小:18k
文件大小:4k
源码类别:

PropertySheet

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////
  2. // DlgItemResizer.cpp : implementation file
  3. //
  4. // Written by Magnus Egelberg (magnus.egelberg@lundalogik.se)
  5. // Much of this code comes from Eli Vingot (elivingt@internet-zahav.net)
  6. // 
  7. //
  8. #include "stdafx.h"
  9. #include "DlgItemResizer.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //
  16. // This struct is used to hold information
  17. // about the added controls
  18. //
  19. struct DLGITEMINFO {
  20. UINT m_uFlags;
  21. HWND m_hWnd;
  22. CRect m_rectPosition;
  23. };
  24. CDlgItemResizer::CDlgItemResizer()
  25. {
  26. m_szInitial = CSize(0,0);
  27. }
  28. CDlgItemResizer::~CDlgItemResizer()
  29. {
  30. // Make sure to delete all allocated items
  31. for (INT i = 0; i < m_Controls.GetSize(); i++)
  32. delete ((DLGITEMINFO *)m_Controls[i]);
  33. }
  34. void CDlgItemResizer::Add(CWnd *pCtrl, UINT uFlags)
  35. {
  36. // Make sure params are valid
  37. ASSERT(pCtrl != 0);
  38. ASSERT(pCtrl->GetParent() != 0);
  39. CWnd *pParent = pCtrl->GetParent();
  40. if (uFlags == 0)
  41. return; 
  42. CRect rc;
  43. pCtrl->GetWindowRect(rc);
  44. pParent->ScreenToClient(rc);
  45. DLGITEMINFO *item    = new DLGITEMINFO;
  46. item->m_uFlags       = uFlags;
  47. item->m_hWnd         = pCtrl->m_hWnd;
  48. item->m_rectPosition = rc;
  49. // Set inital size if not set
  50. if (m_szInitial.cx == 0 || m_szInitial.cy == 0) {
  51. CRect rc;
  52. pParent->GetClientRect(rc);
  53. m_szInitial = rc.Size();
  54. }
  55. // Add it to the array
  56. m_Controls.Add(item);
  57. }
  58. void CDlgItemResizer::Resize(CWnd *pWnd)
  59. {
  60. // Just return if no initial size yet
  61. if (m_szInitial.cx == 0 || m_szInitial.cy == 0)
  62. return;
  63. // Don't bother to resize minimized windows
  64. if (GetWindowLong(pWnd->m_hWnd, GWL_STYLE) & WS_MINIMIZE)
  65. return;
  66. CRect client;
  67. pWnd->GetClientRect(client);
  68. for (INT i = 0; i < m_Controls.GetSize(); i++) {
  69. DLGITEMINFO *item = (DLGITEMINFO *)m_Controls[i];
  70. CWnd *ctrl = CWnd::FromHandle(item->m_hWnd);
  71. // Invalidate the old position
  72. CRect rect;
  73. ctrl->GetWindowRect(rect);  
  74. pWnd->ScreenToClient(rect);
  75. pWnd->InvalidateRect(rect);
  76. // Get the current size of the control
  77. CSize size = rect.Size();
  78. // Set the new position according to the flags specified
  79. if ((item->m_uFlags & (RESIZE_LOCKLEFT|RESIZE_LOCKRIGHT)) == (RESIZE_LOCKLEFT|RESIZE_LOCKRIGHT)) {
  80. rect.left = item->m_rectPosition.left;
  81. rect.right = client.right - (m_szInitial.cx - item->m_rectPosition.right);
  82. }
  83. else if (item->m_uFlags & RESIZE_LOCKRIGHT) {
  84. rect.right = client.right - (m_szInitial.cx - item->m_rectPosition.right);
  85. rect.left  = rect.right - size.cx;
  86. }
  87. else if (item->m_uFlags & RESIZE_LOCKLEFT) {
  88. rect.left  = item->m_rectPosition.left;
  89. rect.right = rect.left + size.cx;
  90. }
  91. if ((item->m_uFlags & (RESIZE_LOCKTOP|RESIZE_LOCKBOTTOM)) == (RESIZE_LOCKTOP|RESIZE_LOCKBOTTOM)) {
  92. rect.top = item->m_rectPosition.top;
  93. rect.bottom = client.bottom - (m_szInitial.cy - item->m_rectPosition.bottom);
  94. }
  95. else if (item->m_uFlags & RESIZE_LOCKTOP) {
  96. rect.top = item->m_rectPosition.top;
  97. rect.bottom = rect.top + size.cy;
  98. }
  99. else if (item->m_uFlags & RESIZE_LOCKBOTTOM) {
  100. rect.bottom = client.bottom - (m_szInitial.cy - item->m_rectPosition.bottom);
  101. rect.top = rect.bottom - size.cy;
  102. }
  103. // Check if control is completely inside client, hide if not
  104. // Do this only when the RESIZE_SHOWHIDE flag is set.
  105. if (item->m_uFlags & RESIZE_SHOWHIDE) {
  106. CRect unionrect;
  107. unionrect.UnionRect(rect, client);
  108. if (unionrect != client)
  109. ctrl->ShowWindow(SW_HIDE);
  110. else {
  111. // Make sure it is visible
  112. if (!(ctrl->GetStyle() & WS_VISIBLE))
  113. ctrl->ShowWindow(SW_SHOWNORMAL);
  114. ctrl->MoveWindow(rect);
  115. }
  116. }
  117. else
  118. ctrl->MoveWindow(rect);
  119. }
  120. }