⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scbarcf.cpp

📁 涉及到SkinMagicLiB等多种界面开发库的应用
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////
//
// CSizingControlBarCF          Version 2.42
// 
// Created: Dec 21, 1998        Last Modified: Feb 10, 2000
//
// See the official site at www.datamekanix.com for documentation and
// the latest news.
//
/////////////////////////////////////////////////////////////////////////
// Copyright (C) 1998-2000 by Cristi Posea. All rights reserved.
//
// This code is free for personal and commercial use, providing this 
// notice remains intact in the source files and all eventual changes are
// clearly marked with comments.
//
// You must obtain the author's consent before you can include this code
// in a software library.
//
// No warrantee of any kind, express or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
//
// Send bug reports, bug fixes, enhancements, requests, flames, etc. to
// cristi@datamekanix.com or post them at the message board at the site.
/////////////////////////////////////////////////////////////////////////

#include <stdafx.h>
#include "scbarcf.h"

/////////////////////////////////////////////////////////////////////////
// CSizingControlBarCF

IMPLEMENT_DYNAMIC(CSizingControlBarCF, baseCSizingControlBarCF);

int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,
                             NEWTEXTMETRIC FAR *lpntm,
                             int FontType,
                             LPARAM lParam)
{
    UNUSED_ALWAYS(lpelf);
    UNUSED_ALWAYS(lpntm);
    UNUSED_ALWAYS(FontType);
    UNUSED_ALWAYS(lParam);

    return 0;
}
 
CSizingControlBarCF::CSizingControlBarCF()
{
    m_bActive = FALSE;

    CDC dc;
    dc.CreateCompatibleDC(NULL);

    m_sFontFace = (::EnumFontFamilies(dc.m_hDC,
        _T("Tahoma"), (FONTENUMPROC) EnumFontFamProc, 0) == 0) ?
        _T("Tahoma") : _T("Arial");

    dc.DeleteDC();
    
}

BEGIN_MESSAGE_MAP(CSizingControlBarCF, baseCSizingControlBarCF)
    //{{AFX_MSG_MAP(CSizingControlBarCF)
	//}}AFX_MSG_MAP
    ON_MESSAGE(WM_SETTEXT, OnSetText)
END_MESSAGE_MAP()

void CSizingControlBarCF::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
    baseCSizingControlBarCF::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);

    if (!HasGripper())
        return;

    BOOL bNeedPaint = FALSE;

    CWnd* pFocus = GetFocus();
    BOOL bActiveOld = m_bActive;

    m_bActive = (pFocus->GetSafeHwnd() && IsChild(pFocus));

    if (m_bActive != bActiveOld)
        bNeedPaint = TRUE;

    if (bNeedPaint)
        SendMessage(WM_NCPAINT);
}

// gradient defines (if not already defined)
#ifndef COLOR_GRADIENTACTIVECAPTION
#define COLOR_GRADIENTACTIVECAPTION     27
#define COLOR_GRADIENTINACTIVECAPTION   28
#define SPI_GETGRADIENTCAPTIONS         0x1008
#endif

void CSizingControlBarCF::NcPaintGripper(CDC* pDC, CRect rcClient)
{
    if (!HasGripper())
        return;
	int fudong=true;
    // compute the caption rectangle
    BOOL bHorz = IsHorzDocked();
    CRect rcGrip = rcClient;
    CRect rcBtn = m_biHide.GetRect();
	fudong=IsFloating();
    if (bHorz)
    {   // right side gripper
        rcGrip.left -= m_cyGripper + 1;
        rcGrip.right = rcGrip.left + 11;
        rcGrip.top = rcBtn.bottom + 3;
    }
    else
    {   // gripper at top
        rcGrip.top -= m_cyGripper + 1;
        rcGrip.bottom = rcGrip.top + 11;
        rcGrip.right = rcBtn.left - 3;
    }
    rcGrip.InflateRect(bHorz ? 1 : 0, bHorz ? 0 : 1);

    // draw the caption background
    //CBrush br;
    COLORREF clrCptn = m_bActive ?
        ::GetSysColor(COLOR_ACTIVECAPTION) :
        ::GetSysColor(COLOR_INACTIVECAPTION);

    // query gradient info (usually TRUE for Win98/Win2k)
    BOOL bGradient = FALSE;
    ::SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &bGradient, 0);
   	CRect rcBar=rcGrip;
    if(fudong)
	{
		if (!bGradient)
		{pDC->FillSolidRect(&rcGrip, clrCptn); }// solid color
		else
		{
			// gradient from left to right or from bottom to top
			// get second gradient color (the right end)
			COLORREF clrCptnRight = m_bActive ?
				::GetSysColor(COLOR_GRADIENTACTIVECAPTION) :
				::GetSysColor(COLOR_GRADIENTINACTIVECAPTION);

			// this will make 2^6 = 64 fountain steps
			int nShift = 6;
			int nSteps = 1 << nShift;
			CRect r2 = rcGrip;

			for (int i = 0; i < nSteps; i++)
			{
				// do a little alpha blending
				int nR = (GetRValue(clrCptn) * (nSteps - i) +
						  GetRValue(clrCptnRight) * i) >> nShift;
				int nG = (GetGValue(clrCptn) * (nSteps - i) +
						  GetGValue(clrCptnRight) * i) >> nShift;
				int nB = (GetBValue(clrCptn) * (nSteps - i) +
						  GetBValue(clrCptnRight) * i) >> nShift;

				COLORREF cr = RGB(nR, nG, nB);

				// then paint with the resulting color
				if (bHorz)
				{
					r2.bottom = rcGrip.bottom - 
						((i * rcGrip.Height()) >> nShift);
					r2.top = rcGrip.bottom - 
						(((i + 1) * rcGrip.Height()) >> nShift);
					if (r2.Height() > 0)
						pDC->FillSolidRect(r2, cr);
				}
				else
				{
					r2.left = rcGrip.left + 
						((i * rcGrip.Width()) >> nShift);
					r2.right = rcGrip.left + 
						(((i + 1) * rcGrip.Width()) >> nShift);
					if (r2.Width() > 0)
						pDC->FillSolidRect(r2, cr);
				}
			}
		}
		

		// draw the caption text - first select a font
		CFont font;
		int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
		int pointsize = MulDiv(85, 96, ppi); // 8.5 points at 96 ppi

		LOGFONT lf;
		BOOL bFont = font.CreatePointFont(pointsize, m_sFontFace);
		if (bFont)
		{
			// get the text color
			COLORREF clrCptnText = m_bActive ?
				::GetSysColor(COLOR_CAPTIONTEXT) :
				::GetSysColor(COLOR_INACTIVECAPTIONTEXT);

			int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
			COLORREF clrOldText = pDC->SetTextColor(clrCptnText);

			if (bHorz)
			{
				// rotate text 90 degrees CCW if horizontally docked
				font.GetLogFont(&lf);
				font.DeleteObject();
				lf.lfEscapement = 900;
				font.CreateFontIndirect(&lf);
			}
        
			CFont* pOldFont = pDC->SelectObject(&font);
			CString sTitle;
			GetWindowText(sTitle);

			CPoint ptOrg = bHorz ?
				CPoint(rcGrip.left - 1, rcGrip.bottom - 3) :
				CPoint(rcGrip.left + 3, rcGrip.top - 1);

			pDC->ExtTextOut(ptOrg.x, ptOrg.y,
				ETO_CLIPPED, rcGrip, sTitle, NULL);
			pDC->SelectObject(pOldFont);
			pDC->SetBkMode(nOldBkMode);
			pDC->SetTextColor(clrOldText);
		}
	}
	if(!fudong)
	{
		CRect rcBar2;
		if(bHorz)
		{
			rcBar.right-=8;
			rcBar.left+=2;
			rcBar2=rcBar;
			rcBar2.left+=4;
			rcBar2.right+=4;
		}
		else
		{
			rcBar.bottom-=8;
			rcBar.top+=2;
			rcBar2=rcBar;
			rcBar2.top+=4;
			rcBar2.bottom+=4;
		}
		pDC->Draw3dRect( rcBar, ::GetSysColor(COLOR_BTNHIGHLIGHT),
			::GetSysColor(COLOR_BTNSHADOW) );
		pDC->Draw3dRect( rcBar2, ::GetSysColor(COLOR_BTNHIGHLIGHT),
			::GetSysColor(COLOR_BTNSHADOW) );
	}
    // draw the button
    m_biHide.Paint(pDC);
}

LRESULT CSizingControlBarCF::OnSetText(WPARAM wParam, LPARAM lParam)
{
    LRESULT lResult = baseCSizingControlBarCF::OnSetText(wParam, lParam);

    SendMessage(WM_NCPAINT);

    return lResult;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -