分享

自己写的频谱控件比较简单,初始版

 启蒙彩魂 2011-01-03
/*******************************************************************************
    文件名称 : 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];
 }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约