游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6456|回复: 13

用BitBlt实现图片透明,我为什么不成功?

[复制链接]

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2005-8-26 15:19:00 | 显示全部楼层 |阅读模式
我在开发一个简单的游戏。在这里卡住了。望各位回答我。
以下是程序代码。
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_Paint()
BitBlt Me.hdc, 0, 0,  picture1.Width, picture1.Height, picture1.hdc, 0, 0, MERGEPAINT
BitBlt Me.hdc, 0, 0, picture2.Width, picture2.Height, picture2.hdc, 0, 0, SRCAND
End Sub

附上图片,右边为运行后效果。
而我只想显示那个红色的圈
sf_2005826151917.jpg

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-8-26 15:43:00 | 显示全部楼层

Re:用BitBlt实现图片透明,我为什么不成功?

因为你没刷新, 我帮你改程序

Private Sub Form_Load()
Form1.AutoRedraw = True
End sub

Private Sub Form_Paint()
BitBlt Me.hdc, 0, 0,  picture1.Width, picture1.Height, picture1.hdc, 0, 0, MERGEPAINT
BitBlt Me.hdc, 0, 0, picture2.Width, picture2.Height, picture2.hdc, 0, 0, SRCAND
Me.Refresh
End Sub

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-8-26 15:45:00 | 显示全部楼层

Re:用BitBlt实现图片透明,我为什么不成功?

不知道为什么不成功,理论上是可行的,但要注意的是2点

1、BitBlt的单位是像素,不是VB默认的Twip, picture1.Width都应该是像素单位
2、最好不要在Paint事件中作BitBlt操作,因为这个时候Form本身的位图空间数据是不可预知的

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-8-26 15:57:00 | 显示全部楼层

Re: Re:用BitBlt实现图片透明,我为什么不成功?

游戏之家: Re:用BitBlt实现图片透明,我为什么不成功?

因为你没刷新, 我帮你改程序

Private Sub Form_Load()
Form1.AutoRedraw = True
End sub

Private S...

还是没成功。是否图片的格式问题?我用的是BMP的。或者是图片的颜色错了?期待你的回复。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-8-26 15:58:00 | 显示全部楼层

Re: 用BitBlt实现图片透明,我为什么不成功?

Form1.AutoRedraw = True
。。。。。。
Me.Refresh


大哥,你的这2点都是错误的

我们在自己使用hdc句柄操作设备空间的时候,应该禁止窗体自己绘制自己,所以应该关闭AutoRedraw

第二点Me.Refresh将会触发Paint事件,你在Paint事件自己触发Paint事件带来的是死循环

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-8-26 16:02:00 | 显示全部楼层

Re: 用BitBlt实现图片透明,我为什么不成功?

bigbook2000话别说的那么早!
我所有的游戏都是用这两句来做动画的, 不过不同游戏模块刷新点放不同位置.
Form1.AutoRedraw = True
Me.Refresh

我做好了程序, 自己运行吧!  有源代码:

sf_200582616141.rar

3.19 KB, 下载次数:

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-8-26 16:04:00 | 显示全部楼层

Re: 用BitBlt实现图片透明,我为什么不成功?

我现在用command来实现。
Private Sub Command1_Click()
BitBlt Picture3.hdc, 0, 0, 30, 30, picture1.hdc, 0, 0, MERGEPAINT
BitBlt Picture3.hdc, 0, 0, 30, 30, picture2.hdc, 0, 0, SRCAND
End Sub

图中黑色的圈为picture1,红色的为picture2
sf_200582616333.jpg

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-8-26 16:05:00 | 显示全部楼层

Re:用BitBlt实现图片透明,我为什么不成功?

成功了。感谢ing...
是我的声明没声明好。呵呵。。。谢谢了哦。

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-8-26 16:09:00 | 显示全部楼层

Re:用BitBlt实现图片透明,我为什么不成功?

用鼠标按钮的:

Private Const MERGEPAINT = &HBB0226
Private Const SRCAND = &H8800C6
Private Const SRCCOPY = &HCC0020

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()
Form1.AutoRedraw = True
Picture1.AutoRedraw = True
Picture2.AutoRedraw = True
Picture1.AutoSize = True
Picture2.AutoSize = True
Picture1.Visible = False
Picture2.Visible = False
Timer1.Interval = 20
End Sub


Private Sub Command1_Click()
BitBlt Me.hDC, 10, 0, Picture1.Width, Picture1.Height, Picture1.hDC, 0, 0, MERGEPAINT
BitBlt Me.hDC, 10, 0, Picture2.Width, Picture2.Height, Picture2.hDC, 0, 0, SRCAND
Me.Refresh
End Sub

4

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2005-8-26 16:11:00 | 显示全部楼层

Re:用BitBlt实现图片透明,我为什么不成功?

1、BitBlt的单位是像素,不是VB默认的Twip, picture1.Width都应该是像素单位

再问一下。如何将像素单位转换为Twip?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 15:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表