/*******************************************************************************
文件名称 : MusicLine.h 头文件 作 者 : 杨治忠 创建时间 : 2011-1-3 9:04:27 文件描述 : 音乐频谱显示控件 版权声明 : QQ号940446982 修改历史 : 杨治忠 2011-1-3 1.00 初始版本 *******************************************************************************/ #pragma once // CMusicLine class CMusicLine : public CWnd
{ DECLARE_DYNAMIC(CMusicLine) //外部接口函数: public: void SetRunTime(int Time);//设置定时器 void SetBackColor(int penR,int penG,int penB,int brushR,int brushG,int brushB);//设置背景色 void SetColor(int penR,int penG,int penB,int brushR,int brushG,int brushB);//设置频谱色 void SetOneWidth(int oneW,int oneK);//设置频谱宽度和频谱间的空隙 void IntPutSum(int sumF[][100],int sumA,int sumB,int T);//传入数据 private:
void DrawPicture(); int time; int pen_rb, pen_gb, pen_bb, brush_rb, brush_gb, brush_bb; int pen_r, pen_g, pen_b, brush_r, brush_g, brush_b; int one_w,one_k; int sum_f[45][100],sum_a,sum_b,t; int l; public: CMusicLine(); virtual ~CMusicLine(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnTimer(UINT_PTR nIDEvent); }; // MusicLine.cpp : 实现文件 /******************************************************************************* 文件名称 : MusicLine.cpp 实现文件 作 者 : 杨治忠 创建时间 : 2011-1-3 9:08:47 文件描述 : 音乐频谱显示控件 版权声明 : QQ号940446982 修改历史 : 杨治忠 2011-1-3 1.00 初始版本 *******************************************************************************/ #include "stdafx.h"
#include "MusicLine.h" // CMusicLine IMPLEMENT_DYNAMIC(CMusicLine, CWnd) CMusicLine::CMusicLine()
{ pen_rb = 0; pen_gb = 0; pen_bb = 0; brush_rb = 0; brush_gb = 0; brush_bb = 0; pen_r = 0; pen_g = 0; pen_b = 0; brush_r = 0; brush_g = 0; brush_b = 0; one_w = 1; one_k = 0; sum_a = 0; sum_b = 0; t = 0; time = 1000; l = 1; }
CMusicLine::~CMusicLine()
{ } BEGIN_MESSAGE_MAP(CMusicLine, CWnd) ON_WM_TIMER() END_MESSAGE_MAP() // CMusicLine 消息处理程序
void CMusicLine::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 DrawPicture(); CWnd::OnTimer(nIDEvent); } /******************************************************************** 函数名称 : DrawPicture() 函数描述 : 画频谱 输入参数 : void 输出参数 : void 备注 : QQ号:940446982 *********************************************************************/ void CMusicLine::DrawPicture() { CDC *pDC = GetDC(); CRect rect; GetClientRect(&rect); //创建位图:
CBitmap bitmap; CBitmap* oldbitmap; CDC Memdc; Memdc.CreateCompatibleDC(pDC); bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); oldbitmap = Memdc.SelectObject(&bitmap); CPen pen,*oldPen; /***************画控件背景***************************/ pen.CreatePen(PS_SOLID,1,RGB(pen_rb,pen_gb,pen_bb)); oldPen = Memdc.SelectObject(&pen); CBrush brush, *oldbrush; brush.CreateSolidBrush(RGB(brush_rb,brush_gb,brush_bb)); oldbrush = Memdc.SelectObject(&brush); Memdc.Rectangle(rect.left,rect.top,rect.Width(),rect.Height()); Memdc.SelectObject(oldPen); pen.DeleteObject(); Memdc.SelectObject(&brush); brush.DeleteObject(); /****************画频谱******************************/ pen.CreatePen(PS_SOLID,1,RGB(pen_r,pen_g,pen_b)); oldPen = Memdc.SelectObject(&pen); brush.CreateSolidBrush(RGB(brush_r,brush_g,brush_b)); oldbrush = Memdc.SelectObject(&brush); int a; a = 1000/time; for (int i=0;i<sum_a;i++) { int b,c; b = rect.Height()-(sum_f[t+1][i]-sum_f[t][i])/a*l; c = rect.Height()-(sum_f[t+1][i]-sum_f[t][i])+l; if (b>rect.Height()) { b = rect.Height(); if (c>b) { c = b-1; } } else if (b<rect.top+3) { b = rect.top+20; } if (c<rect.top) { c = rect.top+2; } Memdc.Rectangle(i*one_w,rect.Height(),i*one_w+one_w-one_k,b); Memdc.MoveTo(i*one_w,c); Memdc.LineTo(i*one_w+one_w-one_k,c); }
t++; if (t==40) { t=0; } l++; if (a==l) { l=1; } Memdc.SelectObject(oldPen); pen.DeleteObject(); Memdc.SelectObject(&brush); brush.DeleteObject(); //显示位图:
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&Memdc,0,0,SRCCOPY); Invalidate(); }
//以下接口函数: /******************************************************************** 函数名称 : SetRunTime(int time) 函数描述 : 开启定时器并设置定时器的速度 输入参数 : int Time 微秒为单位 输出参数 : void 备注 : QQ号:940446982 *********************************************************************/ void CMusicLine::SetRunTime(int Time) { time = Time; SetTimer(0,time,NULL); } /*************************************************************************************** 函数名称 : BackColor(int penR,int penG,int penB,int brushR,int brushG,int brushB) 函数描述 : 设置控件背景颜色 输入参数 : int penR,int penG,int penB,int brushR,int brushG,int brushB 画笔画刷三色值 输出参数 : int pen_rb, pen_gb, pen_bb, brush_rb, brush_gb, brush_bb; 备注 : QQ号:940446982 ****************************************************************************************/ void CMusicLine:: SetBackColor(int penR,int penG,int penB,int brushR,int brushG,int brushB) { pen_rb = penR; pen_gb = penG; pen_bb = penB; brush_rb = brushR; brush_gb = brushG; brush_bb = brushB; } /************************************************************************************** 函数名称 : setColor(int penR,int penG,int penB,int brushR,int brushG,int brushB) 函数描述 : 设置频谱颜色 输入参数 : int penR,int penG,int penB,int brushR,int brushG,int brushB 画笔画刷三色值 输出参数 : int pen_r, pen_g, pen_b, brush_r, brush_g, brush_b; 备注 : QQ号:940446982 ***************************************************************************************/ void CMusicLine::SetColor(int penR,int penG,int penB,int brushR,int brushG,int brushB) { pen_r = penR; pen_g = penG; pen_b = penB; brush_r = brushR; brush_g = brushG; brush_b = brushB; } /******************************************************************** 函数名称 : OneWidth(int oneW) 函数描述 : 设置每个频谱的宽度和两个频谱间的空隙 输入参数 : oneW ,oneK 频谱的宽度,和频谱间隙值 输出参数 : one_w,one_k 备注 : QQ号:940446982 *********************************************************************/ void CMusicLine:: SetOneWidth(int oneW,int oneK) { one_w = oneW; one_k = oneK; } /******************************************************************** 函数名称 : IntPutSum(int *sumF,int sumS,int T) 函数描述 : 输入数组 输入参数 : int *sumF,int sumA,int sumB数组地址和数组个数值int T 输出参数 : int *sum_f,sum_s; 备注 : QQ号:940446982 *********************************************************************/ void CMusicLine::IntPutSum(int sumF[][100],int sumA,int sumB,int T) { sum_a = sumA; sum_b = sumB; t = T; for (int i=0;i<sum_b;i++) for (int j=0;j<sum_a;j++) { sum_f[i][j]=sumF[i][j]; } } |
|