如何用VB6创建透明图象

创建|透明

透过前面的图象看到背景图象,称前面的图象为透明图象,我们见过很多程序和电视节目中都有使用透明图象,而且大家一定会为图象的透明而称奇。究竟透明图象是如何做出来的呢?下面我们将来探讨这种透明图象的制作方法。 
创建透明图象的五个必须的步骤: 

准备两个位图文件,一个作背景,一个是将要成为透明图象的源位图。 

1、 取得源位图的长、宽数据,依此数据保存一块和源位图一样大小的背景位图,源位图将要在这块背景位图上绘制。通过用白色像素显示位图的透明区域,黑色像素显示位图的不透明区域,创建决定位图透明的单色掩码。 

2、单色掩码像素与所用的背景位图进行二进制“与”(and)位操作,不透明的区域,背景显示黑色。 

3、用第一步所做的单色掩码建立一个反向拷贝,再用这个反向拷贝与所用的源位图进行二进制“与”(and)位操作,源位图透明的区域将显示黑色 

4、用第二步修改过的背景和第三步修改的源位图进行二进制“异或”(Xor)位操作,这时可以透过透明位图看到背景。 

5、把结果位图复制给背景 

应用实例: 

创建包含一个 CommandButton 控件和两个PictureBox控件的 窗体Form1。创建一个模块(在 "工程”菜单中单击“添加模块”)。 

给窗体增加下列控件,设置相关的属性值: 

控件 Name Property Settings
-----------------------------------------------------------------
PictureBox pictSource Picture ="C:\Flower_Vine.bmp"
PictureBox pictDest Picture ="C:\Stones_Blue.bmp"
Command button Command1 Caption ="透明图象"

---- 将下面的代码粘贴到窗体的声明部分中, 

---- Option Explicit ' 这段代码调用过程Transparent()复制源位图到目标(背景)picturebox控件, ' 并将其变成透明,使人们可以看到后面的背景图象。 

Sub command1_Click()
Call Transparent(PictSource.Picture.Handle, PictDest, 
10, 10, QBColor(15))
End Sub

---- 将下面的代码粘贴到模块的声明部分中, 

Option Explicit

---- ' 由于要读取位图的基本信息,所以首先要定义一个BITMAP结构的变量,然后 

---- ' 利用这一变量来接受位图的基本信息。 


Type Bitmap
Type As Long ' 位图类型
Width As Long '宽度
Height As Long '高度
WidthBytes As Long '多少二进制位构成一个存储单位
Planes As Integer '调色板数
BitsPixel As Integer '每一个Pixel所占用的二进制位数
Bits As Long '二进制位数据的起始位置 
End Type

'API 函数说明
Declare Function GetObject Lib "gdi32"
Alias "GetObjectA" (ByVal hObject As _
Long, ByVal nCount As Long, lpObject As Any) As Long 
'经由对象的Handle取得对象数据结构的API函数

Declare Function CreateCompatibleDC Lib "gdi32" 
(ByVal hdc As Long) As Long '
此函数将图象绘制到存储器中可避免直 
'接将图象绘制到屏幕上而造成图象闪烁
Declare Function CreateBitmap Lib "gdi32" 
(ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal nPlanes
As Long, _
ByVal nBitCount As Long, lpBits As Any)
As Long '建立位图对象
Declare Function CreateCompatibleBitmap Lib
"gdi32" (ByVal hdc As Long, _
ByVal nWidth As Long, ByVal nHeight As Long) 
As Long '建立兼容性的位图
Declare Function BitBlt Lib "gdi32" 
(ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal 
nWidth As Long, _
ByVal nHeight As Long, ByVal hsourceDC As Long,
ByVal xSrc As Long, _
ByVal ySrc As Long, ByVal dwRop As Long) As Long '图象转移
Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, 
ByVal crColor As Long) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long)
As Long '删除存储器DC
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, 
ByVal hObject As Long) As Long '为DC选用对象
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As
Long) As Long '删除位图对象

---- 过程Transparent() 复制源位图到背景的任意 X,Y 位置,使这一区域变成透明。Transparent()接受五个参数:一个将要变成透明的源位图,一个目标 picturebox控件 (PictDest), 一个RGB颜色值,另两个是你想放置原位图的目的地坐标(destX 和 destY,以像素为单位)。 

Sub Transparent(ByVal sourceBmp As Long, dest As Control, ByVal _
destX As Integer, ByVal destY As Integer, ByVal TransColor As Long)
Const PIXEL = 3
Dim sourceDC As Long '源位图
Dim destScale As Long
Dim maskDC As Long 'mask位图 (monochrome)
Dim saveDC As Long '源位图的备份
Dim resultDC As Long '源位图与背景的合并
Dim invDC As Long 'Mask位图的反向图
Dim OrigColor As Long '背景色
Dim Success As Long '调用 Windows API的结果

Dim bmp As Bitmap '原位图的数据结构说明 
Dim hResultBmp As Long '源与背景的位图合并
Dim hSaveBmp As Long '原位图的拷贝
Dim hSrcPrevBmp As Long
Dim hDestPrevBmp As Long
Dim hInvBmp As Long '反转掩码位图 (monochrome)
Dim hPrevBmp As Long
Dim hInvPrevBmp As Long
Dim hSavePrevBmp As Long
Dim hMaskBmp As Long
Dim hMaskPrevBmp As Long

destScale = dest.ScaleMode '保存 ScaleMode以便后面恢复
dest.ScaleMode = PIXEL '设置 ScaleMode

sourceDC = CreateCompatibleDC(dest.hdc) '建立存储器DC
saveDC = CreateCompatibleDC(dest.hdc) '建立存储器DC

invDC = CreateCompatibleDC(dest.hdc) '建立存储器DC
maskDC = CreateCompatibleDC(dest.hdc) '建立存储器DC
resultDC = CreateCompatibleDC(dest.hdc) '建立存储器DC
'接受源位图得到它的的宽度和长度 (bmp.Width , bmp.Height)
Success = GetObject(sourceBmp, Len(bmp), bmp)
'创建单色掩码位图
hMaskBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&)
hInvBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&)

hResultBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _
bmp.Height)
hSaveBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _
bmp.Height)
hSrcPrevBmp = SelectObject(sourceDC, sourceBmp)
hSavePrevBmp = SelectObject(saveDC, hSaveBmp)
hMaskPrevBmp = SelectObject(maskDC, hMaskBmp)
hInvPrevBmp = SelectObject(invDC, hInvBmp)
hDestPrevBmp = SelectObject(resultDC, hResultBmp) '选择位图
Success = BitBlt(saveDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _
0, 0, vbSrcCopy) '制作源位图的拷贝以便后面恢复

OrigColor = SetBkColor(sourceDC, TransColor)
Success = BitBlt(maskDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _
0, 0, vbSrcCopy)
TransColor = SetBkColor(sourceDC, OrigColor)

Success = BitBlt(invDC, 0, 0, bmp.Width, bmp.Height, maskDC, _
0, 0, vbNotSrcCopy)
'拷贝背景图并创建最终的透明位图
Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
dest.hdc, destX, destY, vbSrcCopy)

Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
maskDC, 0, 0, vbSrcAnd)
Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, invDC, _
0, 0, vbSrcAnd)

Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
sourceDC, 0, 0, vbSrcInvert)

Success = BitBlt(dest.hdc, destX, destY, bmp.Width, bmp.Height, _
resultDC, 0, 0, vbSrcCopy) '在背景上显示透明位图

Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, saveDC, _
0, 0, vbSrcCopy) '恢复位图
'选择对象以便释放
hPrevBmp = SelectObject(resultDC, hDestPrevBmp)
hPrevBmp = SelectObject(sourceDC, hSrcPrevBmp)
hPrevBmp = SelectObject(saveDC, hSavePrevBmp)
hPrevBmp = SelectObject(invDC, hInvPrevBmp)
hPrevBmp = SelectObject(maskDC, hMaskPrevBmp)
'释放资源
Success = DeleteDC(saveDC)
Success = DeleteDC(invDC)
Success = DeleteDC(resultDC)
Success = DeleteObject(hSaveBmp)
Success = DeleteObject(hMaskBmp)
Success = DeleteObject(hInvBmp)
Success = DeleteDC(sourceDC)
Success = DeleteDC(maskDC)

Success = DeleteObject(hResultBmp)
dest.ScaleMode = destScale '恢复 ScaleMode
End Sub

时间: 2024-08-30 06:33:05

如何用VB6创建透明图象的相关文章

阿里云如何用快照创建磁盘

阿里云如何用快照创建磁盘 有时需要获取快照中的某些数据,但又不希望通过回滚快照的方式来实现,这时使用云磁盘的"从快照创建云磁盘"的功能,创建后的云磁盘可以挂载到同一区域中的任一台服务器上. 目前仅支持从数据盘 的快照创建磁盘. 登录到ECS管理控制台,找到需要获取数据的快照,复制快照ID. 打开云磁盘的购买页面,选择和快照相同的地区,单击用快照创建磁盘 . 在弹出的页面中粘贴刚才复制的快照ID,找到对应的快照,确认无误后点击立即购买 ,确认开通. 创建成功后稍等几分钟,在ECS控制台的

java-如何用myeclipse10创建一个database?

问题描述 如何用myeclipse10创建一个database? ****myeclipse10中 没有 Create Database命令吗?**** 解决方案 是不是因为myeclipse的版本问题啊?为什么我的就没有create database 选项呢? 解决方案二: 怎样用myeclipse 新建数据库啊?

java中如何用反射创建一个对象

问题描述 java中如何用反射创建一个对象 java中如何用反射创建一个对象 如何理解java的反射,反射是一种怎么样的机制呢 解决方案 楼上说的理论很多了,,给你来点实际的,, Class clazz=Class.forName("test.User"); Object obj=clazz.newInstance(); 这是用反射创建对象的方法之一,,也是最常用的 解决方案二: 反射主要做两件事情,一个是运行时创建(dc)(最典型的,插件程序,插件在主程序后被开发出来,主程序要创建插

如何用Gradle创建Docker镜像

本文讲的是如何用Gradle创建Docker镜像,[编者的话]在本篇博客中,作者展示了如何用Gradle task创建Docker镜像.Gradle目前已有一些Docker插件.作者谈论的这个插件是用来为 Mesos Elasticsearch创建scheduler镜像的.这个插件通用性非常强,因为它基本上为Gradle提供了Docker CLI的所有命令. Mesos Elasticsearch中使用的Docker镜像 在Mesos Elasticsearch中我们创建了两个Docker镜像.

pdf-VB6 将Word保存为PDF动作如何用 VB6语言表述

问题描述 VB6 将Word保存为PDF动作如何用 VB6语言表述 已引用 office 15.0 ,exportasfiedformat语局是从WORD VBA中录制的,但是在VB6中无法使用.求助!!!!! Dim appword, wordbook As Object Set appword = CreateObject("word.application") Set wordbook = appword.Documents.Open("C:UsersDesktop新建

如何用ATL创建ActiveX控件

演示截图: 代码简介或代码解析:        如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个基于对话框的程序中.详细代码请下载压缩包. (一) 创建工程 (1) 打开VC6集成开发环境,按新建按钮,选择PROJECT标签

查找窗口-如何用VB6.0在远程机器上有效查找特定窗口,并模拟按键

问题描述 如何用VB6.0在远程机器上有效查找特定窗口,并模拟按键 远程服务器上有一后台程序,批量转换WORD文件,要求不需要人工干预,是调用WORD打印功能实现的,但遇到一个问题,有的WORD文件超页边距,WORD会有个提示,是继续还是取消,让用户选择,这样就把任务暂停了,导致后面转换队列越积越多.后来用VB6.0做了个小工具模拟手工操作.在本机测试通过,但放到远程服务器上时,打开远程桌面时可以,关闭远程桌面时,这个程序就失效了.请教高手有什么解决办法吗?或者最有效的,如何让WORD直接忽略超

用VB6创建MTS组件

创建 '随便贴贴,学过VB的人都应该知道的,不好意思.'**********************************************************************************************' MTS VB6 COM Component Template - by Michael Gonzalez'*************************************************************************

如何用VB6写COM组件(转)

所幸的是,我们可以用COM组件来在最大程度上扩展ASP的功能.你可知道,任何可以用诸如VB,VC和VJ以及其它的一些程序语言所写出来的东西,都可以被应用到你的网站的开发中去,这就是COM(组件对象模型).COM能够用来编写能够被ASP所调用的对象.当在VB等编程环境中完成了组件的编制后,就可以放在ASP页面中被ASP所调用了.在这篇文章中,我们将看到如何使用VB6来编写一个COM对象,如何将其注册在服务器上,并在ASP页面中对其进行调用.但在开始之前,让我先来简单的介绍一写关于COM的小知识.