SCBARG.CPP
上传用户:yffx2008
上传日期:2014-10-12
资源大小:12414k
文件大小:10k
源码类别:

交通/航空行业

开发平台:

Visual C++

  1. // sizecbar.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,
  10.                              NEWTEXTMETRIC FAR *lpntm,
  11.                              int FontType,
  12.                              LPARAM lParam)
  13. {
  14.     UNUSED_ALWAYS(lpelf);
  15.     UNUSED_ALWAYS(lpntm);
  16.     UNUSED_ALWAYS(FontType);
  17.     UNUSED_ALWAYS(lParam);
  18.     return 0;
  19. }
  20. /////////////////////////////////////////////////////////////////////////
  21. // CCoolBar
  22. IMPLEMENT_DYNAMIC(CCoolBar, baseCCoolBar);
  23. CCoolBar::CCoolBar()
  24. {
  25.     m_cyGripper = 12;
  26. SetSCBStyle(GetSCBStyle() | SCBS_SIZECHILD);
  27.     m_bActive = FALSE;
  28.     CDC dc;
  29.     dc.CreateCompatibleDC(NULL);
  30.     m_sFontFace = (::EnumFontFamilies(dc.m_hDC,
  31.         _T("宋体"), (FONTENUMPROC) EnumFontFamProc, 0) == 0) ?
  32.         _T("宋体") : _T("Tahoma");
  33.     dc.DeleteDC();
  34. }
  35. CCoolBar::~CCoolBar()
  36. {
  37. }
  38. BEGIN_MESSAGE_MAP(CCoolBar, baseCCoolBar)
  39.     //{{AFX_MSG_MAP(CCoolBar)
  40.     ON_WM_NCLBUTTONUP()
  41.     ON_WM_NCHITTEST()
  42.     //}}AFX_MSG_MAP
  43.     ON_MESSAGE(WM_SETTEXT, OnSetText)
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////
  46. // CCoolBar message handlers
  47. /////////////////////////////////////////////////////////////////////////
  48. // Mouse Handling
  49. //
  50. void CCoolBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
  51. {
  52.     if (nHitTest == HTCLOSE)
  53.         m_pDockSite->ShowControlBar(this, FALSE, FALSE); // hide
  54.     baseCCoolBar::OnNcLButtonUp(nHitTest, point);
  55. }
  56. #ifndef COLOR_GRADIENTACTIVECAPTION
  57. #define COLOR_GRADIENTACTIVECAPTION     27
  58. #define COLOR_GRADIENTINACTIVECAPTION   28
  59. #define SPI_GETGRADIENTCAPTIONS         0x1008
  60. #endif
  61. void CCoolBar::NcCalcClient(LPRECT pRc, UINT nDockBarID)
  62. {
  63.     CRect rcBar(pRc); // save the bar rect
  64.     // subtract edges
  65.     baseCCoolBar::NcCalcClient(pRc, nDockBarID);
  66.     if (!HasGripper())
  67.         return;
  68.     CRect rc(pRc); // the client rect as calculated by the base class
  69.     BOOL bHorz = (nDockBarID == AFX_IDW_DOCKBAR_TOP) ||
  70.                  (nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
  71.     if (bHorz)
  72.         rc.DeflateRect(m_cyGripper, 0, 0, 0);
  73.     else
  74.         rc.DeflateRect(0, m_cyGripper, 0, 0);
  75.     // set position for the "x" (hide bar) button
  76.     CPoint ptOrgBtn;
  77.     if (bHorz)
  78.         ptOrgBtn = CPoint(rc.left - 14, rc.top);
  79.     else
  80.         ptOrgBtn = CPoint(rc.right - 12, rc.top - 14);
  81.     m_biHide.Move(ptOrgBtn - rcBar.TopLeft());
  82.     *pRc = rc;
  83. }
  84. void CCoolBar::NcPaintGripper(CDC* pDC, CRect rcClient)
  85. {
  86.     if (!HasGripper())
  87.         return;
  88. #ifndef _SCB_STYLE_FLAT
  89.     CRect gripper = rcClient;
  90.     CRect rcbtn = m_biHide.GetRect();
  91.     BOOL bHorz = IsHorzDocked();
  92.     gripper.DeflateRect(1, 1);
  93.     if (bHorz)
  94.     {   // gripper at left
  95.         gripper.left -= m_cyGripper;
  96.         gripper.right = gripper.left + 3;
  97.         gripper.top = rcbtn.bottom + 3;
  98.     }
  99.     else
  100.     {   // gripper at top
  101.         gripper.top -= m_cyGripper;
  102.         gripper.bottom = gripper.top + 3;
  103.         gripper.right = rcbtn.left - 3;
  104.     }
  105.     pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  106.         ::GetSysColor(COLOR_BTNSHADOW));
  107.     gripper.OffsetRect(bHorz ? 3 : 0, bHorz ? 0 : 3);
  108.     pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  109.         ::GetSysColor(COLOR_BTNSHADOW));
  110.     m_biHide.Paint(pDC);
  111. #else
  112.     // compute the caption rectangle
  113.     BOOL bHorz = IsHorzDocked();
  114.     CRect rcGrip = rcClient;
  115.     CRect rcBtn = m_biHide.GetRect();
  116.     if (bHorz)
  117.     {   // right side gripper
  118.         rcGrip.left -= m_cyGripper + 1;
  119.         rcGrip.right = rcGrip.left + 11;
  120.         rcGrip.top = rcBtn.bottom + 3;
  121.     }
  122.     else
  123.     {   // gripper at top
  124.         rcGrip.top -= m_cyGripper + 1;
  125.         rcGrip.bottom = rcGrip.top + 11;
  126.         rcGrip.right = rcBtn.left - 3;
  127.     }
  128.     rcGrip.InflateRect(bHorz ? 1 : 0, bHorz ? 0 : 1);
  129.     // draw the caption background
  130.     //CBrush br;
  131.     COLORREF clrCptn = m_bActive ?
  132.         ::GetSysColor(COLOR_ACTIVECAPTION) :
  133.         ::GetSysColor(COLOR_INACTIVECAPTION);
  134.     // query gradient info (usually TRUE for Win98/Win2k)
  135.     BOOL bGradient = FALSE;
  136.     ::SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &bGradient, 0);
  137.     
  138.     if (!bGradient)
  139.         pDC->FillSolidRect(&rcGrip, clrCptn); // solid color
  140.     else
  141.     {
  142.         // gradient from left to right or from bottom to top
  143.         // get second gradient color (the right end)
  144.         COLORREF clrCptnRight = m_bActive ?
  145.             ::GetSysColor(COLOR_GRADIENTACTIVECAPTION) :
  146.             ::GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
  147.         // this will make 2^6 = 64 fountain steps
  148.         int nShift = 6;
  149.         int nSteps = 1 << nShift;
  150.         for (int i = 0; i < nSteps; i++)
  151.         {
  152.             // do a little alpha blending
  153.             int nR = (GetRValue(clrCptn) * (nSteps - i) +
  154.                       GetRValue(clrCptnRight) * i) >> nShift;
  155.             int nG = (GetGValue(clrCptn) * (nSteps - i) +
  156.                       GetGValue(clrCptnRight) * i) >> nShift;
  157.             int nB = (GetBValue(clrCptn) * (nSteps - i) +
  158.                       GetBValue(clrCptnRight) * i) >> nShift;
  159.             COLORREF cr = RGB(nR, nG, nB);
  160.             // then paint with the resulting color
  161.             CRect r2 = rcGrip;
  162.             if (bHorz)
  163.             {
  164.                 r2.bottom = rcGrip.bottom - 
  165.                     ((i * rcGrip.Height()) >> nShift);
  166.                 r2.top = rcGrip.bottom - 
  167.                     (((i + 1) * rcGrip.Height()) >> nShift);
  168.                 if (r2.Height() > 0)
  169.                     pDC->FillSolidRect(r2, cr);
  170.             }
  171.             else
  172.             {
  173.                 r2.left = rcGrip.left + 
  174.                     ((i * rcGrip.Width()) >> nShift);
  175.                 r2.right = rcGrip.left + 
  176.                     (((i + 1) * rcGrip.Width()) >> nShift);
  177.                 if (r2.Width() > 0)
  178.                     pDC->FillSolidRect(r2, cr);
  179.             }
  180.         }
  181.     }
  182.     // draw the caption text - first select a font
  183.     CFont font;
  184.     int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
  185.     int pointsize = MulDiv(96, 96, ppi); // 8.5 points at 96 ppi
  186.     LOGFONT lf;
  187.     BOOL bFont = font.CreatePointFont(pointsize, m_sFontFace);
  188.     if (bFont)
  189.     {
  190.         // get the text color
  191.         COLORREF clrCptnText = m_bActive ?
  192.             ::GetSysColor(COLOR_CAPTIONTEXT) :
  193.             ::GetSysColor(COLOR_INACTIVECAPTIONTEXT);
  194.         int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
  195.         COLORREF clrOldText = pDC->SetTextColor(clrCptnText);
  196.         if (bHorz)
  197.         {
  198.             // rotate text 90 degrees CCW if horizontally docked
  199.             font.GetLogFont(&lf);
  200.             font.DeleteObject();
  201.             lf.lfEscapement = 900;
  202.             font.CreateFontIndirect(&lf);
  203.         }
  204.         
  205.         CFont* pOldFont = pDC->SelectObject(&font);
  206.         CString sTitle;
  207.         GetWindowText(sTitle);
  208.         CPoint ptOrg = bHorz ?
  209.             CPoint(rcGrip.left - 1, rcGrip.bottom - 3) :
  210.             CPoint(rcGrip.left + 3, rcGrip.top - 1);
  211.         pDC->ExtTextOut(ptOrg.x, ptOrg.y,
  212.             ETO_CLIPPED, rcGrip, sTitle, NULL);
  213.         pDC->SelectObject(pOldFont);
  214.         pDC->SetBkMode(nOldBkMode);
  215.         pDC->SetTextColor(clrOldText);
  216.     }
  217.     // draw the button
  218.     m_biHide.Paint(pDC);
  219. #endif
  220. }
  221. UINT CCoolBar::OnNcHitTest(CPoint point)
  222. {
  223.     CRect rcBar;
  224.     GetWindowRect(rcBar);
  225.     UINT nRet = baseCCoolBar::OnNcHitTest(point);
  226.     if (nRet != HTCLIENT)
  227.         return nRet;
  228.     CRect rc = m_biHide.GetRect();
  229.     rc.OffsetRect(rcBar.TopLeft());
  230.     if (rc.PtInRect(point))
  231.         return HTCLOSE;
  232.     return HTCLIENT;
  233. }
  234. /////////////////////////////////////////////////////////////////////////
  235. // CCoolBar implementation helpers
  236. void CCoolBar::OnUpdateCmdUI(CFrameWnd* pTarget,
  237.                                       BOOL bDisableIfNoHndler)
  238. {
  239.     UNUSED_ALWAYS(bDisableIfNoHndler);
  240.     UNUSED_ALWAYS(pTarget);
  241.     if (!HasGripper())
  242.         return;
  243.     BOOL bNeedPaint = FALSE;
  244.     CPoint pt;
  245.     ::GetCursorPos(&pt);
  246.     BOOL bHit = (OnNcHitTest(pt) == HTCLOSE);
  247.     BOOL bLButtonDown = (::GetKeyState(VK_LBUTTON) < 0);
  248.     BOOL bWasPushed = m_biHide.bPushed;
  249.     m_biHide.bPushed = bHit && bLButtonDown;
  250.     BOOL bWasRaised = m_biHide.bRaised;
  251.     m_biHide.bRaised = bHit && !bLButtonDown;
  252. CWnd* pFocus = GetFocus();
  253.     BOOL bActiveOld = m_bActive;
  254.     m_bActive = (pFocus->GetSafeHwnd() && IsChild(pFocus));
  255.     if (m_bActive != bActiveOld)
  256.         bNeedPaint = TRUE;
  257.     bNeedPaint |= (m_biHide.bPushed ^ bWasPushed) ||
  258.                   (m_biHide.bRaised ^ bWasRaised);
  259.     if (bNeedPaint)
  260.         SendMessage(WM_NCPAINT);
  261. }
  262. /////////////////////////////////////////////////////////////////////////
  263. // CSCBButton
  264. CSCBButton::CSCBButton()
  265. {
  266.     bRaised = FALSE;
  267.     bPushed = FALSE;
  268. }
  269. void CSCBButton::Paint(CDC* pDC)
  270. {
  271.     CRect rc = GetRect();
  272.     if (bPushed)
  273.         pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNSHADOW),
  274.             ::GetSysColor(COLOR_BTNHIGHLIGHT));
  275.     else
  276.         if (bRaised)
  277.             pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  278.                 ::GetSysColor(COLOR_BTNSHADOW));
  279.     COLORREF clrOldTextColor = pDC->GetTextColor();
  280.     pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
  281.     int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
  282.     CFont font;
  283.     int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
  284.     int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi
  285.     font.CreatePointFont(pointsize, _T("Marlett"));
  286.     CFont* oldfont = pDC->SelectObject(&font);
  287.     pDC->TextOut(ptOrg.x + 3, ptOrg.y + 3, CString(_T("r"))); // x-like
  288.     pDC->SelectObject(oldfont);
  289.     pDC->SetBkMode(nPrevBkMode);
  290.     pDC->SetTextColor(clrOldTextColor);
  291. }
  292. BOOL CCoolBar::HasGripper() const
  293. {
  294. #if defined(_SCB_MINIFRAME_CAPTION) || !defined(_SCB_REPLACE_MINIFRAME)
  295.     // if the miniframe has a caption, don't display the gripper
  296.     if (IsFloating())
  297.         return FALSE;
  298. #endif //_SCB_MINIFRAME_CAPTION
  299.     return TRUE;
  300. }
  301. LRESULT CCoolBar::OnSetText(WPARAM wParam, LPARAM lParam)
  302. {
  303.     LRESULT lResult = baseCCoolBar::OnSetText(wParam, lParam);
  304.     SendMessage(WM_NCPAINT);
  305.     return lResult;
  306. }