各位大侠:
    我搞了好久都不知道这个阴影是怎么实现,希望有人告诉我是怎么弄的。不要程序,只要告诉我个思路。谢谢各位

解决方案 »

  1.   

    A、就是蓝点+透明色的图,覆盖上去——这个需要GDI。
    B、纯VB的方式,要两张图。
    1)白底加黑点的图,用 AND 方式合并上去(挖掉了黑点)。
    2)黑底加蓝点的图,用 OR 方式合并上去(填充了蓝点)。
    AND、OR 是 PaintPicture 的参数,你自己试一下。
      

  2.   

    c# 中这个功能很好实现就是把一个picturebox设置成透明度可变的,就能解决,但VB中我试了好久都不能
      

  3.   

    .Net 中的 Graphics 是 GDI+。
    VB6 的 PaintPicture 是 BitBlt,所以要按我#4的B方案调用两次。
    可以参考这个帖子3楼,把原始图换成白底蓝点。
      

  4.   


    Option Explicit
    Dim m_x As Long
    Dim m_y As LongPrivate Sub Form_Load()
        Set Picture1.Picture = LoadPicture("D:\Administrator\desktop\1431419873_479672.bmp")
        Picture1.ScaleMode = 3
    End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    m_x = X
    m_y = Y
    Picture1.Refresh
    End SubPrivate Sub Picture1_Paint()
    Dim xx As Long
    Dim yy As Long
        Picture1.ForeColor = &HCE6E3D
        For yy = m_y To m_y + 300 Step 2
            For xx = m_x To m_x + 300 Step 2
                Picture1.PSet (xx, yy)
            Next
        Next
    End Sub
      

  5.   

    PaintPicture 比 PSet 快多了!
      

  6.   

    建议你做像素数组运算,这样处理速度会比较快(图形处理没速度是不行的),思路可以这样:
    通过三个GDI设备来处理图像,然后回显到指定输出设备(如屏幕或窗口中),步骤如下:1、先加载原始图片到一个指定的GDI设备,具体可用GDI+函数来加载图片到设备(这样兼容的图像格式多点)。
    2、创建一个与你想设置“阴影”的区域大小一样的GDI设备作为缓冲设备。
    3、再创建一个最终合成用的与原图大小一致的GDI设备。
    4、可以用BitBlt函数将原始图片设备的图,按取图的位置和大小把“阴影”部分图片复制到GDI缓冲设备。
    5、可以用GetBitmapBits函数将GDI缓冲设备的图像数据取出到字节数组中。
    6、按照GDI图像数据格式修改字节数组中相关像素的数据内容(这和你创建的位图格式与数据位有关,注意,位图数据的行字节要保持2的倍数,这是GDI的特性,而位图文件格式则是保持4的倍数,这就是位图文件的数据格式与GDI的区别,不清楚可以看看BMP文件格式,留意BMP文件格式数据部分,把4的倍数改成2的倍数就是GDI的位图概念了),实现你所谓的设置“阴影”的处理过程。具体可以用类似8楼的循环方法来循环设置数据内容,不过要把Picture1.PSet换成设置数组数据而已。
    7、再用SetBitmapBits函数将计算好的字节数组数据放回到GDI缓冲设备。
    8、在最终合成设备上先用BitBlt把原图复制进去,再用BitBlt把GDI设备的图也根据“阴影”坐标复制上去。
    9、可以把合成设备的图用BitBlt复制到PictureBox或Form等能显示到屏幕的设备来观察结果。这个处理过程理论上是VB内做这种数据处理能做到最快的做法了,当然如果你通过调用外部API来实现相同的运算,并且用汇编或C/C++来弄,效率可能会更快,如果能用GPU、显存什么的硬件来搞那就更没话说了,但是,如果运算过程在vb内部,这样是最快的了。不要看主要过程是在第6步中,最终实现的方法可能与上面调用Picture1.PSet (xx, yy)差不多,但是,VB在单纯的用循环处理内存数据上效率与调用对象方法或什么API函数还是有本质区别的,由于这个设置数组数据的执行过程相当简单,与调用某个对象方法或API函数从涉及的资源调用与CPU指令量不是一个资源级别,所以处理速度会有根本质的差异。比如设置一个内存数据只需要3条汇编指令可完成,涉及到的资源只是直接寻址并设置内容的两三个交换寄存器。但换做是调用别的什么方法或API就有可能把简单的3条汇编指令变成几百或几千条汇编指令来执行相同的设置一个像素内容的操作,更有胜的可能会变成用几万条汇编指令才能完成相同的目的。虽然在VB代码里看上去调用一个方法或API很简洁,并不显得代码量大,但那个方法内部编写可能调用了N个API函数来实现的,而每个API函数又是调用别的API或循环N次才返回的,这样下去,每调用一次这种方法或API都有可能成千上万倍的去执行一些多余的过程。因为那些函数为了兼容性、稳定性、数据类型什么的会做很多工作,不是单单为了设置你一个像素内容而存在的,所以真正在CPU里跑的程序并不会像VB代码是看上去那么简单简洁。而直接设置内存数据就简单很多,即使存在VB内部可能不会像C/C++语言或汇编那样更加明确的处理内存数据,但是可想而知即使被VB转换CPU里的代码量也不会增加多少。这样的过程节约了无用代码的执行,也减少了内存交换的过程,程序速度自然就快了。
      

  7.   


    pset确实慢,不过这种阴影效果就这么简单,这只是提供个方法而已