TransparentBlt函数(transpose函数)
vc贴图问题
如果要 dc2-dc1,还要保持背景色的话,需要使用 TransparentBlt 来实现。
(具体使用方法看MSDN吧,就是设置一个透明色了)。但是有个局限,只能设置一种透明色。
看你的补充,TransparentBlt 就可以了
你用BitBlt 的光栅控制标记实现透明,有点够呛的。
添加库 Msimg32.lib
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 常数。该常数与零长度字符串 ("") 是不相同的。
我想在vb中用API函数来使图片白色背景透明,用了下面的代码,却不管用。怎么回事?高手帮忙改一下,谢谢
‘1、这些属性 你设好没?
Me.AutoRedraw = True
Me.ScaleMode = 3
Picture1.AutoRedraw = True
Picture1.ScaleMode = 3
’2、然后在 GdiTransparentBlt 函数后面 加上 Me.Refresh
‘3、上面测试通过了 - -
用vc显示位图究竟有多少方法,可以用哪些函数,哪个最简单快捷
就我知道的有:
BitBlt
StretchBlt
TransparentBlt
StretchDIBits
AlphaBlend
还可以调用 IPicture接口的 Render方法
还可以调用 GDI+的方法
还有 ATL中的 CImage
还有其他的一些类,例如CxImg,
还有IE控件
这些方法的用途都不一样,接触多了就明白了。
如果你只是要显示位图(bmp)图的话,BitBlt方法肯定是最简单的了。
用c语言编个程序,我想用 BitBlt 加载掩码图和位图实现,让活动的人物背景透明。
可以试试TransparentBlt 函数。
BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
crTransparent:源位图中的RGB值当作透明颜色。
比如:人物图片底色是黑色,用TransparentBlt函数blt图片,参数crTransparent设为黑色RGB(0,0,0),就能完成透明拷贝。
MFC释放位图的问题!
画图是个很复杂的问题,不是按字面意义理解就可以完成你要的功能的
InvalidateRect是让指定的矩形区域无效化, 而不是“撤销位图” 。 无效化之后系统会自动调用窗口的OnPaint或者OnDraw , “至少”会把你指定的这块地方重画一遍。 如果重画的内容你不满意, 问题出现在OnPaint或者OnDraw函数里, 而不是说你可以有一个“画图函数”来决定显示什么东西,在这个架构下面你显示出来的东西都必须有OnPaint或者OnDraw函数的配合