mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-01 03:17:37 +08:00
170 lines
4.0 KiB
C++
170 lines
4.0 KiB
C++
// MeterCtrl.cpp : 实现文件
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include ".\Meterctrl.h"
|
|
|
|
|
|
// CMeterCtrl
|
|
|
|
IMPLEMENT_DYNAMIC(CMeterCtrl, CWnd)
|
|
CMeterCtrl::CMeterCtrl()
|
|
: m_nLower(0)
|
|
, m_nUpper(0)
|
|
, m_nPos(0)
|
|
{
|
|
}
|
|
|
|
CMeterCtrl::~CMeterCtrl()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CMeterCtrl, CWnd)
|
|
ON_WM_PAINT()
|
|
ON_WM_ERASEBKGND()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
// CMeterCtrl 消息处理程序
|
|
|
|
|
|
void CMeterCtrl::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
// TODO: 在此处添加消息处理程序代码
|
|
// 不为绘图消息调用 CWnd::OnPaint()
|
|
CRect rClient;
|
|
GetClientRect(rClient);
|
|
CRect rLeft = rClient;
|
|
CRect rRight = rClient;
|
|
UINT nRange = m_nUpper - m_nLower;
|
|
|
|
rLeft.right = (LONG)(((m_nPos - m_nLower) * rClient.Width())/ nRange);
|
|
rRight.left = rLeft.right;
|
|
|
|
CRgn rgnLeft, rgnRight;
|
|
rgnLeft.CreateRectRgnIndirect(rLeft);
|
|
rgnRight.CreateRectRgnIndirect(rRight);
|
|
|
|
CBrush *pBrush = CBrush::FromHandle(GetSysColorBrush(COLOR_HIGHLIGHT));
|
|
dc.FillRect(rLeft, pBrush);
|
|
CString msg;
|
|
|
|
// msg.Format(">>left=%d, right=%d, top=%d, bottom=%d, nrange=%d, width=%d, npos=%d, nlower=%d",
|
|
// rLeft.left, rLeft.right, rLeft.top, rLeft.bottom,
|
|
// nRange, rClient.Width(), m_nPos, m_nLower);
|
|
// AfxMessageBox(msg);
|
|
|
|
//CString strCaption;
|
|
//GetWindowText(strCaption);
|
|
|
|
//strCaption.Format("%d%% (%d)", ((m_nPos - m_nLower) * 100)/ nRange, m_nPos);
|
|
|
|
dc.SelectClipRgn(&rgnLeft);
|
|
dc.SetBkMode(TRANSPARENT);
|
|
dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
dc.DrawText(m_sCaption, rClient, DT_BOTTOM | DT_CENTER);
|
|
dc.SelectClipRgn(&rgnRight);
|
|
dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT));
|
|
dc.DrawText(m_sCaption, rClient, DT_BOTTOM | DT_CENTER);
|
|
}
|
|
|
|
BOOL CMeterCtrl::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
// TODO: 在此添加消息处理程序代码和/或调用默认值
|
|
CRect r;
|
|
GetClientRect(r);
|
|
CBrush *pBrush = CBrush::FromHandle(GetSysColorBrush(COLOR_BTNFACE));
|
|
pDC->FillRect(r, pBrush);
|
|
|
|
return TRUE;
|
|
// return CWnd::OnEraseBkgnd(pDC);
|
|
}
|
|
|
|
BOOL CMeterCtrl::Create(LPCTSTR lpszWindowName, DWORD dwStyle,
|
|
const RECT& rect, CWnd* pParentWnd, HMENU nID)
|
|
{
|
|
// TODO: 在此添加专用代码和/或调用基类
|
|
static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
|
|
|
|
return CWnd::CreateEx(WS_EX_STATICEDGE, //WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
|
|
className, lpszWindowName, dwStyle,
|
|
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
|
|
pParentWnd->GetSafeHwnd(), (HMENU) nID);
|
|
|
|
// return CWnd::Create(lpszClassName, lpszWindowName, dwStyle,
|
|
// rect, pParentWnd, nID, pContext);
|
|
}
|
|
|
|
BOOL CMeterCtrl::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
|
|
LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect,
|
|
CWnd* pParentWnd, UINT nID, LPVOID lpParam)
|
|
{
|
|
// TODO: 在此添加专用代码和/或调用基类
|
|
|
|
static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
|
|
|
|
return CWnd::CreateEx(dwExStyle, //WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
|
|
lpszClassName, lpszWindowName, dwStyle,
|
|
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
|
|
pParentWnd->GetSafeHwnd(), (HMENU) nID);
|
|
|
|
//return CWnd::CreateEx(dwExStyle, lpszClassName, lpszWindowName,
|
|
// dwStyle, rect, pParentWnd, nID, lpParam);
|
|
}
|
|
|
|
UINT CMeterCtrl::SetPos(UINT nPos)
|
|
{
|
|
ASSERT(nPos >= m_nLower && nPos <= m_nUpper);
|
|
|
|
UINT nRange = m_nUpper - m_nLower;
|
|
UINT nOld = m_nPos;
|
|
m_nPos = nPos;
|
|
|
|
m_sCaption.Format("%d%% (%d)", ((m_nPos - m_nLower) * 100)/ nRange, m_nPos);
|
|
InvalidateMeater();
|
|
|
|
return nOld;
|
|
}
|
|
|
|
void CMeterCtrl::SetRange(UINT nLower, UINT nUpper)
|
|
{
|
|
ASSERT(nLower >= 0 && nLower < 0xffff);
|
|
ASSERT(nUpper > nLower && nUpper < 0xffff);
|
|
|
|
m_nLower = nLower;
|
|
m_nUpper = nUpper;
|
|
|
|
InvalidateMeater();
|
|
}
|
|
|
|
void CMeterCtrl::StepIt(void)
|
|
{
|
|
m_nPos++;
|
|
if (m_nPos > m_nUpper)
|
|
m_nPos = m_nLower;
|
|
|
|
InvalidateMeater();
|
|
}
|
|
|
|
void CMeterCtrl::SetText(CString& msg)
|
|
{
|
|
m_sCaption = msg;
|
|
InvalidateMeater();
|
|
}
|
|
|
|
void CMeterCtrl::SetText(const char* pMsg)
|
|
{
|
|
m_sCaption = pMsg;
|
|
InvalidateMeater();
|
|
}
|
|
|
|
void CMeterCtrl::InvalidateMeater(void)
|
|
{
|
|
CRect r;
|
|
GetClientRect(r);
|
|
InvalidateRect(r);
|
|
}
|