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

多媒体编程

开发平台:

Visual C++

  1. // ResizableLayout.h: interface for the CResizableLayout 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. #if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)
  17. #define AFX_RESIZABLELAYOUT_H__INCLUDED_
  18. #include <afxtempl.h>
  19. #include "ResizableMsgSupport.h"
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif // _MSC_VER > 1000
  23. // useful compatibility constants (the only one required is NOANCHOR)
  24. const CSize NOANCHOR(-1,-1),
  25. TOP_LEFT(0,0), TOP_CENTER(50,0), TOP_RIGHT(100,0),
  26. MIDDLE_LEFT(0,50), MIDDLE_CENTER(50,50), MIDDLE_RIGHT(100,50),
  27. BOTTOM_LEFT(0,100), BOTTOM_CENTER(50,100), BOTTOM_RIGHT(100,100);
  28. class CResizableLayout
  29. {
  30. protected:
  31. class LayoutInfo
  32. {
  33. public:
  34. HWND hWnd;
  35. UINT nCallbackID;
  36. CString sWndClass;
  37. // upper-left corner
  38. SIZE sizeTypeTL;
  39. SIZE sizeMarginTL;
  40. // bottom-right corner
  41. SIZE sizeTypeBR;
  42. SIZE sizeMarginBR;
  43. // custom window support
  44. BOOL bMsgSupport;
  45. RESIZEPROPERTIES properties;
  46. public:
  47. LayoutInfo() : hWnd(NULL), nCallbackID(0), bMsgSupport(FALSE)
  48. sizeTypeTL.cx = 0;
  49. sizeTypeTL.cy = 0;
  50. sizeMarginTL.cx = 0;
  51. sizeMarginTL.cy = 0;
  52. sizeTypeBR.cx = 0;
  53. sizeTypeBR.cy = 0;
  54. sizeMarginBR.cx = 0;
  55. sizeMarginBR.cy = 0;
  56. memset(&properties, 0, sizeof properties);
  57. }
  58. LayoutInfo(HWND hwnd, SIZE tl_t, SIZE tl_m, 
  59. SIZE br_t, SIZE br_m, CString classname)
  60. : hWnd(hwnd), nCallbackID(0),
  61. sWndClass(classname), bMsgSupport(FALSE),
  62. sizeTypeTL(tl_t), sizeMarginTL(tl_m),
  63. sizeTypeBR(br_t), sizeMarginBR(br_m)
  64. memset(&properties, 0, sizeof properties);
  65. }
  66. };
  67. private:
  68. // list of repositionable controls
  69. CMap<HWND, HWND, POSITION, POSITION> m_mapLayout;
  70. CList<LayoutInfo, LayoutInfo&> m_listLayout;
  71. CList<LayoutInfo, LayoutInfo&> m_listLayoutCB;
  72. void ClipChildWindow(const CResizableLayout::LayoutInfo &layout, CRgn* pRegion);
  73. void CalcNewChildPosition(const CResizableLayout::LayoutInfo &layout,
  74. const CRect &rectParent, CRect &rectChild, UINT& uFlags);
  75. protected:
  76. // override to initialize resize properties (clipping, refresh)
  77. virtual void InitResizeProperties(CResizableLayout::LayoutInfo& layout);
  78. // override to specify clipping for unsupported windows
  79. virtual BOOL LikesClipping(const CResizableLayout::LayoutInfo &layout);
  80. // override to specify refresh for unsupported windows
  81. virtual BOOL NeedsRefresh(const CResizableLayout::LayoutInfo &layout,
  82. const CRect &rectOld, const CRect &rectNew);
  83. // paint the background on the given DC (for XP theme's compatibility)
  84. void EraseBackground(CDC* pDC);
  85. // clip out child windows from the given DC (support old code)
  86. void ClipChildren(CDC* pDC);
  87. // get the clipping region (without clipped child windows)
  88. void GetClippingRegion(CRgn* pRegion);
  89. // override for scrollable or expanding parent windows
  90. virtual void GetTotalClientRect(LPRECT lpRect);
  91. // add anchors to a control, given its HWND
  92. void AddAnchor(HWND hWnd, CSize sizeTypeTL, CSize sizeTypeBR = NOANCHOR);
  93. // add anchors to a control, given its ID
  94. void AddAnchor(UINT nID, CSize sizeTypeTL, CSize sizeTypeBR = NOANCHOR)
  95. {
  96. AddAnchor(::GetDlgItem(GetResizableWnd()->GetSafeHwnd(), nID),
  97. sizeTypeTL, sizeTypeBR);
  98. }
  99. // add a callback (control ID or HWND is unknown or may change)
  100. void AddAnchorCallback(UINT nCallbackID);
  101. // get rect of an anchored window, given the parent's client area
  102. BOOL GetAnchorPosition(HWND hWnd, const CRect &rectParent,
  103. CRect &rectChild, UINT* lpFlags = NULL)
  104. {
  105. POSITION pos;
  106. if (!m_mapLayout.Lookup(hWnd, pos))
  107. return FALSE;
  108. UINT uTmpFlags;
  109. CalcNewChildPosition(m_listLayout.GetAt(pos), rectParent, rectChild,
  110. (lpFlags != NULL) ? (*lpFlags) : uTmpFlags);
  111. return TRUE;
  112. }
  113. // get rect of an anchored window, given the parent's client area
  114. BOOL GetAnchorPosition(UINT nID, const CRect &rectParent,
  115. CRect &rectChild, UINT* lpFlags = NULL)
  116. {
  117. return GetAnchorPosition(::GetDlgItem(GetResizableWnd()->GetSafeHwnd(), nID),
  118. rectParent, rectChild, lpFlags);
  119. }
  120. // remove an anchored control from the layout, given its HWND
  121. BOOL RemoveAnchor(HWND hWnd)
  122. {
  123. POSITION pos;
  124. if (!m_mapLayout.Lookup(hWnd, pos))
  125. return FALSE;
  126. m_listLayout.RemoveAt(pos);
  127. return m_mapLayout.RemoveKey(hWnd);
  128. }
  129. // remove an anchored control from the layout, given its HWND
  130. BOOL RemoveAnchor(UINT nID)
  131. {
  132. return RemoveAnchor(::GetDlgItem(GetResizableWnd()->GetSafeHwnd(), nID));
  133. }
  134. // reset layout content
  135. void RemoveAllAnchors()
  136. {
  137. m_mapLayout.RemoveAll();
  138. m_listLayout.RemoveAll();
  139. m_listLayoutCB.RemoveAll();
  140. }
  141. // adjust children's layout, when parent's size changes
  142. void ArrangeLayout();
  143. // override to provide dynamic control's layout info
  144. virtual BOOL ArrangeLayoutCallback(CResizableLayout::LayoutInfo& layout);
  145. // override to provide the parent window
  146. virtual CWnd* GetResizableWnd() = 0;
  147. public:
  148. CResizableLayout() { }
  149. virtual ~CResizableLayout()
  150. {
  151. // just for safety
  152. RemoveAllAnchors();
  153. }
  154. };
  155. #endif // !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)