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

多媒体编程

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////
  2. //
  3. // CSizingControlBarCF          Version 2.43
  4. // 
  5. // Created: Dec 21, 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. #include "stdafx.h"
  29. #include "scbarcf.h"
  30. /////////////////////////////////////////////////////////////////////////
  31. // CSizingControlBarCF
  32. IMPLEMENT_DYNAMIC(CSizingControlBarCF, baseCSizingControlBarCF);
  33. int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,
  34.                              NEWTEXTMETRIC FAR *lpntm,
  35.                              int FontType,
  36.                              LPARAM lParam)
  37. {
  38.     UNUSED_ALWAYS(lpelf);
  39.     UNUSED_ALWAYS(lpntm);
  40.     UNUSED_ALWAYS(FontType);
  41.     UNUSED_ALWAYS(lParam);
  42.     return 0;
  43. }
  44.  
  45. CSizingControlBarCF::CSizingControlBarCF()
  46. {
  47.     m_bActive = FALSE;
  48.     CDC dc;
  49.     dc.CreateCompatibleDC(NULL);
  50.     m_sFontFace = (::EnumFontFamilies(dc.m_hDC,
  51.         _T("Tahoma"), (FONTENUMPROC) EnumFontFamProc, 0) == 0) ?
  52.         _T("Tahoma") : _T("Arial");
  53.     dc.DeleteDC();
  54.     
  55. }
  56. BEGIN_MESSAGE_MAP(CSizingControlBarCF, baseCSizingControlBarCF)
  57.     //{{AFX_MSG_MAP(CSizingControlBarCF)
  58.     //}}AFX_MSG_MAP
  59.     ON_MESSAGE(WM_SETTEXT, OnSetText)
  60. END_MESSAGE_MAP()
  61. void CSizingControlBarCF::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
  62. {
  63.     baseCSizingControlBarCF::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);
  64.     if (!HasGripper())
  65.         return;
  66.     BOOL bNeedPaint = FALSE;
  67.     CWnd* pFocus = GetFocus();
  68.     BOOL bActiveOld = m_bActive;
  69.     m_bActive = (pFocus->GetSafeHwnd() && IsChild(pFocus));
  70.     if (m_bActive != bActiveOld)
  71.         bNeedPaint = TRUE;
  72.     if (bNeedPaint)
  73.         SendMessage(WM_NCPAINT);
  74. }
  75. // gradient defines (if not already defined)
  76. #ifndef COLOR_GRADIENTACTIVECAPTION
  77. #define COLOR_GRADIENTACTIVECAPTION     27
  78. #define COLOR_GRADIENTINACTIVECAPTION   28
  79. #define SPI_GETGRADIENTCAPTIONS         0x1008
  80. #endif
  81. void CSizingControlBarCF::NcPaintGripper(CDC* pDC, CRect rcClient)
  82. {
  83.     if (!HasGripper())
  84.         return;
  85.     // compute the caption rectangle
  86.     BOOL bHorz = IsHorzDocked();
  87.     CRect rcGrip = rcClient;
  88.     CRect rcBtn = m_biHide.GetRect();
  89.     if (bHorz)
  90.     {   // right side gripper
  91.         rcGrip.left -= m_cyGripper + 1;
  92.         rcGrip.right = rcGrip.left + 11;
  93.         rcGrip.top = rcBtn.bottom + 3;
  94.     }
  95.     else
  96.     {   // gripper at top
  97.         rcGrip.top -= m_cyGripper + 1;
  98.         rcGrip.bottom = rcGrip.top + 11;
  99.         rcGrip.right = rcBtn.left - 3;
  100.     }
  101.     rcGrip.InflateRect(bHorz ? 1 : 0, bHorz ? 0 : 1);
  102.     // draw the caption background
  103.     //CBrush br;
  104.     COLORREF clrCptn = m_bActive ?
  105.         ::GetSysColor(COLOR_ACTIVECAPTION) :
  106.         ::GetSysColor(COLOR_INACTIVECAPTION);
  107.     // query gradient info (usually TRUE for Win98/Win2k)
  108.     BOOL bGradient = FALSE;
  109.     ::SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &bGradient, 0);
  110.     
  111.     if (!bGradient)
  112.         pDC->FillSolidRect(&rcGrip, clrCptn); // solid color
  113.     else
  114.     {
  115.         // gradient from left to right or from bottom to top
  116.         // get second gradient color (the right end)
  117.         COLORREF clrCptnRight = m_bActive ?
  118.             ::GetSysColor(COLOR_GRADIENTACTIVECAPTION) :
  119.             ::GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
  120.         // this will make 2^6 = 64 fountain steps
  121.         int nShift = 6;
  122.         int nSteps = 1 << nShift;
  123.         for (int i = 0; i < nSteps; i++)
  124.         {
  125.             // do a little alpha blending
  126.             int nR = (GetRValue(clrCptn) * (nSteps - i) +
  127.                       GetRValue(clrCptnRight) * i) >> nShift;
  128.             int nG = (GetGValue(clrCptn) * (nSteps - i) +
  129.                       GetGValue(clrCptnRight) * i) >> nShift;
  130.             int nB = (GetBValue(clrCptn) * (nSteps - i) +
  131.                       GetBValue(clrCptnRight) * i) >> nShift;
  132.             COLORREF cr = RGB(nR, nG, nB);
  133.             // then paint with the resulting color
  134.             CRect r2 = rcGrip;
  135.             if (bHorz)
  136.             {
  137.                 r2.bottom = rcGrip.bottom - 
  138.                     ((i * rcGrip.Height()) >> nShift);
  139.                 r2.top = rcGrip.bottom - 
  140.                     (((i + 1) * rcGrip.Height()) >> nShift);
  141.                 if (r2.Height() > 0)
  142.                     pDC->FillSolidRect(r2, cr);
  143.             }
  144.             else
  145.             {
  146.                 r2.left = rcGrip.left + 
  147.                     ((i * rcGrip.Width()) >> nShift);
  148.                 r2.right = rcGrip.left + 
  149.                     (((i + 1) * rcGrip.Width()) >> nShift);
  150.                 if (r2.Width() > 0)
  151.                     pDC->FillSolidRect(r2, cr);
  152.             }
  153.         }
  154.     }
  155.     // draw the caption text - first select a font
  156.     CFont font;
  157.     int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
  158.     int pointsize = MulDiv(85, 96, ppi); // 8.5 points at 96 ppi
  159.     LOGFONT lf;
  160.     BOOL bFont = font.CreatePointFont(pointsize, m_sFontFace);
  161.     if (bFont)
  162.     {
  163.         // get the text color
  164.         COLORREF clrCptnText = m_bActive ?
  165.             ::GetSysColor(COLOR_CAPTIONTEXT) :
  166.             ::GetSysColor(COLOR_INACTIVECAPTIONTEXT);
  167.         int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
  168.         COLORREF clrOldText = pDC->SetTextColor(clrCptnText);
  169.         if (bHorz)
  170.         {
  171.             // rotate text 90 degrees CCW if horizontally docked
  172.             font.GetLogFont(&lf);
  173.             font.DeleteObject();
  174.             lf.lfEscapement = 900;
  175.             font.CreateFontIndirect(&lf);
  176.         }
  177.         
  178.         CFont* pOldFont = pDC->SelectObject(&font);
  179.         CString sTitle;
  180.         GetWindowText(sTitle);
  181.         CPoint ptOrg = bHorz ?
  182.             CPoint(rcGrip.left - 1, rcGrip.bottom - 3) :
  183.             CPoint(rcGrip.left + 3, rcGrip.top - 1);
  184.         pDC->ExtTextOut(ptOrg.x, ptOrg.y,
  185.             ETO_CLIPPED, rcGrip, sTitle, NULL);
  186.         pDC->SelectObject(pOldFont);
  187.         pDC->SetBkMode(nOldBkMode);
  188.         pDC->SetTextColor(clrOldText);
  189.     }
  190.     // draw the button
  191.     m_biHide.Paint(pDC);
  192. }
  193. LRESULT CSizingControlBarCF::OnSetText(WPARAM wParam, LPARAM lParam)
  194. {
  195.     LRESULT lResult = baseCSizingControlBarCF::OnSetText(wParam, lParam);
  196.     SendMessage(WM_NCPAINT);
  197.     return lResult;
  198. }