scbarg.cpp
上传用户:asikq0571
上传日期:2014-07-12
资源大小:528k
文件大小:11k
源码类别:

Internet/IE编程

开发平台:

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