游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5360|回复: 11

在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

[复制链接]

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2007-9-17 19:31:00 | 显示全部楼层 |阅读模式
在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,之前在网上找到很多实现透明的方法,里面用了很多API,看不懂,我只想得到生成屏蔽图的代码就可以了,请高手指点~

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2007-9-17 19:37:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

高手指点

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2007-9-22 07:28:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

大家请帮帮忙啊,急死了~

29

主题

475

帖子

481

积分

中级会员

Rank: 3Rank: 3

积分
481
发表于 2007-9-22 20:32:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

才疏学浅,没听过什么是屏蔽图,貌似LZ想要用透明背景的图片吧,用ColorKey就好了~~

3

主题

322

帖子

334

积分

中级会员

Rank: 3Rank: 3

积分
334
发表于 2007-9-23 00:21:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

MASK.遮盖图....用额外的MASK图.来判断需要透明的部分.
不过还是不明白楼主,究竟是MASK实现透明? 还是要透明部分生成MASK图?.

3

主题

322

帖子

334

积分

中级会员

Rank: 3Rank: 3

积分
334
发表于 2007-9-23 16:38:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

忘记了..还有.做MASK.应该分2种吧..还要看程序需要,究竟是单色图,还是灰度图.....
如果是单色遮蔽就类似用像楼上说的.COLOR KEY...就完事了.
如果是程序是需要按程度做透明的,就得使用类似ALPHA了...

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2007-9-24 21:58:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

我是想做那种黑白的实现完全透明的MASK图,用程序来生成,请指教~

2

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2007-9-25 12:10:00 | 显示全部楼层

Re: 在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)

以下代码可以从一个内存DC中生成黑白屏蔽图,注意:也是放在内存DC中的。可以用bitblt显示到当前窗口.

Public Function CreateMaskFromDC(ByVal hDC As Long, ByVal width As Long, ByVal height As Long, ByVal MaskColor As Long) As Long
    Dim ForeDc, ForeBitmap As Long
    Dim MaskDC, Maskbitmap As Long
    Dim ff As Long
   
    ForeDc = CreateDCandBmpBySize(width, height)  
    BitBlt ForeDc, 0, 0, width, height, hDC, 0, 0, SRCCOPY
    ForeBitmap = hBitmap
    MaskDC = CreateCompatibleDC(0)   
    Maskbitmap = CreateCompatibleBitmap(MaskDC, width, height)
    SelectObject MaskDC, Maskbitmap
   
    ff = SetBkColor(ForeDc, MaskColor)
    BitBlt MaskDC, 0, 0, width, height, ForeDc, 0, 0, SRCCOPY
    CreateMaskFromDC = MaskDC
   
    DeleteDC ForeDc: DelObject ForeBitmap
End Function


Public Function CreateDCandBmpBySize(ByVal width As Long, ByVal height As Long) As Long  
    hDC = CreateCompatibleDC(0)
    hBitmap = CreateCompatibleBitmap(Screen.ActiveForm.hDC, width, height)
    SelectObject hDC, hBitmap
    CreateDCandBmpBySize = hDC
    hWidth = width: hHeight = height
End Function

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2007-9-26 06:32:00 | 显示全部楼层

Re:在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)图,

感谢BlueGlobal,我做了一个小程序测试了您的函数,我是这样做的,在窗体上放置两个PictureBox,给Picture1的Picture属性里导入一个黑色背景的图片,然后编写代码如下:
Private Sub Picture2_Click()
Dim r As Long
r = CreateMaskFromDC(Picture1.hdc, Picture1.ScaleWidth, Picture1.ScaleHeight, vbBlack)
BitBlt Picture2.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, _
       r, 0, 0, vbSrcCopy
End Sub
但是在Picture2显示出来的是全黑的,请问我的代码哪里写错了?另外,您的函数CreateMaskFromDC里最后一句DelObject是指的DeleteObject吗?再次感谢~

2

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2007-9-26 15:43:00 | 显示全部楼层

Re: 在做一个45度角地图编辑器,需要用程序生成屏蔽(MASK)

该函数是从我的一个类模块中复制出来的,有些地方要修改一下。以下是改后的代码:

Dim hBitmap As Long

Public Function CreateMaskFromDC(ByVal hDC As Long, ByVal width As Long, ByVal height As Long, ByVal MaskColor As Long) As Long
    Dim ForeDc, ForeBitmap As Long
    Dim MaskDC, Maskbitmap As Long
    Dim ff As Long
   
    ForeDc = CreateDCandBmpBySize(width, height)
    BitBlt ForeDc, 0, 0, width, height, hDC, 0, 0, vbSrcCopy
    ForeBitmap = hBitmap
    MaskDC = CreateCompatibleDC(0)
    Maskbitmap = CreateCompatibleBitmap(MaskDC, width, height)
    SelectObject MaskDC, Maskbitmap
    ff = SetBkColor(ForeDc, MaskColor)
    BitBlt MaskDC, 0, 0, width, height, ForeDc, 0, 0, vbSrcCopy
    CreateMaskFromDC = MaskDC

    DeleteDC ForeDc: DeleteObject ForeBitmap
End Function

Public Function CreateDCandBmpBySize(ByVal width As Long, ByVal height As Long) As Long
    DC = CreateCompatibleDC(0)
    hBitmap = CreateCompatibleBitmap(Screen.ActiveForm.hDC, width, height)
    SelectObject DC, hBitmap
    CreateDCandBmpBySize = DC
End Function

Private Sub Command1_Click()
Dim r As Long
r = CreateMaskFromDC(Picture1.hDC, Picture1.width, Picture1.height, vbBlue)
BitBlt Picture2.hDC, 0, 0, Picture1.width, Picture1.height, _
       r, 0, 0, vbSrcCopy
End Sub
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-21 05:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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