Form有Picture属性,不过要注意大小

解决方案 »

  1.   

    背景色透明,用GIF图片(89a)格式可以做到
      

  2.   

    我是转载的别人的。 
    透明位图在VB中的实现方法及应用 
      在VB中显示位图,通常都是通过各种控件实现的。通过控件显示的位图,或全部或局部,始终是以一个规则的矩形图像出现在屏幕上,无法做到只显示位图中某个不规则的局部图像,而使位图的其它部分具有透明性以露出其下原有的屏幕显示,即所谓“透明位图”,因此透明位图的实现只能另辟蹊径。下面,笔者将向大家介绍一种方法。   原理   其实,Windows中随处可见的图标就是一个透明位图的典型实例。 
      图标是由两个单独的位图组成的。第一个位图是由黑色(颜色位全为0)背景与彩色图标图案组成的,该位图将与当前屏幕显示通过异或(XOR)操作结合起来,故称其为XOR位图。第二个位图是由白色(颜色位全为1)背景与黑色(颜色位全为0)图标图案组成的,该位图将与当前屏幕显示通过与(AND)操作结合起来,故称其为AND位图。图标的显示是通过两个步骤完成的:   当前屏幕显示与AND位图通过AND操作结合起来; 
      当前屏幕显示与XOR位图通过XOR操作结合起来。   大家知道,1与任何数值AND操作的结果将维持原数值,而0与任何数值AND操作的结果则是0,因此在步骤1中,AND位图中白色(1)与屏幕显示经过AND操作后被原色彩屏蔽,而黑色(0)则将原色彩屏蔽。步骤1结束后,屏幕上将留下一个黑色的图标图案。在随后的步骤2中,由于0与任何数值异或的结果都将是原数值,因此,XOR位图与屏幕显示经过异或操作后,位图和屏幕中的黑色部分都将被各自对应的彩色部分屏蔽。步骤2结束后,一个形状不规则的图标图案就出现在屏幕上了。这就是图标显示的原理。 
       制作图像的AND图 
      制作Mask图形的目的是为了把某一个图,去除其背景颜色,而将之画在另一个图上面,比如说有一张方形的BitMap图,上有一枝笔,而其背景是蓝色,如何将这笔画在另一张图上,而且笔原先的蓝背景不会画上去。 
      这个问题便得制造出笔的Mask图,与Invert的Mask图,该Mask图长像是:背景颜色(本例是蓝色)变成白色,其他颜色变成黑色,而Inver的Mask图则反之。   本范例使用GetMaskPic()来取得Mask图的Handle of Memory DC (hMaskDC),用GetInvertMaskPic()来取得Invert Mask图的Handle of Memory DC (hInvertMaskDC),事实上,如果想要二者同时取得实在没有必要分成两个函式来做,只要一个就好了,这里只是一个范例,告诉大家如果想要个别取得时该如何做啦。 我将这原理简单的说明一下: 1.hdcMono = CreateCompatibleDC(0) 
      产生一个Memory DC(与目前萤幕hDC相容),此时该MemoryDC绘的大小只有一个单色pixel 2.hbmpMono = CreateCompatibleBitmap(hdcMono, dx, dy) 
      产生一个大小是dx*dy 的Bitmap,而它的第一个叁数是Memory DC所以是单色的BitMap 3.hbmpOld = SelectObject(hdcMono, hbmpMono) 
      这个动作一做,该hdcMono的绘图区就变成hbmpMono了,也就是说可以想像hdcMono有一个大小是dx*dy(by pixels)的绘图区,在其上的画图会反映到hBmpMono之上 4.picBack.AutoRedraw = True 
      设定picBack.hDc指的是memory中的那份背景图 5.picBack.BackColor = RGB(255, 255, 255) 
      设picBack的背景是白色,如此也会同时也使Window background Color变成白色,这边要提出说明的是,vb的BackColor指的是什麽大家都知道,但Window中的BackGround Color却不太相同,Window的BackGround Color指的是在其上画线条或Print文字时,填充於线条或文字外面的颜色,vb中一律使用Form/pictureBox的BackColor来填充,也就是说当BackColor变了时,同时也是让Window中所谓Background Color变,可以用以下程式一试便知: 
      me.backcolor = RGB(255,255,255) 
      Call SetBkColor(me.hDc, RGB(255,0,0)) 
      me.print "haha" 6.ColorBack = SetBkColor(picBack.hDC, TColor) 
       设定PicBack的Window背景颜色成TColor,同时传回原本的Window BackGround Color存於ColorBack(先前第5步的设定,会使这ColorBack存的是白色的值) 7.BitBlt hdcMono, 0, 0, dx, dy, picBack.hDC, 0, 0, vbSrcCopy 
      将picBack的背景图Copy 到memory DC之中,这边有一个重点,picBack是彩色图,但是目前记忆体Dc存的是单色的图,这麽Copy下去的结果会变成:PicBack的BackGround Color(即Tcolor)会变成1(白色),其他颜色变成0(黑色)。注:如果memory dc的图是彩色,就不会如此,而memory dc的图如何变彩色,那便是Step 3. SelectObject时传入一个彩色的hBitmap,而彩色的hBitmap又如何做到,那便是在Step 2.时CreateCompatibleBitmap的第一个叁数,不传Memory DC,而传一个彩色的hDc,如form1.hdc (if 是彩色萤幕) 8.Call SetBkColor(picBack.hDC, ColorBack) 
      window BackGround再设回原本的ColorBack之颜色(在这里是白色) 9.BitBlt picBack.hDC, 0, 0, dx, dy, hdcMono, 0, 0, vbSrcCopy 
      将Memory dc内的图再画回PicBack的背景图中,相同的,单色图如何放入彩色图呢?原则似乎是(这是我的testing,Win32 help中没有说明): 1(白色)会以目的hdc(在此是picack.hdc)之window Background color来填(此时是ColorBack = 白色) ,而 0(黑色)就以黑色画上去,如此一来,一个图的Mask不就造出来了吗? 10.将Mask的图放到另一个彩色的Memory DC之中 
      hMaskDC = CreateCompatibleDC(0) 
      hBmpMask = CreateCompatibleBitmap(picBack.hDc, dx, dy) 
      Call SelectObject(hMaskDC, hBmpMask) 
      BitBlt hMaskDC, 0, 0, dx, dy, picBack.hDc, 0, 0, vbSrcCopy 11.Call SelectObject(hdcMono, hbmpOld) 
      因已大功告成,所以将hdcMono上的绘图区设回原先的区域(於Step 2中记录),不过我个人没有这个习惯,但没有做有没有影响系统资源,我是半路出家,实在不知。 12.Call DeleteDC(hdcMono) 
      删除记忆体 DC,这没做就不好了。 13.Call DeleteObject(hbmpMono) 
      删除Bitmap,这没做就不好了。 
     
     
      

  3.   

    如果在win2000下,可以使用SetLayeredWindowAttributes函数