vb.net picturebox 透明问题

andson870420 2011-10-10 01:02:23
vb2008中picturebox的backcolor设置为transparent不能显示透明的背景,所以编了一下的的程序
我想实现程序运行时,picturebox的背景为透明。
程序如下,但是背景没有变成透明,请给为朋友指点^^
Public Class Form1

Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) 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
Declare Function CombineRgn Lib "gdi32" Alias "CreateRectRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long
Public Declare Function GetDC Lib "user32 " (ByVal hwnd As Integer) As Integer
Declare Function GetWindow Lib "user32 " (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Public Const RGN_OR = 2




Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim HWD As Long
Dim HDC As Long
HWD = GetWindow(Me.Handle, 2)
HDC = GetDC(PictureBox1.Handle)
SetWindowRgn(HWD, PicProc(HDC, &HFFFFFF&, 858, 324), True)


End Sub



Public Function PicProc(ByVal nClient As Long, ByVal TransparentColor As Long, ByVal lngClientW As Long, ByVal lngClientH As Long) As Long
Dim lngX&, lngY&, lngStarX&
Dim lngRgnResultHdc&, lngRgnHdc&
Dim blnStarCreate As Boolean

blnStarCreate = True

For lngY = 0 To lngClientH - 1
For lngX = 1 To lngClientW - 1

lngStarX = lngX

If GetPixel(nClient, lngX, lngY) <> TransparentColor Then


lngRgnHdc = CreateRectRgn(lngStarX, lngY, lngX + 1, lngY + 1)

If blnStarCreate Then
lngRgnResultHdc = lngRgnHdc : blnStarCreate = False
Else
CombineRgn(lngRgnResultHdc, lngRgnResultHdc, lngRgnHdc, RGN_OR)
DeleteObject(lngRgnHdc)
End If
End If
Next

Next

PicProc = lngRgnResultHdc

End Function

End Class
...全文
448 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
toudx 2011-10-10
  • 打赏
  • 举报
回复
picturebox的backgroundcolor设置为transparent,并且image引用*.png格式的透明图片,可以实现相对于窗体背景的透明效果,但SizeMode必须设为Normal,否则会被OnPaint事件重绘背景而导致透明失效,即使用API也不能解决这个问题,可能通过重做picturebox的OnPaint事件通过截取父控件前景做自身的背景来实现。
wl58796351 2011-10-10
  • 打赏
  • 举报
回复
Imports System.ComponentModel
Imports System.IO
Imports System.Windows.Forms

’引用组件,就很简单实现了

Public Sub New()

' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
‘ Me.Image = My.Resources._0_0_0
Me.BackColor = Color.Transparent
' 在 InitializeComponent() 调用之后添加任何初始化。

End Sub


详细情况见
http://blog.csdn.net/wl58796351/article/details/6735351
chillystar 2011-10-10
  • 打赏
  • 举报
回复
首先,transparent不是透明,至少在winform下不是。准确而言仅仅是继承被其遮盖的父级背景。简单点就是你在form中设置一个背景图,然后将picturebox.backgroundcolor设置为transparent,那么picturebox并非真正透明了,只是将被其遮盖的form区域的图“拷贝”到picturebox作为背景而已。

其次,假设你的代码正确,但你SetWindowRgn(HWD, PicProc(HDC, &HFFFFFF&, 858, 324), True)
这句放在form_load中,按照顺序,form_load执行完后,还要进行picturebox的初始化,在picturebox初始化或发生移动、大小变更等事件时还会触发Paint的重绘,因此即使你在form_load时正确地将picturebox初始化了,在进一步的过程中picturebox还会被Paint事件重绘。

解决办法:尝试重写picturebox的Paint事件。
Q420731106 2011-10-10
  • 打赏
  • 举报
回复
picturebox1.BackColor=Color.透明???透明的多少忘了
额~~~button1 能点吗 ...能点的话 把层次放上面- -
PS:新手错误勿喷~~jpg的图片VB好像一般不能设置透明
andson870420 2011-10-10
  • 打赏
  • 举报
回复
比如我在picturebox下面放一个button1,当picturebox背景为透明时能看到下面的button1

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧