//
=========================================================
//
// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.
// All Rights Reserved.
//
// Product: iW988
// File: GradientProgressCtrl.h
// Created: 天衣有缝
//
// Description:2004.12.28 20:12:00
// ValueAdded main program for iW988.
// Contact:
// waterpub@mail.csdn.net
//
// =========================================================
#pragma once
class CGradientProgressCtrl : public CProgressCtrl
{
public :
CGradientProgressCtrl() ; // 构造
virtual ~ CGradientProgressCtrl() ; // 析构
int SetPos( int nPos) ; // 设置位置
int SetStep( int nStep) ; // 设置步进值
void SetRange( int nLower, int nUpper) ; // 设置范围
int SetText( const char * pText, BOOL bRepaint = TRUE) ; // 设置显示文字
public :
void ShowPercent(BOOL bShowPercent = TRUE) { m_bShowPercent = bShowPercent; } // 显示百分比
void ShowText(BOOL bShowText = TRUE) { m_bShowText = bShowText; } // 显示文字
public :
COLORREF GetTextColor( void ) { return m_clrText ; } // 取得字体颜色
COLORREF GetBkColor( void ) { return m_clrBkGround ; } // 取得背景颜色
COLORREF GetStartColor( void ) { return m_clrStart ; } // 取得开始颜色
COLORREF GetEndColor( void ) { return m_clrEnd ; } // 取得结束颜色
void SetStartColor(COLORREF color) { m_clrStart = color ; } // 设置字体颜色
void SetEndColor(COLORREF color) { m_clrEnd = color ; } // 设置背景颜色
void SetTextColor(COLORREF color) { m_clrText = color ; } // 设置开始颜色
void SetBkColor(COLORREF color) // 设置结束颜色
{
m_clrBkGround = color ;
m_BKGroundBrush.DeleteObject();
m_BKGroundBrush.CreateSolidBrush(m_clrBkGround);
}
private :
void Draw(CPaintDC * pDC, const RECT & rectClient, const int & nMaxWidth);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
private :
// 变量定义
int m_nLower ; // 最小值
int m_nUpper ; // 最大值
int m_nStep ; // 步进值
int m_nCurPos ; // 当前值
COLORREF m_clrStart ; // 起始颜色
COLORREF m_clrEnd ; // 结束颜色
COLORREF m_clrBkGround ; // 背景颜色
COLORREF m_clrText ; // 文本颜色
BOOL m_bShowPercent ; // 显示百分比
BOOL m_bShowText ; // 显示文字
char m_Text[ 32 ] ; // 文字:如显示拷贝速度
char m_Percent[ 4 ] ; // 文字:百分比
CBrush m_BKGroundBrush ; // 背景刷子
CBrush m_TempBrush ; // 临时刷子
private :
// 内嵌类
class CMemDC : public CDC // 内存设备环境
{
public :
CMemDC(CDC * pDC):CDC()
{
ASSERT(pDC != NULL);
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = ! pDC -> IsPrinting();
// 图形设备还是打印机设备
if (m_bMemDC)
{
pDC -> GetClipBox( & m_rect);
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject( & m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else // 为相关的现有设备准备打印
{
m_bPrinting = pDC -> m_bPrinting;
m_hDC = pDC -> m_hDC;
m_hAttribDC = pDC -> m_hAttribDC;
}
}
virtual ~ CMemDC()
{
if (m_bMemDC)
{
m_pDC -> BitBlt(m_rect.left,
m_rect.top,
m_rect.Width(),
m_rect.Height(),
this ,
m_rect.left,
m_rect.top,
SRCCOPY
);
SelectObject(m_pOldBitmap);
}
else
{
m_hDC = m_hAttribDC = NULL;
}
}
CMemDC * operator -> ()
{
return this ;
}
operator CMemDC * ()
{
return this ;
}
private :
CBitmap m_bitmap;
CBitmap * m_pOldBitmap; //
CDC * m_pDC; //
CRect m_rect; //
BOOL m_bMemDC; //
};
};
// =========================================================
//
// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.
// All Rights Reserved.
//
// Product: iW988
// File: GradientProgressCtrl.cpp
// Created: 天衣有缝
//
// Description:
// ValueAdded main program for iW988.
// Contact:
// waterpub@mail.csdn.net
//
// =========================================================
#include " stdafx.h "
#include " GradientProgressCtrl.h "
CGradientProgressCtrl::CGradientProgressCtrl()
{
// 控件初始化
m_nLower = 0 ;
m_nUpper = 100 ;
m_nCurPos = 0 ;
m_nStep = 1 ;
// 初始化显示颜色
m_clrStart = COLORREF(RGB( 255 , 0 , 0 )) ;
m_clrEnd = COLORREF(RGB( 0 , 0 , 255 )) ;
m_clrBkGround = ::GetSysColor(COLOR_3DFACE) ;
m_clrText = COLORREF(RGB( 255 , 255 , 255 )) ;
// 显示百分比,文字
m_bShowPercent = TRUE ;
m_bShowText = TRUE ;
m_BKGroundBrush.CreateSolidBrush(m_clrBkGround) ;
memset(m_Text, 0 , 32 );
}
CGradientProgressCtrl:: ~ CGradientProgressCtrl()
{
m_BKGroundBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)
ON_WM_PAINT()
END_MESSAGE_MAP()
/// //
// CGradientProgressCtrl 消息处理程序
void CGradientProgressCtrl::SetRange( int nLower, int nUpper)
{
// 设置进度条的范围
m_nLower = nLower ;
m_nUpper = nUpper ;
m_nCurPos = nLower ;
CProgressCtrl::SetRange(nLower, nUpper);
CProgressCtrl::SetPos(nLower);
}
int CGradientProgressCtrl::SetStep( int nStep)
{
// 设置步进值
m_nStep = nStep;
return (CProgressCtrl::SetStep(nStep));
}
int CGradientProgressCtrl::SetPos( int nPos)
{
// 设置进度条位置
m_nCurPos = nPos;
return (CProgressCtrl::SetPos(nPos));
}
int CGradientProgressCtrl::SetText( const char * pText, BOOL bRepaint)
{
// 显示的文字
strcpy(m_Text, pText);
if (bRepaint && m_bShowText)
{
Invalidate(TRUE);
}
return 0 ;
}
void CGradientProgressCtrl::OnPaint()
{
CPaintDC dc( this ); // 设备环境
// TODO: 重画进度条
RECT rectClient;
GetClientRect( & rectClient);
if (m_nCurPos <= m_nLower || m_nCurPos > m_nUpper)
{
// 不在范围之内直接以背景色填充
dc.FillRect( & rectClient, & m_BKGroundBrush);
return ;
}
// 绘制进度条本身
float maxWidth(( float ) m_nCurPos / ( float ) m_nUpper * ( float ) rectClient.right);
Draw( & dc, rectClient, ( int ) maxWidth);
// 文字显示
dc.SetTextColor(m_clrText);
dc.SetBkMode(TRANSPARENT);
HGDIOBJ hOldFont = ::SelectObject(dc.m_hDC, ::GetStockObject(DEFAULT_GUI_FONT));
if (m_bShowPercent)
{
// 显示进程条百分比
sprintf(m_Percent, " %d%% " ,( int ) ( 100 * ( float ) m_nCurPos / m_nUpper));
dc.DrawText(m_Percent, & rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
if (m_bShowText)
{
// 显示进程条文字
rectClient.left = (rectClient.left + rectClient.right) / 2 ;
dc.DrawText(m_Text, & rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
::SelectObject(dc.m_hDC, hOldFont);
// 不要调用 CProgressCtrl::OnPaint()
}
void CGradientProgressCtrl::Draw(CPaintDC * pDC, const RECT & rectClient, const int & nMaxWidth)
{
RECT rectFill; // 显示区域
float fStep; // 每一步的幅宽
CMemDC memDC(pDC);
int r, g, b;
float rStep, gStep, bStep;
// 得到不同颜色并相减,返回颜色之间的最大差值
r = (GetRValue(m_clrEnd) - GetRValue(m_clrStart));
g = (GetGValue(m_clrEnd) - GetGValue(m_clrStart));
b = (GetBValue(m_clrEnd) - GetBValue(m_clrStart));
// 使进程条显示的总数 等于最大的颜色差值
int nSteps = max(abs(r), max(abs(g), abs(b)));
// 确定每一颜色填充多大的矩形区域
fStep = ( float ) rectClient.right / ( float ) nSteps;
// 设置每一颜色填充的步数
rStep = r / ( float ) nSteps;
gStep = g / ( float ) nSteps;
bStep = b / ( float ) nSteps;
r = GetRValue(m_clrStart);
g = GetGValue(m_clrStart);
b = GetBValue(m_clrStart);
// 绘制颜色渐变的进程条
for ( int iOnBand = 0 ; iOnBand < nSteps; iOnBand ++ )
{
::SetRect( & rectFill, ( int ) (iOnBand * fStep), 0 , // 填充矩形区域的左上角x,y和右下角x,y
( int ) ((iOnBand + 1 ) * fStep), rectClient.bottom + 1 );
VERIFY(m_TempBrush.CreateSolidBrush(RGB(r + rStep * iOnBand,
g + gStep * iOnBand,
b + bStep * iOnBand)));
memDC.FillRect( & rectFill, & m_TempBrush);
VERIFY(m_TempBrush.DeleteObject());
// 在结束绘制之前,使用背景色填充乘下的的客户区域
if (rectFill.right > nMaxWidth)
{
::SetRect( & rectFill, rectFill.right, 0 , rectClient.right,
rectClient.bottom);
VERIFY(m_TempBrush.CreateSolidBrush(m_clrBkGround));
memDC.FillRect( & rectFill, & m_TempBrush);
VERIFY(m_TempBrush.DeleteObject());
return ;
}
}
}
//
// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.
// All Rights Reserved.
//
// Product: iW988
// File: GradientProgressCtrl.h
// Created: 天衣有缝
//
// Description:2004.12.28 20:12:00
// ValueAdded main program for iW988.
// Contact:
// waterpub@mail.csdn.net
//
// =========================================================
#pragma once
class CGradientProgressCtrl : public CProgressCtrl
{
public :
CGradientProgressCtrl() ; // 构造
virtual ~ CGradientProgressCtrl() ; // 析构
int SetPos( int nPos) ; // 设置位置
int SetStep( int nStep) ; // 设置步进值
void SetRange( int nLower, int nUpper) ; // 设置范围
int SetText( const char * pText, BOOL bRepaint = TRUE) ; // 设置显示文字
public :
void ShowPercent(BOOL bShowPercent = TRUE) { m_bShowPercent = bShowPercent; } // 显示百分比
void ShowText(BOOL bShowText = TRUE) { m_bShowText = bShowText; } // 显示文字
public :
COLORREF GetTextColor( void ) { return m_clrText ; } // 取得字体颜色
COLORREF GetBkColor( void ) { return m_clrBkGround ; } // 取得背景颜色
COLORREF GetStartColor( void ) { return m_clrStart ; } // 取得开始颜色
COLORREF GetEndColor( void ) { return m_clrEnd ; } // 取得结束颜色
void SetStartColor(COLORREF color) { m_clrStart = color ; } // 设置字体颜色
void SetEndColor(COLORREF color) { m_clrEnd = color ; } // 设置背景颜色
void SetTextColor(COLORREF color) { m_clrText = color ; } // 设置开始颜色
void SetBkColor(COLORREF color) // 设置结束颜色
{
m_clrBkGround = color ;
m_BKGroundBrush.DeleteObject();
m_BKGroundBrush.CreateSolidBrush(m_clrBkGround);
}
private :
void Draw(CPaintDC * pDC, const RECT & rectClient, const int & nMaxWidth);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
private :
// 变量定义
int m_nLower ; // 最小值
int m_nUpper ; // 最大值
int m_nStep ; // 步进值
int m_nCurPos ; // 当前值
COLORREF m_clrStart ; // 起始颜色
COLORREF m_clrEnd ; // 结束颜色
COLORREF m_clrBkGround ; // 背景颜色
COLORREF m_clrText ; // 文本颜色
BOOL m_bShowPercent ; // 显示百分比
BOOL m_bShowText ; // 显示文字
char m_Text[ 32 ] ; // 文字:如显示拷贝速度
char m_Percent[ 4 ] ; // 文字:百分比
CBrush m_BKGroundBrush ; // 背景刷子
CBrush m_TempBrush ; // 临时刷子
private :
// 内嵌类
class CMemDC : public CDC // 内存设备环境
{
public :
CMemDC(CDC * pDC):CDC()
{
ASSERT(pDC != NULL);
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = ! pDC -> IsPrinting();
// 图形设备还是打印机设备
if (m_bMemDC)
{
pDC -> GetClipBox( & m_rect);
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject( & m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else // 为相关的现有设备准备打印
{
m_bPrinting = pDC -> m_bPrinting;
m_hDC = pDC -> m_hDC;
m_hAttribDC = pDC -> m_hAttribDC;
}
}
virtual ~ CMemDC()
{
if (m_bMemDC)
{
m_pDC -> BitBlt(m_rect.left,
m_rect.top,
m_rect.Width(),
m_rect.Height(),
this ,
m_rect.left,
m_rect.top,
SRCCOPY
);
SelectObject(m_pOldBitmap);
}
else
{
m_hDC = m_hAttribDC = NULL;
}
}
CMemDC * operator -> ()
{
return this ;
}
operator CMemDC * ()
{
return this ;
}
private :
CBitmap m_bitmap;
CBitmap * m_pOldBitmap; //
CDC * m_pDC; //
CRect m_rect; //
BOOL m_bMemDC; //
};
};
// =========================================================
//
// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.
// All Rights Reserved.
//
// Product: iW988
// File: GradientProgressCtrl.cpp
// Created: 天衣有缝
//
// Description:
// ValueAdded main program for iW988.
// Contact:
// waterpub@mail.csdn.net
//
// =========================================================
#include " stdafx.h "
#include " GradientProgressCtrl.h "
CGradientProgressCtrl::CGradientProgressCtrl()
{
// 控件初始化
m_nLower = 0 ;
m_nUpper = 100 ;
m_nCurPos = 0 ;
m_nStep = 1 ;
// 初始化显示颜色
m_clrStart = COLORREF(RGB( 255 , 0 , 0 )) ;
m_clrEnd = COLORREF(RGB( 0 , 0 , 255 )) ;
m_clrBkGround = ::GetSysColor(COLOR_3DFACE) ;
m_clrText = COLORREF(RGB( 255 , 255 , 255 )) ;
// 显示百分比,文字
m_bShowPercent = TRUE ;
m_bShowText = TRUE ;
m_BKGroundBrush.CreateSolidBrush(m_clrBkGround) ;
memset(m_Text, 0 , 32 );
}
CGradientProgressCtrl:: ~ CGradientProgressCtrl()
{
m_BKGroundBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)
ON_WM_PAINT()
END_MESSAGE_MAP()
/// //
// CGradientProgressCtrl 消息处理程序
void CGradientProgressCtrl::SetRange( int nLower, int nUpper)
{
// 设置进度条的范围
m_nLower = nLower ;
m_nUpper = nUpper ;
m_nCurPos = nLower ;
CProgressCtrl::SetRange(nLower, nUpper);
CProgressCtrl::SetPos(nLower);
}
int CGradientProgressCtrl::SetStep( int nStep)
{
// 设置步进值
m_nStep = nStep;
return (CProgressCtrl::SetStep(nStep));
}
int CGradientProgressCtrl::SetPos( int nPos)
{
// 设置进度条位置
m_nCurPos = nPos;
return (CProgressCtrl::SetPos(nPos));
}
int CGradientProgressCtrl::SetText( const char * pText, BOOL bRepaint)
{
// 显示的文字
strcpy(m_Text, pText);
if (bRepaint && m_bShowText)
{
Invalidate(TRUE);
}
return 0 ;
}
void CGradientProgressCtrl::OnPaint()
{
CPaintDC dc( this ); // 设备环境
// TODO: 重画进度条
RECT rectClient;
GetClientRect( & rectClient);
if (m_nCurPos <= m_nLower || m_nCurPos > m_nUpper)
{
// 不在范围之内直接以背景色填充
dc.FillRect( & rectClient, & m_BKGroundBrush);
return ;
}
// 绘制进度条本身
float maxWidth(( float ) m_nCurPos / ( float ) m_nUpper * ( float ) rectClient.right);
Draw( & dc, rectClient, ( int ) maxWidth);
// 文字显示
dc.SetTextColor(m_clrText);
dc.SetBkMode(TRANSPARENT);
HGDIOBJ hOldFont = ::SelectObject(dc.m_hDC, ::GetStockObject(DEFAULT_GUI_FONT));
if (m_bShowPercent)
{
// 显示进程条百分比
sprintf(m_Percent, " %d%% " ,( int ) ( 100 * ( float ) m_nCurPos / m_nUpper));
dc.DrawText(m_Percent, & rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
if (m_bShowText)
{
// 显示进程条文字
rectClient.left = (rectClient.left + rectClient.right) / 2 ;
dc.DrawText(m_Text, & rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
::SelectObject(dc.m_hDC, hOldFont);
// 不要调用 CProgressCtrl::OnPaint()
}
void CGradientProgressCtrl::Draw(CPaintDC * pDC, const RECT & rectClient, const int & nMaxWidth)
{
RECT rectFill; // 显示区域
float fStep; // 每一步的幅宽
CMemDC memDC(pDC);
int r, g, b;
float rStep, gStep, bStep;
// 得到不同颜色并相减,返回颜色之间的最大差值
r = (GetRValue(m_clrEnd) - GetRValue(m_clrStart));
g = (GetGValue(m_clrEnd) - GetGValue(m_clrStart));
b = (GetBValue(m_clrEnd) - GetBValue(m_clrStart));
// 使进程条显示的总数 等于最大的颜色差值
int nSteps = max(abs(r), max(abs(g), abs(b)));
// 确定每一颜色填充多大的矩形区域
fStep = ( float ) rectClient.right / ( float ) nSteps;
// 设置每一颜色填充的步数
rStep = r / ( float ) nSteps;
gStep = g / ( float ) nSteps;
bStep = b / ( float ) nSteps;
r = GetRValue(m_clrStart);
g = GetGValue(m_clrStart);
b = GetBValue(m_clrStart);
// 绘制颜色渐变的进程条
for ( int iOnBand = 0 ; iOnBand < nSteps; iOnBand ++ )
{
::SetRect( & rectFill, ( int ) (iOnBand * fStep), 0 , // 填充矩形区域的左上角x,y和右下角x,y
( int ) ((iOnBand + 1 ) * fStep), rectClient.bottom + 1 );
VERIFY(m_TempBrush.CreateSolidBrush(RGB(r + rStep * iOnBand,
g + gStep * iOnBand,
b + bStep * iOnBand)));
memDC.FillRect( & rectFill, & m_TempBrush);
VERIFY(m_TempBrush.DeleteObject());
// 在结束绘制之前,使用背景色填充乘下的的客户区域
if (rectFill.right > nMaxWidth)
{
::SetRect( & rectFill, rectFill.right, 0 , rectClient.right,
rectClient.bottom);
VERIFY(m_TempBrush.CreateSolidBrush(m_clrBkGround));
memDC.FillRect( & rectFill, & m_TempBrush);
VERIFY(m_TempBrush.DeleteObject());
return ;
}
}
}