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

原创 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了...........哈哈

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

创建不规则窗体和控件

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

WPF创建不规则窗体并实现阴影效果

方法一:使用png图片作为窗体背景。 直接看代码好了:
  • Qian_F
  • Qian_F
  • 2014-06-06 17:32
  • 4948

Windows 中不规则窗体的编程实现

转载自:VC知识库   链接地址:http://www.vckbase.com/index.php/wv/1067 一、序言 在绝大多数的Windows应用程序中,其窗体都是使用的正规...

使用SWT制作不规则窗体(已更新)

原文:http://blog.csdn.net/javenwong/article/details/1674949   (注: 不好意思, 前几天发表完自己也没看, 原来没有发上来, 由于是第一次...

C# 创建不规则窗体

要求: 1 使得窗体或按钮的形状跟图片一致。 效果图:

C# winform制作不规则窗体

private void Form1_Load(object sender, EventArgs e) { //重新绘制窗口样式 str...

Qt 不规则窗体编程

有些时候,为了创建个性化软件界面,往往需要各种形状的窗口,这就有别于传统的窗口了!那么,怎么处理类似的界面呢?我们可以通过继承QWidget、QDialog等类来派生新类,在新类中重新实现基类中的虚函...

windows不规则窗体的编程实现

转载自:VC知识库   链接地址:http://www.vckbase.com/index.php/wv/1067 一、序言 在绝大多数的Windows应用程序中,其窗...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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