Skip to content

Instantly share code, notes, and snippets.

@nibasya
Created September 8, 2018 12:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nibasya/3a185c716e3bff2da938623bf844cdd9 to your computer and use it in GitHub Desktop.
Save nibasya/3a185c716e3bff2da938623bf844cdd9 to your computer and use it in GitHub Desktop.
// InfoProgressCtrl.cpp : インプリメンテーション ファイル
//
/*
03/08/03 CRgn を用いてクリッピングするようにした
3D表示に対応した
18/08/29 クラス名をCInfoProgressBarからCInfoProgressCtrlに変更。
CProgressCtrlのバー表示機能を残したまま、上にテキストを表示するよう変更。
独自のバー表示機能は削除。SetColorをSetTxtColorに変更。
18/09/08 プログレスバーの伸長速度を切替えるSetSmoothMove(bool smooth)を追加。
smooth=falseで瞬時に伸長するようになる。デフォルトではtrue(元のコントロールと同じ)。
*/
#include "stdafx.h"
#include "InfoProgressCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/****************************************************************************
Name: CInfoProgressCtrl()
Desc: コンストラクタ.
Arg: ---
Return: ---
****************************************************************************/
CInfoProgressCtrl::CInfoProgressCtrl()
{
// デフォルト色設定
m_rgbIn = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_rgbOut = ::GetSysColor(COLOR_WINDOWTEXT);
// プログレスバーの初期値設定
m_rangeMin = 0;
m_rangeMax = 100;
m_Pos = 0;
m_Step = 10;
// デフォルト伸長速度
m_smoothMove = true;
}
/****************************************************************************
Name: CInfoProgressCtrl()
Desc: デストラクタ.
Arg: ---
Return: ---
****************************************************************************/
CInfoProgressCtrl::~CInfoProgressCtrl()
{
}
/****************************************************************************
Name: DrawBar()
Desc: バーを描画する.
Arg: デバイスコンテキスト
Return: ---
****************************************************************************/
void CInfoProgressCtrl::DrawText(CDC* pDC)
{
// バーを描画する領域を求める
CRect rcBar = m_rcBarMax;
int nLower, nUpper;
GetRange(nLower, nUpper);
rcBar.right = (rcBar.Width() * (GetPos() - nLower)) / (nUpper - nLower);
//-----------------------------------------------------------------------
// 文字列描画
CString strText;
UINT nFormat = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
// リージョンを作成
CRect rcIn = rcBar; // バー内
CRect rcOut = m_rcBarMax; // バー外
rcOut.left = rcBar.right;
CRgn rgnIn;
CRgn rgnOut;
rgnIn.CreateRectRgnIndirect(rcIn);
rgnOut.CreateRectRgnIndirect(rcOut);
GetWindowText(strText);
pDC->SelectObject(&m_font);
pDC->SetBkMode(TRANSPARENT);
// バー内にある文字列描画
pDC->SetTextColor(m_rgbIn);
pDC->SelectClipRgn(&rgnIn);
pDC->DrawText(strText, m_rcBarMax, nFormat);
// バー外にある文字列描画
pDC->SetTextColor(m_rgbOut);
pDC->SelectClipRgn(&rgnOut);
pDC->DrawText(strText, m_rcBarMax, nFormat);
}
/****************************************************************************
Name: PreSubclassWindow()
Desc: サブクラス化の前に呼ばれる.
Arg: ---
Return: ---
****************************************************************************/
void CInfoProgressCtrl::PreSubclassWindow()
{
// デフォルトの文字列を消去
SetWindowText(_T(""));
// フォント作成
LOGFONT lf;
GetFont()->GetLogFont(&lf);
m_font.CreateFontIndirect(&lf);
CProgressCtrl::PreSubclassWindow();
}
/****************************************************************************
Message Handlers
****************************************************************************/
BEGIN_MESSAGE_MAP(CInfoProgressCtrl, CProgressCtrl)
//{{AFX_MSG_MAP(CInfoProgressCtrl)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/****************************************************************************
Name: OnPaint()
Desc: ---
Arg: ---
Return: ---
****************************************************************************/
void CInfoProgressCtrl::OnPaint()
{
Default();
CClientDC dc(this); // 描画用のデバイス コンテキスト
GetClientRect(&m_rcBarMax);
m_rcBarMax.DeflateRect(1, 1);
DrawText(&dc);
}
/****************************************************************************
Name: OnSetText()
Desc: 文字列が変更されたとき.
Arg: ---
Return: ---
****************************************************************************/
LRESULT CInfoProgressCtrl::OnSetText(WPARAM wParam, LPARAM lParam)
{
LRESULT res = Default();
Invalidate(); // 再描画
return res;
}
/****************************************************************************
Name: SetSmoothMove()
Desc: SetPosによるバーの伸長速度を変更する
Arg: smooth: true:滑らかに伸長する(default) false:瞬時に伸長する
Return: bool 変更前のsmoothを返す
****************************************************************************/
bool CInfoProgressCtrl::SetSmoothMove(const bool smooth)
{
bool ret = m_smoothMove;
m_smoothMove = smooth;
return ret;
}
/****************************************************************************
Name: SetRange()
Desc: プログレスバーの下限値と上限値を設定し再描画する SeeAlso:SetRange32
Arg: nLower:下限値 nUpper:上限値
Return: ---
****************************************************************************/
void CInfoProgressCtrl::SetRange(short nLower, short nUpper)
{
m_rangeMin = nLower;
m_rangeMax = nUpper;
CProgressCtrl::SetRange(nLower, nUpper);
}
/****************************************************************************
Name: SetRange32()
Desc: プログレスバーの下限値と上限値を設定し再描画する SeeAlso:SetRange
Arg: nLower:下限値 nUpper:上限値
Return: ---
****************************************************************************/
void CInfoProgressCtrl::SetRange32(int nLower, int nUpper)
{
m_rangeMin = nLower;
m_rangeMax = nUpper;
CProgressCtrl::SetRange32(nLower, nUpper);
}
/****************************************************************************
Name: SetStep()
Desc: プログレスバーを伸ばす量を設定する
Arg: nStep:伸長量
Return: 直前の伸長量
****************************************************************************/
int CInfoProgressCtrl::SetStep(int nStep)
{
m_Step = nStep;
return CProgressCtrl::SetStep(nStep);
}
/****************************************************************************
Name: StepIt()
Desc: プログレスバーを伸長する
Arg: ---
Return: 直前のプログレスバーの位置
****************************************************************************/
int CInfoProgressCtrl::StepIt()
{
m_Pos += m_Step;
if (!m_smoothMove) {
return InstantSetPos();
}
return CProgressCtrl::StepIt();
}
/****************************************************************************
Name: OffsetPos(int nPos)
Desc: プログレスバーをnPos伸ばす
Arg: nPos:伸長量
Return: 直前のプログレスバーの位置
****************************************************************************/
int CInfoProgressCtrl::OffsetPos(int nPos)
{
m_Pos += nPos;
if (!m_smoothMove) {
return InstantSetPos();
}
return CProgressCtrl::OffsetPos(nPos);
}
/****************************************************************************
Name: SetPos()
Desc: プログレスバーの位置をnPosに設定する
Arg: nPos: 位置
Return: 直前のプログレスバーの位置
****************************************************************************/
int CInfoProgressCtrl::SetPos(int nPos)
{
m_Pos = nPos;
if (!m_smoothMove) {
return InstantSetPos();
}
return CProgressCtrl::SetPos(nPos);
}
/****************************************************************************
Name: InstantSetPos()
Desc: プログレスバーの位置を瞬時にm_Posに設定する
Arg: nPos: 位置
Return: 直前のプログレスバーの位置
****************************************************************************/
int CInfoProgressCtrl::InstantSetPos() {
int ret;
if (m_Pos >= m_rangeMax) {
CProgressCtrl::SetRange32(m_rangeMin, m_Pos + 1);
ret = CProgressCtrl::SetPos(m_Pos + 1);
CProgressCtrl::SetPos(m_Pos);
CProgressCtrl::SetRange32(m_rangeMin, m_rangeMax);
}
else {
ret = CProgressCtrl::SetPos(m_Pos + 1);
CProgressCtrl::SetPos(m_Pos);
}
return ret;
}
/****************************************************************************
Name: InfoProgresssCtrl.h
Desc: CProgressCtrlに文字情報表示機能を追加.
Author: donadona
reidphoaさんのInfoProgressBar.hより改変
*********************************************************************/
#if !defined(AFX_INFOPROGRESSCTRL_H__09E9DBA9_0BB8_4EF2_9208_C4A44A679B89__INCLUDED_)
#define AFX_INFOPROGRESSCTRL_H__09E9DBA9_0BB8_4EF2_9208_C4A44A679B89__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CInfoProgressCtrl : public CProgressCtrl
{
public:
CInfoProgressCtrl();
virtual ~CInfoProgressCtrl();
virtual void SetTxtColor(COLORREF rgbIn, COLORREF rgbOut)
{
m_rgbIn = rgbIn;
m_rgbOut = rgbOut;
}
// smooth:true(default) バーを滑らかに伸ばす false:バーを速やかに伸ばす
virtual bool SetSmoothMove(const bool smooth);
// オーバーライド
//{{AFX_VIRTUAL(CInfoProgressCtrl)
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// プログレスバーの下限値と上限値を設定し再描画する
virtual void SetRange(short nLower, short nUpper);
// プログレスバーの下限値と上限値を設定し再描画する
virtual void SetRange32(int nLower, int nUpper);
// プログレスバーを伸ばす量を設定する。返り値:直前の伸長量
virtual int SetStep(int nStep);
// プログレスバーを伸ばす。返り値:直前の位置
virtual int StepIt();
// プログレスバーをnPos伸ばす。返り値:直前の位置
virtual int OffsetPos(int nPos);
// プログレスバーの位置を設定する。返り値:直前の位置
virtual int SetPos(int nPos);
protected:
virtual void DrawText(CDC* pDC);
// プログレスバーの位置を瞬間的にm_Posへ変更する
int InstantSetPos();
CFont m_font; // フォント
COLORREF m_rgbIn; // 文字列の色(バー内)
COLORREF m_rgbOut; // 文字列の色(バー外)
CRect m_rcBarMax; // バーの領域
bool m_smoothMove; // true:滑らかに伸びる(デフォルト動作)
int m_rangeMin; // プログレスバーコントロールの下限値
int m_rangeMax; // プログレスバーコントロールの上限値
int m_Pos; // プログレスバーコントロールの現在値
int m_Step; // プログレスバーコントロールのステップ値
// 生成されたメッセージ マップ関数
//{{AFX_MSG(CInfoProgressCtrl)
afx_msg void OnPaint();
afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
#endif // !defined(AFX_INFOPROGRESSCTRL_H__09E9DBA9_0BB8_4EF2_9208_C4A44A679B89__INCLUDED_)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment