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

📄 colorgprogressctrl.cpp

📁 C语言课程设计案例精编
💻 CPP
字号:
// SwingProgressCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "ColorProgressCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////

CColorProgressCtrl::CColorProgressCtrl()
{
	nBkBrush.CreateSolidBrush(RGB(204, 204, 204));              //画刷
	nProgressBrush.CreateSolidBrush(RGB(153, 153, 204));

	nDarkBorder.CreatePen(PS_SOLID, 1, RGB(128, 128, 128));     //画笔
	nWhiteBorder.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
	nSelectedBorder.CreatePen(PS_SOLID, 1, RGB(153, 153, 204));
}

CColorProgressCtrl::~CColorProgressCtrl()
{
}


BEGIN_MESSAGE_MAP(CColorProgressCtrl, CProgressCtrl)
	//{{AFX_MSG_MAP(CColorProgressCtrl)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorProgressCtrl message handlers

void CColorProgressCtrl::OnPaint() 
{
	CPaintDC dc(this);
	BOOL bVertical = GetStyle() & PBS_VERTICAL;    //是否是垂直的

	CRect pRect;
	GetClientRect(pRect);
	pRect.DeflateRect(2, 2, 2, 2);
	CRect mProgressRect(pRect);  //滚动条的矩形

	int nStart, nEnd;
	this->GetRange(nStart, nEnd);
	int nRange = nEnd - nStart;
	int pos = GetPos();

	CPoint rcTextRect = pRect.CenterPoint();
	CSize len = dc.GetTextExtent(m_strCaption);
	rcTextRect.x -= (len.cx / 2);
	rcTextRect.y -= (len.cy / 2);   //设置文本所占的矩形

	int nPrg;	 
	if (!bVertical)        //如果是水平滚动条
	{
		nPrg = (pRect.Width() * pos) / nRange;
		mProgressRect.right = mProgressRect.left + nPrg;		
	}

	if (bVertical)         //如果是垂直滚动条 
	{
		nPrg = (pRect.Height() * pos) / nRange;
		mProgressRect.top = mProgressRect.bottom - nPrg;
	}

	CRect drawRect(rcTextRect.x, rcTextRect.y, mProgressRect.right, mProgressRect.bottom);

	CRect rectGrey(pRect);
	if (bVertical)
	{
		rectGrey.bottom = mProgressRect.top;
	}
	else
	{
		rectGrey.left = mProgressRect.right;
	}

	dc.SelectObject(&nBkBrush);
	dc.SelectStockObject(NULL_PEN);
	dc.Rectangle(rectGrey);

	if (!bVertical)      
	{
		dc.SelectStockObject(DEFAULT_GUI_FONT);
		dc.SetBkMode(TRANSPARENT);
		dc.SetTextColor(RGB(128, 128, 128));
		dc.TextOut(rcTextRect.x, rcTextRect.y , m_strCaption);
		dc.SetTextColor(RGB(255, 255, 255));
		dc.TextOut(rcTextRect.x + 1, rcTextRect.y + 1 , m_strCaption);

		dc.SelectStockObject(NULL_PEN);
		dc.SelectObject(&nProgressBrush);
		dc.Rectangle(mProgressRect);

		dc.SetTextColor(RGB(60, 60, 80));
		dc.DrawText(m_strCaption, drawRect, DT_LEFT );

		dc.SetTextColor(RGB(255, 255, 255));
		drawRect.left += 1;
		drawRect.top += 1;
		dc.DrawText(m_strCaption, drawRect, DT_LEFT );
	}
	else 
	{
		dc.SelectStockObject(NULL_PEN);
		dc.SelectObject(&nProgressBrush);
		dc.Rectangle(mProgressRect);
	}
}



void CColorProgressCtrl::SetText(CString strText)
{
	m_strCaption = strText;
}

CString CColorProgressCtrl::GetText()
{
	return m_strCaption;
}



BOOL CColorProgressCtrl::OnEraseBkgnd(CDC* pDC) 
{
	CDC *gDC = pDC;

	pDC = GetWindowDC();
	CRect rectItem, mRect;
	GetWindowRect(mRect);
	GetParent()->ClientToScreen(rectItem);
	GetClientRect(rectItem);

	rectItem.right = rectItem.left + mRect.Width();
	rectItem.bottom = rectItem.top + mRect.Height();

	CPoint TopLeft(rectItem.left, rectItem.top);
	CPoint BottomRight(rectItem.right - 1, rectItem.bottom - 1);
	CPoint TopRight(rectItem.right - 1, rectItem.top);
	CPoint BottomLeft(rectItem.left, rectItem.bottom - 1);

	pDC->SelectObject(&nDarkBorder);
	pDC->MoveTo(TopLeft);
	pDC->LineTo(TopRight);
	pDC->MoveTo(TopLeft);
	pDC->LineTo(BottomLeft);

	pDC->MoveTo(BottomLeft.x, BottomLeft.y - 1);
	pDC->LineTo(BottomRight.x, BottomRight.y - 1);
	pDC->MoveTo(BottomRight.x - 1, BottomRight.y);
	pDC->LineTo(TopRight.x - 1, TopRight.y);

	pDC->SelectObject(&nWhiteBorder);

	pDC->MoveTo(BottomLeft);
	pDC->LineTo(BottomRight);
	pDC->MoveTo(BottomRight);
	pDC->LineTo(TopRight);

	pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
	pDC->LineTo(TopRight.x - 1, TopRight.y + 1);
	pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
	pDC->LineTo(BottomLeft.x + 1, BottomLeft.y - 1);
	ReleaseDC(pDC);
	pDC = gDC;
	return TRUE;	
//	return CProgressCtrl::OnEraseBkgnd(pDC);  //去掉默认的返回值
}

⌨️ 快捷键说明

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