GnomeFrame.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:9k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // GnomeFrame.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "GUI_Gnome.h"
  22. #include "GnomeFrame.h"
  23. #include "GnomeTheme.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CGnomeFrame
  31. IMPLEMENT_DYNCREATE(CGnomeFrame, CFrameWnd)
  32. CGnomeFrame::CGnomeFrame()
  33. {
  34. m_rcBorders.SetRect(4, 4, 4, 4);
  35. m_nButtonDown = 0;
  36. }
  37. CGnomeFrame::~CGnomeFrame()
  38. {
  39. }
  40. BEGIN_MESSAGE_MAP(CGnomeFrame, CFrameWnd)
  41. //{{AFX_MSG_MAP(CGnomeFrame)
  42. ON_WM_CREATE()
  43. ON_WM_NCPAINT()
  44. ON_WM_NCACTIVATE()
  45. ON_WM_NCCALCSIZE()
  46. ON_WM_NCHITTEST_EX()
  47. ON_WM_NCLBUTTONDOWN()
  48. ON_WM_NCLBUTTONUP()
  49. ON_WM_SIZE()
  50. ON_WM_WINDOWPOSCHANGING()
  51. ON_WM_LBUTTONUP()
  52. ON_WM_CAPTURECHANGED()
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CGnomeFrame message handlers
  57. int CGnomeFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  58. {
  59. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  60. return -1;
  61. SetMenu(0);
  62. ModifyStyle(WS_BORDER, 0);
  63. VERIFY(m_bmpBottomLeft.LoadBitmap(IDB_GNOME_BOTTOMLEFT));
  64. VERIFY(m_bmpBottomRight.LoadBitmap(IDB_GNOME_BOTTOMRIGHT));
  65. VERIFY(m_bmpMenuNormal.LoadBitmap(IDB_GNOME_MENU_NORMAL));
  66. VERIFY(m_bmpCaption.LoadBitmap(IDB_GNOME_CAPTION));
  67. VERIFY(m_bmpCloseNormal.LoadBitmap(IDB_GNOME_CLOSE_NORMAL));
  68. VERIFY(m_bmpMaximizeNormal.LoadBitmap(IDB_GNOME_MAXIMIZE_NORMAL));
  69. VERIFY(m_bmpMinimizeNormal.LoadBitmap(IDB_GNOME_MINIMIZE_NORMAL));
  70. VERIFY(m_bmpClosePushed.LoadBitmap(IDB_GNOME_CLOSE_PUSHED));
  71. VERIFY(m_bmpMaximizePushed.LoadBitmap(IDB_GNOME_MAXIMIZE_PUSHED));
  72. VERIFY(m_bmpMinimizePushed.LoadBitmap(IDB_GNOME_MINIMIZE_PUSHED));
  73. MoveWindow(CXTPWindowRect(this));
  74. NONCLIENTMETRICS ncm;
  75. ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
  76. ncm.cbSize = sizeof(NONCLIENTMETRICS);
  77. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
  78. m_fntTitle.CreateFontIndirect(&ncm.lfCaptionFont);
  79. return 0;
  80. }
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CGnomeFrame message handlers
  83. #define GNOMECAPTION_HEIGHT 20
  84. void CGnomeFrame::OnNcPaint()
  85. {
  86. CWindowDC dcWindow(this);
  87. CXTPWindowRect rc(this);
  88. CXTPClientRect rcClient(this);
  89. ClientToScreen(&rcClient);
  90. rcClient.OffsetRect(-rc.TopLeft());
  91. rc.OffsetRect(-rc.TopLeft());
  92. CRgn rgnClient;
  93. rgnClient.CreateRectRgnIndirect(rcClient);
  94. CRgn rgnWindow;
  95. rgnWindow.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 11, 11);
  96. dcWindow.SelectClipRgn(&rgnWindow);
  97. dcWindow.SelectClipRgn(&rgnClient, RGN_XOR );
  98. {
  99. CXTPBufferDC dc(dcWindow, rc);
  100. CXTPPenDC pen(dc, 0);
  101. CXTPBrushDC brush(dc, GNOMECOLOR_3DFACE);
  102. dc.FillSolidRect(0, 0, rc.Width(), rc.Height(), 0);
  103. dc.RoundRect(0, 0, rc.Width() - 1, rc.Height() - 1, 14, 14);
  104. dc.FillSolidRect(0, GNOMECAPTION_HEIGHT - 1, rc.Width(), 1, RGB(11, 11, 12));
  105. dc.FillSolidRect(1, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(0xFF, 0xFF, 0xFF));
  106. dc.FillSolidRect(5, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(161, 161, 161));
  107. dc.FillSolidRect(rc.Width() - 3, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(196, 196, 196));
  108. dc.FillSolidRect(rc.Width() - 6, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(255, 255, 255));
  109. dc.FillSolidRect(rc.Width() - 7, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(161, 161, 161));
  110. dc.FillSolidRect(5, rc.Height() - 3, rc.Width() - 11, 1, RGB(184, 184, 184));
  111. dc.FillSolidRect(5, rc.Height() - 6, rc.Width() - 11, 1, RGB(255, 255, 255));
  112. dc.FillSolidRect(5, rc.Height() - 7, rc.Width() - 11, 1, RGB(161, 161, 161));
  113. dc.FillSolidRect(10, 1, rc.Width() - 20, 1, RGB(149, 169, 214));
  114. for (int nCaption = 23; nCaption < rc.Width() - 33; nCaption += 30)
  115. {
  116. dc.DrawState(CPoint(nCaption, 2), CSize(30, 17), m_bmpCaption, DST_BITMAP|DSS_NORMAL);
  117. }
  118. dc.DrawState(CPoint(1, rc.Height() - 23), CSize(21, 21), m_bmpBottomLeft, DST_BITMAP|DSS_NORMAL);
  119. dc.DrawState(CPoint(rc.Width() - 23, rc.Height() - 23), CSize(21, 21), m_bmpBottomRight, DST_BITMAP|DSS_NORMAL);
  120. dc.DrawState(CPoint(1, 1), CSize(22, 19), m_bmpMenuNormal, DST_BITMAP|DSS_NORMAL);
  121. dc.DrawState(CPoint(rc.Width() - 23, 1), CSize(21, 19), m_nButtonDown == GNOME_HTCLOSE? m_bmpClosePushed: m_bmpCloseNormal, DST_BITMAP|DSS_NORMAL);
  122. dc.DrawState(CPoint(rc.Width() - 23 - 21, 1), CSize(21, 19), m_nButtonDown == GNOME_HTMAXIMIZE? m_bmpMaximizePushed: m_bmpMaximizeNormal, DST_BITMAP|DSS_NORMAL);
  123. dc.DrawState(CPoint(rc.Width() - 23 - 21*2, 1), CSize(21, 19), m_nButtonDown == GNOME_HTMINIMIZE? m_bmpMinimizePushed: m_bmpMinimizeNormal, DST_BITMAP|DSS_NORMAL);
  124. CRect rcTitle(rc.left + 30, rc.top, rc.right - 70, rc.top + GNOMECAPTION_HEIGHT);
  125. dc.SetBkMode(TRANSPARENT);
  126. dc.SetTextColor(RGB(255, 255, 255));
  127. CString strTitle;
  128. GetWindowText(strTitle);
  129. CXTPFontDC font(&dc, &m_fntTitle);
  130. dc.DrawText(strTitle, rcTitle, DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOCLIP);
  131. }
  132. dcWindow.SelectClipRgn(NULL);
  133. }
  134. void CGnomeFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
  135. {
  136. lpncsp->rgrc[0].top += GNOMECAPTION_HEIGHT - m_rcBorders.top;
  137. lpncsp->rgrc[0].left += 6 - m_rcBorders.left;
  138. lpncsp->rgrc[0].right -= 6 - m_rcBorders.right + 1;
  139. lpncsp->rgrc[0].bottom -= 6 - m_rcBorders.bottom + 1;
  140. CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  141. }
  142. LRESULT CGnomeFrame::OnNcHitTest(CPoint point)
  143. {
  144. LRESULT nHit = (LRESULT)CFrameWnd::OnNcHitTest(point);
  145. CRect rcWindow;
  146. GetWindowRect(&rcWindow);
  147. if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && nHit == HTNOWHERE)
  148. {
  149. //if (point.x < rcWindow.right - 23 * 3)
  150. //  return HTCAPTION;
  151. return HTCAPTION;
  152. }
  153. return nHit;
  154. }
  155. void CGnomeFrame::OnSize(UINT nType, int cx, int cy)
  156. {
  157. CFrameWnd::OnSize(nType, cx, cy);
  158. }
  159. void CGnomeFrame::OnWindowPosChanging(WINDOWPOS* lpwndpos)
  160. {
  161. CFrameWnd::OnWindowPosChanging(lpwndpos);
  162. if ((lpwndpos->flags & SWP_NOSIZE) ==  0 )
  163. {
  164. CRgn rgnResult;
  165. rgnResult.CreateRoundRectRgn(0, 0, lpwndpos->cx, lpwndpos->cy, 11, 11);
  166. SetWindowRgn((HRGN)rgnResult.Detach(), TRUE);
  167. }
  168. }
  169. int CGnomeFrame::GetSysButtonsHitTest(CPoint point)
  170. {
  171. CRect rcWindow;
  172. GetWindowRect(&rcWindow);
  173. if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23))
  174. return GNOME_HTCLOSE;
  175. if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23 - 21))
  176. return GNOME_HTMAXIMIZE;
  177. if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23 - 21 - 21))
  178. return GNOME_HTMINIMIZE;
  179. return 0;
  180. }
  181. void CGnomeFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
  182. {
  183. if (nHitTest == HTCAPTION)
  184. {
  185. int nHit = GetSysButtonsHitTest(point);
  186. if (nHit > 0)
  187. {
  188. SetCapture();
  189. m_nButtonDown = nHit;
  190. RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
  191. }
  192. }
  193. CFrameWnd::OnNcLButtonDown(nHitTest, point);
  194. }
  195. void CGnomeFrame::OnNcLButtonUp(UINT nHitTest, CPoint point)
  196. {
  197. CFrameWnd::OnNcLButtonUp(nHitTest, point);
  198. }
  199. void CGnomeFrame::OnLButtonUp(UINT nFlags, CPoint point)
  200. {
  201. if (m_nButtonDown > 0)
  202. {
  203. int nButtonDown = m_nButtonDown;
  204. m_nButtonDown = 0;
  205. RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
  206. ReleaseCapture();
  207. ClientToScreen(&point);
  208. if (GetSysButtonsHitTest(point) == nButtonDown)
  209. {
  210. switch (nButtonDown)
  211. {
  212. case GNOME_HTCLOSE: SendMessage(WM_SYSCOMMAND, SC_CLOSE); break;
  213. case GNOME_HTMAXIMIZE:
  214. SendMessage(WM_SYSCOMMAND, (GetStyle() & WS_MAXIMIZE) != 0? SC_RESTORE: SC_MAXIMIZE ); break;
  215. case GNOME_HTMINIMIZE: SendMessage(WM_SYSCOMMAND, SC_MINIMIZE); break;
  216. }
  217. }
  218. return;
  219. }
  220. CFrameWnd::OnLButtonUp(nFlags, point);
  221. }
  222. void CGnomeFrame::OnCaptureChanged(CWnd *pWnd)
  223. {
  224. if (m_nButtonDown > 0)
  225. {
  226. m_nButtonDown = 0;
  227. RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
  228. }
  229. CFrameWnd::OnCaptureChanged(pWnd);
  230. }
  231. BOOL CGnomeFrame::OnNcActivate(BOOL /*bActive*/)
  232. {
  233. return TRUE;
  234. }