[转]实现透明Panel控件

原文:实现透明Panel及控件置顶的方法

我只是简单转换为VB以及对一些参数的微软出处作了补充(搜索了一下,发现这篇是最简洁、明了、可行的),有了这个重写的Panel,以后在进行自动操作中为了防止用户点击鼠标时,再也不用麻烦了。

------------------------------------------------------------------------------------------------------

想放置一个透明Panel在某控件上端,实现效果是可透过此Panel看见下面控件,但鼠标点击却无任何反应。

1、新建置自定义Panel类

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Drawing

Namespace NavDataManager

    Public Class MyTransparentPanel
        Inherits Panel
        Public Sub New()
            Me.SetStyle(ControlStyles.SupportsTransparentBackColor Xor ControlStyles.Opaque, True)
            Me.BackColor = Color.Transparent
        End Sub
        Private Const WS_EX_TRANSPARENT = &H20
        Protected Overrides ReadOnly Property CreateParams() As CreateParams
            Get
                Dim cp As CreateParams = MyBase.CreateParams
                cp.ExStyle = WS_EX_TRANSPARENT
                Return cp
            End Get
        End Property
    End Class
End Namespace
'将控件添加到你需要放置的某控件上,并通过BringToFront与SendToBack来控制是否响应鼠标。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click   '测试按钮
     MyTransparentPanel1.BringToFront()    '遮挡区域不响应鼠标
     Button2.BringToFront()                '设置遮挡区域内的Button2可以响应鼠标
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click   '测试按钮
     MyTransparentPanel1.SendToBack()      '遮挡区域可以响应鼠标
End Sub

扩展的窗口样式

常量/值说明

WS_EX_ACCEPTFILES

0x00000010L

窗口接受拖放文件。

WS_EX_APPWINDOW

0x00040000L

在顶级窗口可见时强行将其放在任务栏上。

WS_EX_CLIENTEDGE

0x00000200L

窗口有一个带有凹陷边缘的边框。

WS_EX_COMPOSITED

0x02000000L

使用双缓冲按从下到上绘制顺序绘制窗口的所有后代。 从下到上绘制顺序允许后代窗口具有半透明 (alpha) 和透明度 (颜色键) 效果,但前提是后代窗口还设置了WS_EX_TRANSPARENT位。 通过双重缓冲,可以在不闪烁的情况下绘制窗口及其后代。 如果窗口的 类样式 为 CS_OWNDC 或 CS_CLASSDC,则无法使用此选项。
Windows 2000: 不支持此样式。

WS_EX_CONTEXTHELP

0x00000400L

窗口的标题栏包含问号。 当用户单击该问号时,光标将变成带指针的问号。 如果用户随后单击子窗口,则子窗口将收到 WM_HELP 消息。 子窗口应将消息传递到父窗口过程,父窗口过程应使用 HELP_WM_HELP 命令调用 WinHelp 函数。 帮助应用程序显示一个弹出窗口,该窗口通常包含子窗口的帮助。
WS_EX_CONTEXTHELP 不能与 WS_MAXIMIZEBOX 或 WS_MINIMIZEBOX 样式一起使用。

WS_EX_CONTROLPARENT

0x00010000L

窗口本身包含应参与对话框导航的子窗口。 如果指定了此样式,则执行导航操作(例如处理 TAB 键、箭头键或键盘助记键)时,对话管理器将递归为此窗口的子级。

WS_EX_DLGMODALFRAME

0x00000001L

窗口有一个双边框:(可选)可以通过在 dwStyle 参数中指定WS_CAPTION样式来创建带有标题栏的窗口。

WS_EX_LAYERED

0x00080000

该窗口是一个分层窗口。 如果窗口的 类样式 为 CS_OWNDC 或 CS_CLASSDC,则不能使用此样式。
Windows 8:顶级窗口和子窗口支持WS_EX_LAYERED样式。 以前的 Windows 版本仅支持 顶级窗口WS_EX_LAYERED 。

WS_EX_LAYOUTRTL

0x00400000L

如果 shell 语言是希伯来语、阿拉伯语或其他支持阅读顺序对齐的语言,则窗口的水平原点位于右边缘。 增加水平值后向左。

WS_EX_LEFT

0x00000000L

窗口具有泛型左对齐属性。 这是默认设置。

WS_EX_LEFTSCROLLBAR

0x00004000L

如果 shell 语言是希伯来语、阿拉伯语或其他支持阅读顺序对齐的语言,则垂直滚动条 ((如果存在) )位于工作区左侧。 对于其他语言,将忽略该样式。

WS_EX_LTRREADING

0x00000000L

窗口文本使用从左到右的阅读顺序属性显示。 这是默认值。

WS_EX_MDICHILD

0x00000040L

该窗口是 MDI 子窗口。

WS_EX_NOACTIVATE

0x08000000L

用户单击时,使用此样式创建的顶级窗口不会成为前台窗口。 当用户最小化或关闭前台窗口时,系统不会将此窗口带到前台。
不应通过编程访问或通过键盘导航(如讲述人)激活窗口。
若要激活窗口,请使用 SetActiveWindow 或 SetForegroundWindow 函数。
默认情况下,窗口不会显示在任务栏上。 若要强制窗口显示在任务栏上,请使用 WS_EX_APPWINDOW 样式。

WS_EX_NOINHERITLAYOUT

0x00100000L

窗口不将其窗口布局传递给其子窗口。

WS_EX_NOPARENTNOTIFY

0x00000004L

使用此样式创建的子窗口在创建或销毁时不会将 WM_PARENTNOTIFY 消息发送到其父窗口。

WS_EX_NOREDIRECTIONBITMAP

0x00200000L

窗口不会呈现到重定向图面。 这适用于没有可见内容或使用表面以外的机制提供其视觉对象的窗口。

WS_EX_OVERLAPPEDWINDOW

(WS_EX_WINDOWEDGE |WS_EX_CLIENTEDGE)

窗口是重叠的窗口。

WS_EX_PALETTEWINDOW

(WS_EX_WINDOWEDGE |WS_EX_TOOLWINDOW |WS_EX_TOPMOST)

窗口是调色板窗口,它是一个无模式对话框,显示命令数组。

WS_EX_RIGHT

0x00001000L

窗口具有通用的“右对齐”属性。 这依赖于窗口类。 仅当 shell 语言是希伯来语、阿拉伯语或其他支持阅读顺序对齐的语言时,此样式才有效;否则,将忽略该样式。
对静态控件或编辑控件使用 WS_EX_RIGHT 样式的效果与分别使用 SS_RIGHT 或 ES_RIGHT 样式的效果相同。 将此样式用于按钮控件的效果与使用 BS_RIGHT 和 BS_RIGHTBUTTON 样式的效果相同。

WS_EX_RIGHTSCROLLBAR

0x00000000L

如果) 位于工作区右侧,则垂直滚动条 (。 这是默认值。

WS_EX_RTLREADING

0x00002000L

如果 shell 语言是希伯来语、阿拉伯语或其他支持阅读顺序对齐的语言,则使用从右到左的阅读顺序属性显示窗口文本。 对于其他语言,将忽略该样式。

WS_EX_STATICEDGE

0x00020000L

窗口具有三维边框样式,旨在用于不接受用户输入的项。

WS_EX_TOOLWINDOW

0x00000080L

该窗口旨在用作浮动工具栏。 工具窗口具有短于普通标题栏的标题栏和使用较小的字体绘制的窗口标题。 工具窗口不会显示在任务栏中,也不会显示在用户按 Alt+TAB 时显示的对话框中。 如果工具窗口具有系统菜单,则其图标不会显示在标题栏上。 但是,可以通过右键单击或键入 ALT+SPACE 来显示系统菜单。

WS_EX_TOPMOST

0x00000008L

窗口应放置在所有非最顶部窗口的上方,并且应保持在窗口上方,即使窗口已停用也是如此。 若要添加或删除此样式,请使用 SetWindowPos 函数。

WS_EX_TRANSPARENT

0x00000020L

在绘制由同一线程) 创建的窗口下的同级 (之前,不应绘制窗口。 该窗口显示为透明,因为基础同级窗口的位已被绘制。
若要在不受这些限制的情况下实现透明度,请使用 SetWindowRgn 函数。

WS_EX_WINDOWEDGE

0x00000100L

窗口的边框带有凸起的边缘。