1. 小视频教程 > 知识库 >

gditransparentblt,VB TRANSPARENTBLT具体的用法!!

本文目录索引

1,VB TRANSPARENTBLT具体的用法!!

TransparentBlt  函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。   函数原型:BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);   参数:   hdcDest:指向目标设备环境的句柄。   nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。   nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。   nWidthDest:指定目标矩形的宽度。   nHeightDest:指定目标矩形的高度。   hdcsrc:指向源设备环境的句柄。   nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。   nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。   nWidthSrc:指定源矩形的宽度。   nHeightSrc:指定源矩形的高度。   crTransparent:源位图中的RGB值当作透明颜色。返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。   Windows NT:若想获取更多错误信息,请调用GetLastError函数。   备注:函数TransparentBlt支持4位/像素和8位/像素格式的源位图,使用AlphaBlend可以指定带有透明度的32位/像素格式的位图。如果源和目标矩形的大小不一致,那么将对源位图进行拉伸以与目标矩形匹配,当使用SetStretchBltMode函数时,BLACKONWHITE和WHITEONBLACK两种iStretchMode模式将被转换成TransparentBlt函数的COLORONCOLOR模式。目标设备环境指定了用于目标坐标的变换类型,而源设备环境指定了源坐标使用的变换类型。如果源位图或目标位图的宽度或高度是负数,那么TransparentBlt函数也不对位图进行镜像。   速查:Windows NT:5.0及以上版本;Windows:98及以上版本;Windows CE:Windows CE .NET 4.0 and later;头文件:wingdi.h:库文件:作为一个资源包含在msimg32.dll中。

VB TRANSPARENTBLT具体的用法!!

2,VB6的函数问题

WinHelp属于API函数,包含在文件user32.dll中,自定义的WinHelp函数是没有用的,要使用WinHelp函数,必须在代码窗口的最前面声明,
Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long

3,关于VB GDI

Option ExplicitPrivate Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As LongPrivate Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As LongPrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Command1_Click() Dim dc As Long dc = GetDC(Me.hwnd) MoveToEx dc, 10, 10, 0 LineTo dc, 200, 10End Sub从(10,10)画一条线到(200,10)

4,Public Declare Function GdiTransparentBlt Lib gdi32

语法 1

[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]

语法 2

[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

Declare 语句的语法包含下面部分:

部分 描述
Public 可选的。用于声明对所有模块中的所有其它过程都可以使用的过程。
Private 可选的。用于声明只能在包含该声明的模块中使用的过程。
Sub 可选的(但 Sub 或 Function 二者需选其一)。表示该过程没有返回值。
Function 可选的(但 Sub 或 Function 二者需选其一)。表示该过程会返回一个可用于表达式的值。
name 必需的。任何合法的过程名。注意动态链接库的入口处(entry points)区分大小写。
Lib 必需的。指明包含所声明过程的动态链接库或代码资源。所有声明都需要 Lib 子句。
libname 必需的。包含所声明的过程动态链接库名或代码资源名。
Alias 可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称。当外部过程名与某个关键字重名时,就可以使用这个参数。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,也可以使用 Alias。如果该动态链接库过程中的某个字符不符合动态链接库的命名约定时,也可以使用 Alias。
aliasname 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号 (#),则 aliasname 是动态链接库中该过程的入口处的名称。如果首字符是 (#),则随后的字符必须指定该过程的入口处的顺序号。
arglist 可选的。代表调用该过程时需要传递的参数的变量表。
type 可选的。Function 过程返回值的数据类型;可以是 Byte、布尔、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)或 Variant,用户定义类型,或对象类型。


arglist 参数的语法以及语法各个部分如下:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type]

部分 描述
Optional 可选的。表示参数不是必需的。如果使用该选项,则 arglist 中的后续参数都必需是可选的,而且必须都使用 Optional 关键字声明。如果使用了 ParamArray,则任何参数都不能使用 Optional。
ByVal 可选的。表示该参数按值传递。
ByRef 表示该参数按地址传递。 ByRef 是 Visual Basic 的缺省选项。
ParamArray 可选的。只用于 arglist 的最后一个参数,表示最后的参数是一个 Variant 元素的 Optional 的数组。使用 ParamArray 关键字可以提供任意数目的参数。ParamArray 关键字不能与 ByVal、ByRef或 Optional 一起使用。
varname 必需的。代表传给该过程的参数的变量名;遵循标准的变量命名约定。
( ) 对数组变量是必需的。指明 varname 是一个数组。
type 可选的。传递给该过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、Object、Variant、用户自定义的类型或对象类型。


说明

对Function 过程而言,过程的数据类型决定其返回值的数据类型。可以在 arglist 之后使用 As 子句来指定函数返回值的数据类型。在 arglist 中,可以使用 As 子句来指定任何传给该过程的参数的数据类型。不单可以指定为任何标准数据类型,还可以在 arglist 中指定 As Any 来禁止类型检查,从而允许将任意数据类型传递给该过程。

空圆括号表示该 Sub 或 Function 过程没有参数,且 Visual Basic 应确保不会传递任何参数。在下面的示例中,First 不带任何参数。如果对 First 的调用中使用了参数,就会产生错误:

Declare Sub First Lib "MyLib" ()

如果带参数表,则每次调用该过程时都要检查参数的个数和类型。在下面的示例中,First 有一个 Long 参数:

Declare Sub First Lib "MyLib" (X As Long)

注意 在 Declare 语句的参数表中不能有定长的字符串;只有变长的字符串才能传给过程。定长的字符串可以作为过程参数使用,但在传递前都要被转换为变长的字符串。

注意 当所调用的外部过程需要一个值为 0 的字符串时,就要使用 vbNullString 常数。该常数与零长度字符串 ("") 是不相同的。

5,请教如何利用VB加载GDI+

shell "路径" ;先调用

然后
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private 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 hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Sub Form_Load()
Me.Hide
Me.AutoRedraw = True
BitBlt Me.hDC, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0, 0, vbSrcCopy
sFile$ = "C:\" & Format(Now, "mmddhhmmss") & ".BMP"
SavePicture Me.Image, sFile
MsgBox "当前屏幕图像已经保存到" & sFile, 64
End
End Sub ;保存截图

6,如何在VB中使用API函数

什么是API/怎样在VB中声明和使用API函数
(简单来说,API就是应用程序接口)
一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:

声明的语法是:
Private Declare Function ...
Private Declare Sub.....
这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。

如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
先添加一个模块(如图示),
然后采用如下语法声明:
Public Declare Function....
Public Declare Sub....
Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。

二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:
(1)忽略函数返回值的调用:
SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
注意此时函数的参数是不加括号的。
(2)Call方法调用:
Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
注意这里需要加上括号,但我们不取回函数的返回值。
(3)取得函数返回值的调用:
MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。

三、几个问题的说明:

(1)声明中的Lib 和 Alias 是怎么回事
一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。
Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。

(2)常见的API参数类型的说明
API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。

(3)声明中的ByVal是作什么用的
这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。

(4)怎样得到完整的API函数声明
VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。

7,VB中怎样用api函数实现更换窗体背景

vb很多空间不支持透明显示,甚至很多控件不支持背景图像。 对于支持背景图像的还好解决,你可以使用PictureClip控件,把form的背景赋给PictureClip ,然后读控件的坐标和大小,使用PictureClip 剪切你需要的部分赋给控件的背景。 如果控件不支持背景就麻烦多了。比如TEXT,只好使用很多API函数直接往控件的客户区写。这样还不如不用控件,完全自己写一个text

8,编译错误:常数、固定长度字符串、数组、用户定义类型以及declare语句不允许作为对象模块的public成员?

常数、固定长度字符串、数组、自定义类型与 Declare 语句不能是对象模块中的 Public 成员


并非所有对象模块中的变量都可声明成 Public。然而,按缺省规定,过程是 Public,且 Property 过程在语法结构上可模拟变量。这个错误的起因与解决方法如下所示:

在对象模块中声明了一个 Public 常数。
虽然不能在对象模块中声明 Public 常数,但可以创建一个同名的Property Get 过程。若不能创建同名的 Property Let 或 Property Set 过程,实际上创建了一个只读属性,其用法与常数相同。

在对象模块中声明了一个 Public 类型的固定长度字符串。
可用一组 Property 过程仿真固定长度字符串,并截掉超出长度的字符串数据,或通知用户超出长度。

在对象模块中声明了一个 Public 数组。
虽然过程不能返回数组,但可返回一个包含数组的 Variant。要仿真类模块中的 Public 数组,可用一组Property 过程,它们接受与返回包含数组的 Variant 。

在对象模块中放了一个 Declare 语句。
Declare 语句隐含着公用的意思,可在 Declare 语句之前加上一个 Private 关键字。

9,VB ……数组,不允许作为对象模块的public 成员

常数、固定长度字符串、数组、自定义类型与 Declare 语句不能是对象模块中的 Public 成员


并非所有对象模块中的变量都可声明成 Public。然而,按缺省规定,过程是 Public,且 Property 过程在语法结构上可模拟变量。这个错误的起因与解决方法如下所示:

在对象模块中声明了一个 Public 常数。
虽然不能在对象模块中声明 Public 常数,但可以创建一个同名的Property Get 过程。若不能创建同名的 Property Let 或 Property Set 过程,实际上创建了一个只读属性,其用法与常数相同。

在对象模块中声明了一个 Public 类型的固定长度字符串。
可用一组 Property 过程仿真固定长度字符串,并截掉超出长度的字符串数据,或通知用户超出长度。

在对象模块中声明了一个 Public 数组。
虽然过程不能返回数组,但可返回一个包含数组的 Variant。要仿真类模块中的 Public 数组,可用一组Property 过程,它们接受与返回包含数组的 Variant 。

在对象模块中放了一个 Declare 语句。
Declare 语句隐含着公用的意思,可在 Declare 语句之前加上一个 Private 关键字。