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

多媒体编程

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////
  2. //
  3. // CSizingControlBarG           Version 2.43
  4. // 
  5. // Created: Jan 24, 1998        Last Modified: August 03, 2000
  6. //
  7. // See the official site at www.datamekanix.com for documentation and
  8. // the latest news.
  9. //
  10. /////////////////////////////////////////////////////////////////////////
  11. // Copyright (C) 1998-2000 by Cristi Posea. All rights reserved.
  12. //
  13. // This code is free for personal and commercial use, providing this 
  14. // notice remains intact in the source files and all eventual changes are
  15. // clearly marked with comments.
  16. //
  17. // You must obtain the author's consent before you can include this code
  18. // in a software library.
  19. //
  20. // No warrantee of any kind, express or implied, is included with this
  21. // software; use at your own risk, responsibility for damages (if any) to
  22. // anyone resulting from the use of this software rests entirely with the
  23. // user.
  24. //
  25. // Send bug reports, bug fixes, enhancements, requests, flames, etc. to
  26. // cristi@datamekanix.com or post them at the message board at the site.
  27. /////////////////////////////////////////////////////////////////////////
  28. // sizecbar.cpp : implementation file
  29. //
  30. #include "stdafx.h"
  31. #include "scbarg.h"
  32. #ifdef _DEBUG
  33. #define new DEBUG_NEW
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #endif
  37. /////////////////////////////////////////////////////////////////////////
  38. // CSizingControlBarG
  39. IMPLEMENT_DYNAMIC(CSizingControlBarG, baseCSizingControlBarG);
  40. CSizingControlBarG::CSizingControlBarG()
  41. {
  42.     m_cyGripper = 12;
  43. }
  44. CSizingControlBarG::~CSizingControlBarG()
  45. {
  46. }
  47. BEGIN_MESSAGE_MAP(CSizingControlBarG, baseCSizingControlBarG)
  48.     //{{AFX_MSG_MAP(CSizingControlBarG)
  49.     ON_WM_NCLBUTTONUP()
  50. //    ON_WM_NCHITTEST()
  51.     //}}AFX_MSG_MAP
  52.     ON_MESSAGE(WM_SETTEXT, OnSetText)
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////
  55. // CSizingControlBarG message handlers
  56. /////////////////////////////////////////////////////////////////////////
  57. // Mouse Handling
  58. //
  59. void CSizingControlBarG::OnNcLButtonUp(UINT nHitTest, CPoint point)
  60. {
  61.     if (nHitTest == HTCLOSE)
  62.         m_pDockSite->ShowControlBar(this, FALSE, FALSE); // hide
  63.     baseCSizingControlBarG::OnNcLButtonUp(nHitTest, point);
  64. }
  65. void CSizingControlBarG::NcCalcClient(LPRECT pRc, UINT nDockBarID)
  66. {
  67.     CRect rcBar(pRc); // save the bar rect
  68.     // subtract edges
  69.     baseCSizingControlBarG::NcCalcClient(pRc, nDockBarID);
  70.     if (!HasGripper())
  71.         return;
  72.     CRect rc(pRc); // the client rect as calculated by the base class
  73.     BOOL bHorz = (nDockBarID == AFX_IDW_DOCKBAR_TOP) ||
  74.                  (nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
  75.     if (bHorz)
  76.         rc.DeflateRect(m_cyGripper, 0, 0, 0);
  77.     else
  78.         rc.DeflateRect(0, m_cyGripper, 0, 0);
  79.     // set position for the "x" (hide bar) button
  80.     CPoint ptOrgBtn;
  81.     if (bHorz)
  82.         ptOrgBtn = CPoint(rc.left - 13, rc.top);
  83.     else
  84.         ptOrgBtn = CPoint(rc.right - 12, rc.top - 13);
  85.     m_biHide.Move(ptOrgBtn - rcBar.TopLeft());
  86.     *pRc = rc;
  87. }
  88. void CSizingControlBarG::NcPaintGripper(CDC* pDC, CRect rcClient)
  89. {
  90.     if (!HasGripper())
  91.         return;
  92.     // paints a simple "two raised lines" gripper
  93.     // override this if you want a more sophisticated gripper
  94.     CRect gripper = rcClient;
  95.     CRect rcbtn = m_biHide.GetRect();
  96.     BOOL bHorz = IsHorzDocked();
  97.     gripper.DeflateRect(1, 1);
  98.     if (bHorz)
  99.     {   // gripper at left
  100.         gripper.left -= m_cyGripper;
  101.         gripper.right = gripper.left + 3;
  102.         gripper.top = rcbtn.bottom + 3;
  103.     }
  104.     else
  105.     {   // gripper at top
  106.         gripper.top -= m_cyGripper;
  107.         gripper.bottom = gripper.top + 3;
  108.         gripper.right = rcbtn.left - 3;
  109.     }
  110.     pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  111.         ::GetSysColor(COLOR_BTNSHADOW));
  112.     gripper.OffsetRect(bHorz ? 3 : 0, bHorz ? 0 : 3);
  113.     pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  114.         ::GetSysColor(COLOR_BTNSHADOW));
  115.     m_biHide.Paint(pDC);
  116. }
  117. LRESULT CSizingControlBarG::OnNcHitTest(CPoint point)
  118. {
  119.     CRect rcBar;
  120.     GetWindowRect(rcBar);
  121.     LRESULT nRet = baseCSizingControlBarG::OnNcHitTest(point);
  122.     if (nRet != HTCLIENT)
  123.         return nRet;
  124.     CRect rc = m_biHide.GetRect();
  125.     rc.OffsetRect(rcBar.TopLeft());
  126.     if (rc.PtInRect(point))
  127.         return HTCLOSE;
  128.     return HTCLIENT;
  129. }
  130. /////////////////////////////////////////////////////////////////////////
  131. // CSizingControlBarG implementation helpers
  132. void CSizingControlBarG::OnUpdateCmdUI(CFrameWnd* pTarget,
  133.                                       BOOL bDisableIfNoHndler)
  134. {
  135.     UNUSED_ALWAYS(bDisableIfNoHndler);
  136.     UNUSED_ALWAYS(pTarget);
  137.     if (!HasGripper())
  138.         return;
  139.     BOOL bNeedPaint = FALSE;
  140.     CPoint pt;
  141.     ::GetCursorPos(&pt);
  142.     BOOL bHit = (OnNcHitTest(pt) == HTCLOSE);
  143.     BOOL bLButtonDown = (::GetKeyState(VK_LBUTTON) < 0);
  144.     BOOL bWasPushed = m_biHide.bPushed;
  145.     m_biHide.bPushed = bHit && bLButtonDown;
  146.     BOOL bWasRaised = m_biHide.bRaised;
  147.     m_biHide.bRaised = bHit && !bLButtonDown;
  148.     bNeedPaint |= (m_biHide.bPushed ^ bWasPushed) ||
  149.                   (m_biHide.bRaised ^ bWasRaised);
  150.     if (bNeedPaint)
  151.         SendMessage(WM_NCPAINT);
  152. }
  153. /////////////////////////////////////////////////////////////////////////
  154. // CSCBButton
  155. CSCBButton::CSCBButton()
  156. {
  157.     bRaised = FALSE;
  158.     bPushed = FALSE;
  159. }
  160. void CSCBButton::Paint(CDC* pDC)
  161. {
  162.     CRect rc = GetRect();
  163.     if (bPushed)
  164.         pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNSHADOW),
  165.             ::GetSysColor(COLOR_BTNHIGHLIGHT));
  166.     else
  167.         if (bRaised)
  168.             pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  169.                 ::GetSysColor(COLOR_BTNSHADOW));
  170.     COLORREF clrOldTextColor = pDC->GetTextColor();
  171.     pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
  172.     int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
  173.     CFont font;
  174.     int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
  175.     int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi
  176.     font.CreatePointFont(pointsize, _T("Marlett"));
  177.     CFont* oldfont = pDC->SelectObject(&font);
  178.     pDC->TextOut(ptOrg.x + 2, ptOrg.y + 2, CString(_T("r"))); // x-like
  179.     pDC->SelectObject(oldfont);
  180.     pDC->SetBkMode(nPrevBkMode);
  181.     pDC->SetTextColor(clrOldTextColor);
  182. }
  183. BOOL CSizingControlBarG::HasGripper() const
  184. {
  185. #if defined(_SCB_MINIFRAME_CAPTION) || !defined(_SCB_REPLACE_MINIFRAME)
  186.     // if the miniframe has a caption, don't display the gripper
  187.     if (IsFloating())
  188.         return FALSE;
  189. #endif //_SCB_MINIFRAME_CAPTION
  190.     return TRUE;
  191. }