📄 tonalreg.cpp
字号:
// TonalReg.cpp : implementation file
//
#include "stdafx.h"
#include "RichiMP3.h"
#include "memdc.h"
#include "TonalReg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTonalReg
LPCSTR CTonalReg::m_pWndNameGT;
BOOL CTonalReg::RegisterWndClass();
int CTonalReg::m_bands[]={60,170,310,600,1000,3000,6000,12000,14000,16000,18000,20000};
CTonalReg::CTonalReg():m_graphColor(RGB(255,0,0)),
m_gridClr(RGB(155,200,111)) ,
m_capture (FALSE),m_oldxPt(0),m_oldyPt(0),m_tottalGain(0),
m_dispValue(0),m_grphs(12),m_showButs(1),m_bDragging(FALSE)
{
ZeroMemory(m_gains,sizeof(m_gains));
}
CTonalReg::~CTonalReg()
{
}
BEGIN_MESSAGE_MAP(CTonalReg, CWnd)
//{{AFX_MSG_MAP(CTonalReg)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTonalReg message handlers
BOOL CTonalReg::RegisterWndClass()
{
m_pWndNameGT = AfxRegisterWndClass(CS_DBLCLKS |CS_OWNDC|CS_HREDRAW|CS_VREDRAW,
::LoadCursor(NULL,IDC_ARROW),
(HBRUSH)GetStockObject(BLACK_BRUSH));
return TRUE;
}
int CTonalReg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
SetBkColor(RGB(0,0,0));
CreatePens();
return 0;
}
BOOL CTonalReg::CreateWndw(UINT id, CWnd* pParent)
{
CWnd* pWnd = pParent->GetDlgItem(id);
RECT rt;
pWnd->GetWindowRect(&rt);
pParent->ScreenToClient(&rt);
CreateEx(WS_EX_STATICEDGE, m_pWndNameGT , "",
WS_CHILD|WS_VISIBLE,rt.left,rt.top,
rt.right-rt.left,rt.bottom-rt.top,
pParent->m_hWnd,(HMENU)10010);
m_grdStepy = (rt.bottom-rt.top)/12;
m_grdStepx = ((rt.right-rt.left))/(m_grphs+1);
m_xMax = rt.right-rt.left;
m_yMax = rt.bottom-rt.top;
for(int i=0; i<(m_grphs+1); i++)
{
m_points[i].y=m_yMax/2;
m_points[i].x=(i*m_grdStepx) + m_grdStepx;
}
m_tottalGain = m_yMax/2;
pWnd->ShowWindow(SW_HIDE);
return TRUE;
}
void CTonalReg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CMemDC pDC(&dc);
GridIt(pDC);
DrawEqLine(pDC);
// Do not call CWnd::OnPaint() for painting messages
}
void CTonalReg::GridIt(CDC *pDC)
{
CPen* pOld = (CPen*)pDC->SelectObject(&m_gridPen);
/*
for(int j=m_yMax/2;j > 0;j-=m_grdStepy)
{
pDC->MoveTo(0,j);
pDC->LineTo(m_xMax,j);
}
for( j=m_yMax/2;j < m_yMax;j+=m_grdStepy)
{
pDC->MoveTo(0,j);
pDC->LineTo(m_xMax,j);
}
*/
pDC->SetBkColor(m_backColor);
CRect rcTemp = CRect(0,m_yMax/2-1,m_xMax,m_yMax/2+1);
pDC->MoveTo(0,m_yMax/2);
pDC->LineTo(m_xMax,m_yMax/2);
pDC->MoveTo(0,m_yMax-m_grdStepy-1);
pDC->LineTo(m_xMax,m_yMax-m_grdStepy-1);
pDC->MoveTo(0,m_grdStepy+2);
pDC->LineTo(m_xMax,m_grdStepy+2);
// DrawButton(pDC,rcTemp);
CPen* ptemp = pDC->SelectObject(&m_ggainPen);
rcTemp = CRect(0,m_tottalGain-1,m_xMax-10,m_tottalGain);
//pDC->MoveTo(0,m_tottalGain);
//pDC->LineTo(m_xMax-10,m_tottalGain);
pDC->Draw3dRect(rcTemp,RGB(191,191,191),m_gridClr);
rcTemp = CRect(m_xMax - 9,m_grdStepy+2,m_xMax - 7,m_yMax-m_grdStepy);
pDC->Draw3dRect(rcTemp,RGB(255,255,255),RGB(191,191,191));
int nKnobRadius = 6;
CPoint ptKnobCenter = CPoint(m_xMax-8,m_tottalGain);
// DrawButton(pDC,rcTemp);
if(m_bDragging)
{
DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DDKSHADOW));
DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT));
}
else
{
DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DHIGHLIGHT), ::GetSysColor(COLOR_3DHIGHLIGHT));
DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DLIGHT), ::GetSysColor(COLOR_3DSHADOW));
}
//rcTemp = CRect(0,m_tottalGain-5,10,m_tottalGain+5);
//DrawButton(pDC,rcTemp);
pDC->SelectObject(ptemp);
pDC->SetTextColor(RGB(0,255,0));
int mode = pDC->SetBkMode(TRANSPARENT);
for(int i=m_grdStepx,k=1;i < m_xMax && k < (1+m_grphs);i+=m_grdStepx,k++)
{
rcTemp = CRect(i-5,m_grdStepy,i+5,m_yMax-m_grdStepy);
// DrawButton(pDC,rcTemp);
pDC->MoveTo(i,m_grdStepy);
pDC->LineTo(i,m_yMax-m_grdStepy);
CString string;
if(m_bands[k-1]>=1000)
{
string.Format("%uK",m_bands[k-1]/1000);
}
else
{
string.Format("%u",m_bands[k-1]);
}
pDC->TextOut(i-10,0,string);
}
pDC->SelectObject(pOld);
pDC->SetTextColor(RGB(213,255,34));
// pDC->TextOut(0,8,"20DB");
// pDC->TextOut(0,m_yMax/2-8,"0DB");
// pDC->TextOut(0,m_yMax-m_grdStepy-10,"-20DB");
if(m_capture)
pDC->SetTextColor(RGB(0,255,192));
else
pDC->SetTextColor(RGB(0,200,192));
TCHAR band[80];
if(m_oldxPt>=0)
{
_stprintf(band," %dHz ",m_bands[m_oldxPt]);
// pDC->TextOut(2,0,band,_tcslen(band));
_stprintf(band,"当前值%d分贝 ",m_dispValue);
pDC->TextOut(m_xMax/2-20,m_yMax-m_grdStepy-3,band,_tcslen(band));
}
else
{
_stprintf(band,"当前值%d分贝 ",m_dispValue);
pDC->TextOut(m_xMax/2-20,m_yMax-m_grdStepy-3,band,_tcslen(band));
}
pDC->SetBkMode(mode);
}
BOOL CTonalReg::CreatePens()
{
m_axisPen.CreatePen(PS_SOLID,1,m_axisClr);
m_gridPen.CreatePen(PS_DOT,1,m_gridClr);
m_grapgPen.CreatePen(PS_SOLID,2,m_graphColor);
m_ggainPen.CreatePen(PS_SOLID,1,m_graphColor&0x0000FAFF);
LOGFONT lf = {0};
lf.lfWidth = 5;
lf.lfHeight = -9;
strcpy(lf.lfFaceName,"宋体");
lf.lfEscapement =0;
lf.lfOrientation =0;
lf.lfWeight =FW_THIN;
lf.lfCharSet =ANSI_CHARSET;
lf.lfOutPrecision =OUT_CHARACTER_PRECIS;
lf.lfClipPrecision =CLIP_DEFAULT_PRECIS;
lf.lfQuality =DEFAULT_QUALITY;
lf.lfPitchAndFamily =FIXED_PITCH;
CFont cf;
cf.CreateFontIndirect(&lf);
CDC* pdc= GetDC();
m_font = pdc->SelectObject(&cf);
ReleaseDC(pdc);
return TRUE;
}
void CTonalReg::SetBkColor(COLORREF clrBack)
{
m_backColor = clrBack;
HBRUSH hbr = ::CreateSolidBrush(clrBack);
HBRUSH hbrOld = (HBRUSH)::SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)hbr);
::DeleteObject(hbrOld);
if((HGDIOBJ)m_delPen)
m_delPen.DeleteObject();
m_delPen.CreatePen(PS_SOLID,1,clrBack);
}
void CTonalReg::DrawEqLine(CDC* pdc)
{
CPen* pOld;// = (CPen*)pdc->SelectObject(&m_delPen);
pOld = pdc->SelectObject(&m_grapgPen);
if(!m_showButs)
for(int j=0, i = 0; j < (m_grphs-1) ; i+=m_grdStepx,j++)
{
pdc->MoveTo(m_points[j].x,m_points[j].y);
pdc->LineTo(m_points[j+1].x,m_points[j+1].y);
}
if(m_capture || m_showButs)
{
CBrush cb(::GetSysColor(COLOR_BTNFACE));
RECT rt;
for( int j=0, i = 0; j < m_grphs; i+=m_grdStepx,j++)
{
rt.left = m_points[j].x-(m_grdStepx/3)+1;
rt.top = m_points[j].y-(m_grdStepx/3)+1;
rt.right = m_points[j].x+(m_grdStepx/3)-1;
rt.bottom = m_points[j].y+(m_grdStepx/3)-1;
pdc->FillRect(&rt,&cb);
pdc->Draw3dRect(&rt,::GetSysColor(COLOR_BTNHILIGHT),
::GetSysColor(COLOR_BTNSHADOW));
/* pdc->Draw3dRect(m_points[j].x-(m_grdStepx/3)+1,
m_points[j].y-4,
2*m_grdStepx/3-1,
6,
::GetSysColor(COLOR_BTNSHADOW),
::GetSysColor(COLOR_BTNSHADOW));
*/
CRect rcTemp;
rcTemp = rt;
CRect rcTemp1;
CRect rcTemp2;
rcTemp1 = CRect(rcTemp.left+3,rcTemp.top +2,rcTemp.left +6,rcTemp.bottom -2);
rcTemp2 = CRect(rcTemp.right -6,rcTemp.top+2,rcTemp.right -3,rcTemp.bottom -2);
pdc->FillSolidRect(rcTemp1,RGB(0,255,0));
pdc->FillSolidRect(rcTemp2,RGB(0,255,0));
pdc->Draw3dRect(rcTemp1,::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHILIGHT));
pdc->Draw3dRect(rcTemp2,::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHILIGHT));
}
cb.DeleteObject();
}
//CDC
pdc->SelectObject(pOld);
}
void CTonalReg::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
m_capture = TRUE;
m_ptdown = point;
Invalidate();
CWnd::OnLButtonDown(nFlags, point);
}
void CTonalReg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_capture = FALSE;
ReleaseCapture();
if(m_ptdown == point)
{
int realX = (point.x - m_grdStepx/2)/m_grdStepx;
int realY = (point.y - m_grdStepy/2)/m_grdStepy;
m_points[realX].y = point.y;
}
CWnd::OnLButtonUp(nFlags, point);
Invalidate();
for(int i=0;i<m_grphs;i++)
{
m_gains[i] = ((m_points[i].y - m_yMax/2)*(-1)/m_grdStepy) * 5;
}
m_gains[m_grphs] = ((m_tottalGain - m_yMax/2)*(-1)/m_grdStepy) * 5;
GetParent()->GetParent()->PostMessage(WM_VSCROLL1,(WPARAM)m_grphs,
(LPARAM)m_gains);
}
void CTonalReg::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_capture)
{
RECT rt; GetClientRect(&rt);
if(!PtInRect(&rt,point))
{
m_capture = FALSE;
ReleaseCapture();
Invalidate();
CWnd::OnMouseMove(nFlags, point);
return;
}
int realX = (point.x - m_grdStepx/2)/m_grdStepx;
int realY = (point.y - m_grdStepy/2)/m_grdStepy;
if(realX != m_oldxPt || m_oldyPt != realY)
{
if(realX < m_grphs ) // overwrite the array
{
m_points[realX].y = point.y;
m_oldxPt = realX;
m_oldyPt = realY;
// dBeli
SetDispVal(point.y);
Invalidate();
}
}
if(point.x > m_xMax-m_grdStepx+2)
{
m_tottalGain = point.y;
m_oldxPt = -1;
SetDispVal(point.y);
Invalidate();
}
}
CWnd::OnMouseMove(nFlags, point);
}
void CTonalReg::SetDispVal(int val)
{
// less than m_yMax/1 +
// big than m_yMax/2 + // 5 dB/div
m_dispValue = ((val - m_yMax/2)*(-1)/m_grdStepy) * 5;
}
void CTonalReg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
m_showButs=!m_showButs;
Invalidate();
CWnd::OnLButtonDblClk(nFlags, point);
}
BOOL CTonalReg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;
// return CWnd::OnEraseBkgnd(pDC);
}
void CTonalReg::DrawButton(CDC *pDC, CRect rc)
{
CRect rect=rc;
CRect rectHilite;
int m_xHiliteWidth=3+1/2;
int m_yHiliteWidth=3+1/2;
CBrush *pOldBrush1= (CBrush *)pDC->SelectStockObject(LTGRAY_BRUSH);
CPen *pOldPen1 = (CPen *)pDC->SelectStockObject(NULL_PEN);
pDC->Rectangle(rect);
rectHilite = rect;
rectHilite.right = rectHilite.left+m_xHiliteWidth;
if(pOldBrush1 != NULL)
pDC->SelectObject(pOldBrush1);
CBrush *pOldBrush2 = (CBrush *)pDC->SelectStockObject(WHITE_BRUSH);
pDC->Rectangle(rectHilite);
rectHilite = rect;
rectHilite.bottom = rectHilite.top+m_yHiliteWidth;
pDC->Rectangle(rectHilite);
if(pOldBrush2 != NULL)
pDC->SelectObject(pOldBrush2);
CBrush *pOldBrush3 = (CBrush*)pDC->SelectStockObject(GRAY_BRUSH);
rectHilite = rect;
rectHilite.left = rectHilite.right - m_xHiliteWidth;
pDC->Rectangle(rectHilite);
rectHilite = rect;
rectHilite.top = rectHilite.bottom - m_yHiliteWidth;
pDC->Rectangle(rectHilite);
if(pOldPen1 != NULL)
pDC->SelectObject(pOldPen1);
CPen newPen;
CPen *oldPen;
if(newPen.CreatePen(PS_SOLID,1,RGB(0,0,0)))
oldPen=pDC->SelectObject(&newPen);
pDC->MoveTo(rect.left,rect.top);
pDC->LineTo(rect.left,rect.bottom-2);
pDC->LineTo(rect.right-2,rect.bottom-2);
pDC->LineTo(rect.right-2,rect.top);
pDC->LineTo(rect.left,rect.top);
if(oldPen!=NULL)
pDC->SelectObject(oldPen);
if(pOldBrush3!=NULL)
pDC->SelectObject(pOldBrush3);
// CRect rcTemp;
// rcTemp = CRect(rect.left +4,rect.top+4,rect.right-6,rect.bottom -6);
//pDC->Draw3dRect(rcTemp,RGB(0,0,0),RGB(255,255,255));
// pDC->FillSolidRect(rcTemp,RGB(255,255,255));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -