Winforms Windows窗体中的透明背景?

Winforms Windows窗体中的透明背景?,winforms,vb6,transparency,rgb,Winforms,Vb6,Transparency,Rgb,我想以透明的红色为背景的visual basic 6程序 我使用此代码使窗体的背景透明: Option Explicit Private Const GWL_EXSTYLE As Long = (-20) Private Const LWA_COLORKEY As Long = &H1 Private Const LWA_Defaut As Long = &H2 Private Const WS_EX_LAYERED As Long = &H80000 Private

我想以透明的红色为背景的visual basic 6程序

我使用此代码使窗体的背景透明:

Option Explicit

Private Const GWL_EXSTYLE As Long = (-20)
Private Const LWA_COLORKEY As Long = &H1
Private Const LWA_Defaut As Long = &H2
Private Const WS_EX_LAYERED As Long = &H80000

Private Declare Function GetWindowLong Lib "user32" Alias _
    "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias _
    "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long

Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hWnd As Long, ByVal crKey As Long, ByVal bDefaut As Byte, _
    ByVal dwFlags As Long) As Long

Private Sub Form_Load()
  Me.BackColor = RGB(254,0,0)
  Transparency Me.hWnd, Me.BackColor, 255
End Sub

Private Sub Transparency(ByVal hWnd As Long, ByVal lngTransparentColor As Long, _
ByVal bytTransparency As Byte)

    Dim lngwindowstyle As Long

    lngwindowstyle = GetWindowLong(hWnd, GWL_EXSTYLE)
    If (lngwindowstyle And WS_EX_LAYERED) <> WS_EX_LAYERED Then
        SetWindowLong hWnd, GWL_EXSTYLE, lngwindowstyle Or WS_EX_LAYERED
    End If

    SetLayeredWindowAttributes hWnd, lngTransparentColor, bytTransparency, _
    LWA_COLORKEY Or LWA_Defaut
End Sub
选项显式
专用常量GWL_EXSTYLE长度=(-20)
Private Const LWA_COLORKEY As Long=&H1
私有常量LWA_Defaut的长度=&H2
私有常量WS_EX_分层长度=&H80000
私有声明函数GetWindowLong Lib“user32”别名_
“GetWindowLongA”(ByVal hWnd尽可能长,ByVal nIndex尽可能长)尽可能长
私有声明函数SetWindowLong Lib“user32”别名_
“SetWindowLongA”(ByVal hWnd为长,ByVal nIndex为长_
ByVal dwNewLong As Long)As Long
私有声明函数SetLayeredWindowAttributes库“user32”_
(ByVal hWnd为长,ByVal crKey为长,ByVal bDefaut为字节_
ByVal dwFlags As Long)As Long
专用子表单_加载()
Me.BackColor=RGB(254,0,0)
透明度Me.hWnd,Me.BackColor,255
端接头
专用子透明度(ByVal hWnd尽可能长,ByVal lngTransparentColor尽可能长_
ByVal BYTT透明性(以字节为单位)
暗淡的lngwindowstyle与长
lngwindowstyle=GetWindowLong(hWnd,GWL_EXSTYLE)
如果(lngwindowstyle和WS_EX_LAYERED)WS_EX_LAYERED那么
SetWindowLong hWnd、GWL_EXSTYLE、lngwindowstyle或WS_EX_分层
如果结束
设置LayeredWindowAttributes hWnd、lngTransparentColor、BYTTTransparency、_
LWA_彩色键或LWA_彩色键
端接头
但如图所示,红色噪音仍然存在:

如何消除这种噪音


我用
.png
扩展名保存了图片,并使用
AlphaImageControl.ocx
来显示它

红色噪音已消除,但表单下仍保留一条红线:


正如评论者所说,你的“红色”并不总是相同的红色。表格下方的线条保留下来,如果你仔细观察,你会发现:红线正在从红色变为黑色。因此,即使你的左像素是254,0,0,下一个也不是。我建议使用空白/真正透明的背景,png为您提供了:)

您的代码很好。您的表单上是否有分配给表单的
picture
属性的图片或其他导致“额外”红色的
Image
PictureBox
图片?我在表单的
picture
属性中有一张图片,没有
Image
没有
PictureBox
透明颜色与RGB值完全匹配。图片中的某些像素并非完全是RGB 254、0、0,而是另一种红色。任何要透明的像素都必须是该颜色。在图像编辑器中编辑图片。您不能将此效果用于抗锯齿。如果您的图片有RGB(254,0,0)以外的任何其他红色值,它将出现。我希望它仍然是相同的问题。我认为这些像素并不完全是RGB 254、0、0。另外,颜色一致性的问题就是为什么许多魔术橡皮擦或自动选择工具在常见的图像编辑应用程序中带有“截止”变量的原因。