我有一个formview的程序,在一个crect中先显示了频谱图,然后想在按住左键拖动鼠标的情况下显示鼠标的选定区域,同时又不能覆盖调原来的图像。我想用半透明的线条覆盖选定的区域。然后再下次按左键的时候取消选定区域同时又不用重绘原来的频谱图。该怎样实现。请大侠指教啊。或者有什么更好的实现方法。小弟谢了先

解决方案 »

  1.   

    it is no difficult. you can use CDC::SetROP2 to set drawing mode is R2_NOT mode.R2_NOT: Pixel is the inverse of the screen color.then, you are drawed rectangle by LineTo to drawing four lines.of course. you can dirctness to use CDC::Rectangle, but it is not very good.
      

  2.   

    支持这个办法,但我更喜欢XOR,当然,这个效果不是半透明的。
      

  3.   

    可能是我没有说清楚。luolovegui老兄,你说的那个方法我也试过,之所以要半透明的效果,就是为了不改变原来的频谱图的显示,在选定的时候还可以看到原来的频谱图。在取消的时候也不需要重绘。因为重绘图像的时间有点长。但是我不知道怎么样画半透明的线条。然后在想取消的时候依然显示原来的频谱图。可能有点麻烦,但是肯定是可以实现的。各位大虾,还有更好的方法没有。大家在帮帮忙讨论一下阿,中午在线等待。
      

  4.   

    你用 R2_NOT 方法画线,其实不用重绘的,当然我也不知道你的频谱图是不是老是变化的,如果是老是变化也许不好,如果是不变的,你就用R2_NOT or R2_XOR画,最后你在你以为要重绘的代码处,再画一次线,这样开始的频谱图不是还是恢复过来了吗。也就是说画两次(也是偶数次),就等于没有画。note:
    not ( not a) == a
    (screen xor line) xor line == screen.上面的等式是成立的,我相信你也知道。
      

  5.   

    绘制半透明线条在GDI+会容易一些,只要定义一个带有透明度的Pen就可以了。不过在GDI会麻烦一些,我最近也在想这个问题,只要在GDI中定义一个带透明度的笔,只是不知如何实现,关注中……。如想和我联系:msn:[email protected]
      

  6.   

    很感谢luolovegui老兄,不过还是没有很理想的方法,看看如果还是没有人讨论的话,就给分了,大家顶一顶,主要是解决问题。分数只是一个数字罢了。我刚刚吃饭时也想到了luolovegui兄说的第二个方法了,看看大家还有没有别的方法。
      

  7.   


    例如透明度为alpha(0~1)color source;//源
    color pen;   //画笔
    color dest;  // 结果dest.red = source.red*(1-alpha)+pen.red*alpha;
    dest.blue...(同上)
    dest.green..
      

  8.   

    不是很明白,可以再说的清楚点吗。msdn里面有例子吗?谢谢!