Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367933
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:39:06

显示波形的控件

作者:




一.前言:

  随着科技的发展,数字信号处理频繁的应用于各个领域,通过对数字信号进行傅里叶变换,可以得到它的幅频特性,通过滤波,可以得到我们想要得到的有用信号。

二.说明:

  本文将简单的介绍一下信号波形的显示问题。大家一定会想到第30期有一个“曲线显示控件”这篇文章,没错,我当时看到这篇文章也觉得程序做得非常好,可惜控件没有源码,只提供了lib文件,于是我通过查找资料,也做了一个类似的程序。好了,还是看看我们的程序吧。

三.显示波形的界面:


 

  1. 单击下面的三个方框,可以显示或隐藏上面坐标系中相应的波形。
  2. 当鼠标移动到坐标系中时,鼠标旁边的方框中可以动态的显示坐标的位置。
  3. 程序还可以将波形图保存为位图格式的文件,将鼠标移出坐标系并双击,即弹出保存文件的对话框。
  4. 至于改变曲线的颜色、宽度等等都比较简单,程序中就没有实现。

四、结束语:

  1. 当鼠标在坐标系中移动时,由于不断的要刷新坐标系中连接鼠标坐标的两条直线,为了避免闪烁,采用了双缓存技术(具体看源码)。
  2. 存在的问题:随着鼠标的移动,显示坐标的方框在移动的过程中不流畅,这是由于程序要不断的更新方框,相当于对图像不停得进行操作,对图像的操作是很费cpu的,所以不流畅。另外我认为,一般不提倡这种做法,除非在很需要的时候。比如在这个程序中,我们可以在控件下面找一个地方专门用来显示坐标,而不必随鼠标移动方框。(我是为了模仿第30期的那个程序才这样做的)

--------------------next---------------------

写得很好,就是不知道怎样做成一个ActiveX控件。对于出现的问题有个建议,可以将被对话框截获的鼠标消息,发送给主框架,由主框架分发给当前视,再发给静态控件即可。我做的工程就是用这种方法解决的,很有效。 ( luhouxiang 发表于 2005-7-23 20:04:00)
 
非常感谢!正在设计一个类似的功能模块.作品出来后与大家分享.....在这里向大家学习了不少东西....希望自己也能分享自己的成果与各位讨论. ( Teleinfor 发表于 2004-9-15 16:00:00)
 
int SaveBitmapToFile(...)内没有处理32bit颜色,保存时候会错误
需要增加32bit颜色处理
( gm316 发表于 2004-8-27 14:04:00)
 
存在的问题只需要加两个语句就可以解决,下面是修改后的函数:
void MyStatic::OnMouseMove(UINT nFlags, CPoint point) 
{
m_point = point;
Invalidate();

if(clientRect.PtInRect(point))
{
dlg->x = (float)(point.x-clientRect.left)/(clientRect.Width()/12);
dlg->y = 7-(float)(point.y-clientRect.top)/(clientRect.Height()/7);

}

if (clientRect.PtInRect(point))
{
::SetCapture(m_hWnd);

dlg->ShowWindow(SW_SHOW);
CRect rect(point.x,point.y,point.x+transSize.cx,point.y+transSize.cy);
ClientToScreen(rect);
//dlg->MoveWindow(rect,false);
::MoveWindow(dlg->m_hWnd,rect.left,rect.top,transSize.cx,transSize.cy,false);
dlg->Invalidate();
}
else
{
::ReleaseCapture();

dlg->ShowWindow(SW_HIDE);
}
CStatic::OnMouseMove(nFlags, point);
}
( gm316 发表于 2004-8-25 16:41:00)
 
呵呵,谢谢user_235对我的批评,在这里我没有太认真,没有仔细想想问题的原因,只是想当然的把原因归结为原来说的,谢谢user_235 ( wzj19811113 发表于 2004-8-3 21:15:00)
 
作者说:"存在的问题:随着鼠标的移动,显示坐标的方框在移动的过程中不流畅,这是由于程序要不断的更新方框,相当于对图像不停得进行操作,对图像的操作是很费cpu的,所以不流畅。另外我认为,一般不提倡这种做法,除非在很需要的时候。比如在这个程序中,我们可以在控件下面找一个地方专门用来显示坐标,而不必随鼠标移动方框。(我是为了模仿第30期的那个程序才这样做的)"
    我不以为然,运行该程序就会发现,当鼠标向左向上移动时均不会出现窗口停止不动的现象,只有当向下向右移动才发生这种情况,为什么?这不是因为所谓的显示一个窗口很耗CPU(要知道这是由显卡负责的,现在的显卡如我的RADEON9600PRO的多边形生成率为每秒百万级,一个窗口根本不在话下),真正的原因是当鼠标向下或向右移动时指针移到了显示数据的窗口上(注意作者显示数据用了窗口而不是一个RECT),真是这个窗口的存在使原本由VIEW窗口响应的M_MOUSEMOVE消息被它挡掉了,所以只有当指正移出最上层的数据窗口时,数据窗口才移动(因为指针又到了VIEW窗口内).
    综上,解决该问题的根本方法是全部重新设计代码,用矩形而不是窗口来显示数据).
( user_235 发表于 2004-8-2 22:39:00)
 
曲线代码lib已经更新(Debug & Release)

更多信息访问 ( sonystone 发表于 2004-7-29 13:03:00)
 
移动鼠标时显示有时候会出现短时间的停止不动! ( xander 发表于 2004-7-29 10:19:00)
 
好人!谢谢! ( zxh65 发表于 2004-7-28 8:41:00)
 
.......................................................

--------------------next---------------------

阅读(108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~