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

📄 tonalreg.cpp

📁 完整的MP3播放器源码
💻 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 + -