不规则窗体或控件(想怎样不规则就怎样不规则)

原创 2006年06月06日 03:18:00

不规则窗体或控件(想怎样不规则就怎样不规则)

''''#############     注意        #######################
''''
'''            转载请保留原版信息及源码       
''''
''''
'''    
http://blog.csdn.net/kevery_net/
'''      http://25hour.netyi.org
''''

         '''功能:显示出不规则窗体或控件
         '''源码出自:贰伍小时(25hour  或 kevery )(写)
         '''日期:2005-06-06
         '''开发工具:.NET  
         '''语言:VB.NET
''''####################################################

以下为实例:

实例工程下载:vbnetformskin

实例所需图片:

创建一个VB.NET桌面程序"vbnetformskin"并在工程中创建一个窗体"form1.vb"并设置窗体景图片为上面那图片,设置窗体样式:FormBorderStyle = None,再在窗体中创建一个按钮"Button1"以下为源码:

Option Strict Off
Imports System.ComponentModel

Imports System.Drawing

Imports System.Windows.Forms

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private components As System.ComponentModel.Container

    Friend WithEvents Button1 As System.Windows.Forms.Button

 
    Public Sub New()
        MyBase.New()

        InitializeComponent()
    End Sub

    Public Overloads Sub Dispose() '释放资源,终止程序

        MyBase.Dispose() '调用父类的方法

        components.Dispose() '释放组件占用的资源

    End Sub

    Private Sub InitializeComponent()
        Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft
        Me.Button1.Location = New System.Drawing.Point(198, 244)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(212, 38)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Image)
        Me.ClientSize = New System.Drawing.Size(580, 298)
        Me.Controls.Add(Me.Button1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
        Me.ImeMode = System.Windows.Forms.ImeMode.Disable
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        SkinRegion_Xor(Me)
        'SkinRegion_Union(Me)
    End Sub

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

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        Button1.Text = GetRGB(Me, e.X, e.Y).ToString

    End Sub
End Class

1.原窗体图

2.不规则后窗体图

3.在工程中创建一个模块 "Module1.vb"  代码如下:

''''#############     注意        #######################
''''
'''            转载请保留原版信息及源码       
''''
''''
'''
'''     
http://25hour.netyi.org
''''
''''####################################################
'''功能:显示出不规则窗体或控件
'''源码出自:贰伍小时 25hour (写)
'''日期:2005-06-06
'''开发工具:.NET  
'''语言:VB.NET
'''本源码根中的SkinRegion_Union(..)方法模访[一鹤(hejianzhong)]写..
''''经我做适当修改并添加了一个方法SkinRegion_Xor(..)后,本人认为以比未修改之前精华多不少.
''''其中这两个方法实现的目的一至.第一个用了UNION并集,而第二个却相反相,用了XOR减去交集.
'''使用方法:
''第一,必须在要做不规则的控件上设置背景图片,若不设置的,在调用时,
''''''必须转参数skinFilePath文件名(如:参数值skinFilePath为skinimage.bmp,并该图片必须与本程序同一目录)
''第二为调用:如在窗体进入时进行不规则处理,则在窗体事件Private Sub Form1_Load(......)中直接调用,
''''源码为:SkinRegion_Union(me) 或 SkinRegion_Xor(me) 其中参数me为当窗体,即充当要做不规则的控件.

Public Module SKin

    Public Function SkinRegion_Union(ByVal SKControl As Control, Optional ByVal skinFilePath As String = Nothing) As Form
        Dim Rect As New Rectangle(0, 0, 0, 0)
        Dim RegIon As New System.Drawing.Region(Rect)

        Dim X, Y, Left_X, Right_X, BgWidth, BgHeight As Integer

        Dim RGB As Integer = GetRGB(SKControl, 0, 0)  ''获取某坐标的颜色(在此获取要透明的颜色)

        If skinFilePath <> Nothing Then SKControl.BackgroundImage = SKControl.BackgroundImage.FromFile(System.Windows.Forms.Application.StartupPath & "/" & skinFilePath)

        BgWidth = SKControl.BackgroundImage.Width

        BgHeight = SKControl.BackgroundImage.Height

        SKControl.Height = BgHeight

        SKControl.Width = BgWidth

        For Y = 0 To BgHeight

            X = 0

            Do

                While X <= BgWidth

                    If GetRGB(SKControl, X, Y) <> RGB Then
                        Exit While
                    End If

                    X = X + 1

                End While

                Left_X = X ''获取与指定坐标不同颜色的坐标开始位置

                While X <= BgWidth

                    If GetRGB(SKControl, X, Y) = RGB Then
                        Exit While
                    End If

                    X = X + 1

                End While

                Right_X = X - 1 ''获取与指定坐标不同颜色的坐标结束位置

                If Left_X <= Right_X Then

                    '创建一个具有指定边缘位置的 Rectangle 结构。
                    '此方法创建的新 Rectangle。

                    Rect = Rect.FromLTRB(Left_X, Y, Right_X, Y + 1) ''获取域窗体

                    '将此 Region 对象更新为其自身与指定 Rectangle 结构的并集。
                    '要与此 Region 对象合并的 Rectangle 结构。

                    RegIon.Union(Rect) ''并合域窗体

                End If


            Loop Until X >= BgWidth

        Next Y

        SKControl.Region = RegIon

        Rect = Nothing
        RegIon.Dispose()
        Return SKControl
    End Function

    Public Function SkinRegion_Xor(ByVal SKControl As Control, Optional ByVal skinFilePath As String = Nothing) As Region

        Dim Rect As New Rectangle(0, 0, 0, 0)

        Dim RegIon As Region

        Dim X, Y, Left_X, Right_X, BgWidth, BgHeight As Integer

        Dim RGB As Integer = -16777216 ''获取某坐标的颜色(-16777216为黑色)(在此获取要透明的颜色为黑色)
        Dim FirARGB2 As Integer = -1 ''获取某坐标的颜色(-1为白色)(在此获取要透明的颜色为红白色),也就是黑色和白色为透明色

        If skinFilePath <> Nothing Then SKControl.BackgroundImage = SKControl.BackgroundImage.FromFile(System.Windows.Forms.Application.StartupPath & "/" & skinFilePath)

        BgWidth = SKControl.BackgroundImage.Width

        BgHeight = SKControl.BackgroundImage.Height

        SKControl.Height = BgHeight

        SKControl.Width = BgWidth

        Rect = Rect.FromLTRB(0, 0, BgWidth, BgHeight)
        RegIon = New Region(Rect)


        For Y = 0 To BgHeight

            X = 0

            Do

                While X <= BgWidth

                    If GetRGB(SKControl, X, Y) = RGB Or GetRGB(SKControl, X, Y) = FirARGB2 Then
                        Exit While
                    End If
                    X = X + 1

                End While

                Left_X = X ''获取与指定坐标不同颜色的坐标开始位置

                While X <= BgWidth

                    If GetRGB(SKControl, X, Y) <> RGB And GetRGB(SKControl, X, Y) <> FirARGB2 Then
                        Exit While
                    End If

                    X = X + 1

                End While

                Right_X = X  ''获取与指定坐标不同颜色的坐标结束位置

                If Left_X <= Right_X Then

                    Rect = Rect.FromLTRB(Left_X, Y, Right_X, Y + 1)
                    RegIon.Xor(Rect)

                End If


            Loop Until X >= BgWidth

        Next Y

        SKControl.Region = RegIon

        Rect = Nothing
        RegIon.Dispose()

        Return SKControl.Region
    End Function

    Public Function GetRGB(ByVal SKControl As Control, ByVal x As Integer, ByVal y As Integer) As Integer

        Dim pm As Bitmap = SKControl.BackgroundImage

        Try

            Return pm.GetPixel(x, y).ToArgb

        Catch

            Exit Function

        End Try

    End Function

End Module

完成!

试运行看,是不是OK了...........哈哈

创建不规则窗体和控件

创建不规则窗体和控件 在以前版本的Visual Basic或Visual C++中,创建不规则窗体和控件是一件很复杂的事,不仅需要调用大量API函数而且工...
  • ytbada
  • ytbada
  • 2007年01月12日 10:17
  • 534

WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

在开发wpf项目时,需要调用外部com组件,同时需要制作透明窗口,于是问题出现了,当我们在设置 AllowsTransparency="True"后,com组件显示不出来了,只有透明属性为false才...

WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼...

创建不规则窗体和控件

实现方法 首先,创建一个位图文件作为程序的窗体。位图可以是任意形状的,但是位图文件区域一定要足够大,这样才能包含窗体上的所有控件。然后,你可以通过设置一些属性使该图成为程序的窗体。 ...

WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼...
  • xcl522
  • xcl522
  • 2014年11月12日 14:58
  • 416

C# winfrom 不规则窗体实例

  • 2017年09月13日 10:47
  • 23.11MB
  • 下载

C++ 中不规则窗体的快速显示

  • 2014年02月11日 09:50
  • 6KB
  • 下载

Qt中不规则窗体和部件的实现

描述:a.png    窗口背景图 图片: 描述:mask.png    窗口掩码图 图片: 描述:toolbutton.png    按钮背景图 图片:...

VB不规则窗体生成器

  • 2007年04月20日 17:41
  • 172KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不规则窗体或控件(想怎样不规则就怎样不规则)
举报原因:
原因补充:

(最多只允许输入30个字)