Rover's Official Blog

Map/GPS/GIS/WebMap

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  47 随笔 :: 0 文章 :: 437 评论 :: 41 引用
一次做个小小的程序,在一个小小的问题上卡壳了,就是这个关于容器透明的问题。我要达到的目的是这样的:PictureBox上放一张透明的GIF图片,我要PictureBox在GIF图片透明的部分透明,主要是因为我在PictureBox下面还有其他图像,这样如果GIF图片透明的部分不透明就会是一块方块状的容器,显示特别难看。然而查一般情况下做为容器的控件不具有BackStyle这样的属性,而Label,Image等这样的控件都是有的。这里贴出代码和大家分享。VB6代码,Google搜索所得,没仔细看也看不懂,我只知道怎么用。用法如下:
Dim TempCls As clsTransForm
Set TempCls = New clsTransForm
TempCls.ShapeMe RGB(255, 255, 255), True, , PictureBox1
这样PictureBox1容器就透明了,当然PictureBox1的背景颜色最好也设置成和RGB(255, 255, 255)这个参数一样的颜色,具体参数是什么意义请看代码中的具体说明。
下面是这个类模块中的代码:
clsTransForm
posted on 2006-04-05 23:01 Rover.Tang 阅读(1519) 评论(4)  编辑 收藏 网摘 所属分类: GIS

评论

#1楼  2006-07-13 16:00 马维峰      
呵呵,去年也想把容器透明,搞了一下午没有成功,收藏先!

  回复  引用  查看    

#2楼  2008-05-07 14:41 jessezappy [未注册用户]
感谢博主提供这个资料,我也正好遇到相同的问题,找到这里,看了一下那个模块代码,感觉有些函数好像见过,所以,想起了以前做的透明窗体。于是刚刚找到以前做透明窗体的代码,将SetWindowRgn Name.hwnd, CurRgn, True中的Name.hwnd改为PictureBox 的之后,得到了和上面的类模块相同的效果,爽,这样的话,不用那个类模块,用我原来做的透明窗体的代码也可以实现这个效果了。
  回复  引用    

#3楼  2008-05-07 14:44 jessezappy [未注册用户]
上面着急,忘记贴上代码。。补上:
Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const SWP_SHOWWINDOWS = &H40
Private Const SWP_NOZORDER = &H40

Private Sub Form_Load()
Dim retValue As Long
Me.CurrentX = Me.Left / 15: Me.CurrentY = Me.Top / 15
'retValue = SetWindowPos(Me.hWnd, HWND_TOPMOST, Me.CurrentX, Me.CurrentY, 500, 400, SWP_NOZORDER)
Call initwin(Picture1)
'Me.Top = 0: Me.Left = 0
End Sub

Private Sub initwin(Pobj As PictureBox)
Dim WindowRegion As Long
Pobj.ScaleMode = vbPixels '图片框设置为像素
Pobj.AutoRedraw = True
Pobj.AutoSize = True '尺寸自动更改
Pobj.BorderStyle = vbBSNone
WindowRegion = PicProc(Pobj)
SetWindowRgn Pobj.hWnd, WindowRegion, True
End Sub

Public Function PicProc(picSkin As PictureBox) As Long
Dim i As Long, j As Long, StartLineX As Long
Dim Fullr As Long, Liner As Long
Dim TransparentColor As Long
Dim Firstr As Boolean
Dim Linei As Boolean
Dim hDC As Long
Dim PicWidth As Long
Dim PicHeight As Long
hDC = picSkin.hDC
Firstr = True
Linei = False
i = 0
j = 0
PicWidth = picSkin.ScaleWidth
PicHeight = picSkin.ScaleHeight
StartLineX = 0
TransparentColor = GetPixel(hDC, 0, 0)
For j = 0 To PicHeight - 1
For i = 0 To PicWidth - 1
If GetPixel(hDC, i, j) = TransparentColor Or i = PicWidth Then
'透明像素
If Linei Then
Linei = False
Liner = CreateRectRgn(StartLineX, j, i, j + 1)
If Firstr Then
Fullr = Liner
Firstr = False
Else
CombineRgn Fullr, Fullr, Liner, RGN_OR
'刷新
DeleteObject Liner
End If
End If
Else
'非透明像素
If Not Linei Then
Linei = True
StartLineX = i
End If
End If
Next
Next
PicProc = Fullr
End Function

用到的API定义:

Option Explicit
Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Const RGN_OR = 2
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2

API定义中有些是窗体置顶用的,懒得整理一起发出来了。

这个是我的BOLG:http://blog.csdn.net/jessezappy/
希望多多交流,谢谢。
  回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: