`
xldong
  • 浏览: 23846 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C# 制作出任意不规则按钮! (原理根据背景图绘制button)

阅读更多
using System.Drawing.Drawing2D;
private void button3_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  { this.button3.Cursor = Cursors.Hand;
         Bitmap bmpBob =(Bitmap)this.button3.Image;     
      GraphicsPath graphicsPath = CalculateControlGraphicsPath(bmpBob);
     this.button3.Region = new Region(graphicsPath); 
  }
  private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
  {
  
   GraphicsPath graphicsPath = new GraphicsPath();
 
 
   Color colorTransparent = bitmap.GetPixel(0, 0);
 
   int colOpaquePixel = 0;
 
   for(int row = 0; row < bitmap.Height; row ++)
   {
   
    colOpaquePixel = 0;
  
    for(int col = 0; col < bitmap.Width; col ++)
    {
   
     if(bitmap.GetPixel(col, row) != colorTransparent)
     {
     
      colOpaquePixel = col;
   
      int colNext = col;


http://www.51132.com/Html/c/14212553284.html

上面的代码测试效果不好,放上一个老外写的类,下过好一点:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace BitmapRegionTest
{
    /// <summary>
    /// Summary description for BitmapRegion.
    /// </summary>
    public class BitmapRegion
    {
        public BitmapRegion()
        {}

        /// <summary>
        /// Create and apply the region on the supplied control
        /// </summary>
        ///
The Control object to apply the region to
        /// The Bitmap object to create the region from
        public static void CreateControlRegion(Control control, Bitmap bitmap)
        {
            // Return if control and bitmap are null
            if(control == null || bitmap == null)
                return;
           
            // Set our control's size to be the same as the bitmap
            control.Width = bitmap.Width;
            control.Height = bitmap.Height;

            // Check if we are dealing with Form here
            if(control is System.Windows.Forms.Form)
            {
                // Cast to a Form object
                Form form = (Form)control;

                // Set our form's size to be a little larger that the bitmap just
                // in case the form's border style is not set to none in the first place
                form.Width += 15;
                form.Height += 35;

                // No border
                form.FormBorderStyle = FormBorderStyle.None;

                // Set bitmap as the background image
                form.BackgroundImage = bitmap;

                // Calculate the graphics path based on the bitmap supplied
                GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

                // Apply new region
                form.Region = new Region(graphicsPath);
            }

            // Check if we are dealing with Button here
            else if(control is System.Windows.Forms.Button)
            {
                // Cast to a button object
                Button button = (Button)control;

                // Do not show button text
                button.Text = "";
               
                // Change cursor to hand when over button
                button.Cursor = Cursors.Hand;

                // Set background image of button
                button.BackgroundImage = bitmap;
               
                // Calculate the graphics path based on the bitmap supplied
                GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

                // Apply new region
                button.Region = new Region(graphicsPath);
            }
        }

        /// <summary>
        /// Calculate the graphics path that representing the figure in the bitmap
        /// excluding the transparent color which is the top left pixel.
        /// </summary>
        /// The Bitmap object to calculate our graphics path from
        /// <returns>Calculated graphics path</returns>
        private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
        {
            // Create GraphicsPath for our bitmap calculation
            GraphicsPath graphicsPath = new GraphicsPath();

            // Use the top left pixel as our transparent color
            Color colorTransparent = bitmap.GetPixel(0, 0);

            // This is to store the column value where an opaque pixel is first found.
            // This value will determine where we start scanning for trailing opaque pixels.
            int colOpaquePixel = 0;

            // Go through all rows (Y axis)
            for(int row = 0; row < bitmap.Height; row ++)
            {
                // Reset value
                colOpaquePixel = 0;

                // Go through all columns (X axis)
                for(int col = 0; col < bitmap.Width; col ++)
                {
                    // If this is an opaque pixel, mark it and search for anymore trailing behind
                    if(bitmap.GetPixel(col, row) != colorTransparent)
                    {
                        // Opaque pixel found, mark current position
                        colOpaquePixel = col;

                        // Create another variable to set the current pixel position
                        int colNext = col;

                        // Starting from current found opaque pixel, search for anymore opaque pixels
                        // trailing behind, until a transparent pixel is found or minimum width is reached
                        for(colNext = colOpaquePixel; colNext < bitmap.Width; colNext ++)
                            if(bitmap.GetPixel(colNext, row) == colorTransparent)
                                break;

                        // Form a rectangle for line of opaque pixels found and add it to our graphics path
                        graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));

                        // No need to scan the line of opaque pixels just found
                        col = colNext;
                    }
                }
            }

            // Return calculated graphics path
            return graphicsPath;
        }
    }
}

     
分享到:
评论

相关推荐

    C#技巧常用总结(C#制作出任意不规则按钮,C#日起函数样式大全==)

    1. **C#制作出任意不规则按钮**: 在Windows Forms或WPF应用中,可以通过自定义控件实现不规则形状的按钮。可以继承`Control`类,重写`OnPaint`方法,并在其中使用`GraphicsPath`和`Region`对象来绘制非矩形的轮廓...

    C#绘制不规则button

    ### C#绘制不规则Button详解 #### 一、引言 在GUI开发中,我们经常需要自定义控件的外观来提升用户体验。本篇文章将详细介绍如何利用C#结合`System.Drawing.Drawing2D`命名空间中的类和方法来实现不规则形状的...

    C#不规则按钮

    在C#编程中,"不规则按钮"通常指的是具有非矩形形状的控件,它突破了传统矩形按钮的限制,可以设计成各种自定义的形状,以满足用户界面的个性化需求。这类按钮通常通过自绘技术实现,即重写控件的`OnPaint`事件来...

    WPF不规则形状按钮

    在Windows Presentation Foundation(WPF)中,创建不规则形状的按钮是一种高级的界面设计技术,它允许开发者超越传统的矩形控件,为用户提供更具吸引力和个性化的交互体验。WPF的图形模型基于矢量图形,这使得我们...

    C#不规则窗体制作教程

    ### C#不规则窗体制作教程 在C#开发中,创建不规则形状的窗口能够为应用程序增添独特的视觉效果,并提升用户体验。本文将详细介绍如何利用C#和Windows Forms技术来实现这种功能,包括如何设置窗口的透明度、如何...

    测试按钮_不规则按钮_

    在本篇内容中,我们将深入探讨如何利用C#来实现“不规则按钮”的制作,重点在于通过设置按钮的背景图片并利用GDI+进行绘图来达成这一目标。 首先,我们需要了解C#中的Windows Forms,这是.NET Framework提供的一种...

    不规则按钮(Button)效果

    总之,这个源码案例提供了在Android中实现不规则形状按钮的方法,对于开发者来说,这是一个学习自定义View和图形绘制的好例子。通过理解并实践这样的代码,开发者可以提升自己的UI设计能力,实现更多创新的交互效果...

    C#winform制作绚丽的Ui界面

    例如,可以创建一个自定义Button类,通过在OnPaint事件中绘制不同的边框、渐变填充等来实现独特的按钮样式。 2. 使用皮肤资源文件:皮肤文件通常包含各种控件的背景图片、字体样式等信息。你可以创建XML或JSON格式的...

    C#不规则窗体实现

    总之,C#不规则窗体实现主要涉及到窗体的自绘以及事件处理,通过重写`OnPaint`方法绘制非矩形形状,并利用鼠标事件实现可移动性。在实际项目中,你可以根据需求调整形状,增加更多的交互功能,或者添加图像元素以...

    winform创建不规则窗体和控件源码.rar

    在Windows Forms中,标准窗体通常具有矩形形状,但通过重写`OnPaint`方法并使用`Graphics`对象,我们可以绘制出任意形状的窗体。这个过程涉及到两个关键点:一是禁用窗体的默认边框和标题,二是自定义绘制窗体的形状...

    C#自定义控件之-winform美化

    通过重写OnPaint事件,使用Graphics对象的FillRegion或DrawPath方法,可以创建不规则形状的窗体。 6. **自定义控件布局(Layout Management)** 使用TableLayoutPanel、FlowLayoutPanel等布局控件可以方便地排列...

    C# 不规则窗体实例源代码

    不规则窗体的实现主要涉及到Windows API的调用,尤其是GDI+(Graphics Device Interface Plus)库,它为C#提供了图形绘制和处理的功能。要创建一个不规则窗体,我们需要完成以下几个关键步骤: 1. **禁用边框和标题...

    winform创建不规则窗体和控件源码_0520.rar

    本文将深入探讨如何使用C#语言在WinForm中创建不规则形状的窗体和控件,基于提供的"winform创建不规则窗体和控件源码_0520.rar"文件。 一、不规则窗体的实现原理 不规则窗体是指窗体的形状并非传统的矩形,而是可以...

    C#写的一个拼图小游戏

    拼图游戏的基本原理是将一张完整的图片分割成若干个不规则或规则的小块,然后打乱顺序,玩家需要通过移动这些小块来恢复原图。在这个C#实现的版本中,首先需要处理的是图片的选择和加载,然后进行图片的切割,最后...

    C# 连连看<有图片>

    3. **GDI+绘图**:在C#中,GDI+库用于在窗体或控件上进行图形绘制,如绘制连连看的棋盘格子、连接线以及动画效果。 4. **数组与矩阵**:游戏棋盘通常可以用二维数组或矩阵来表示,方便存储和操作每个位置的状态(如...

    c#不规则窗体 可拖动 类似千千静听 输入法

    在C#编程中,创建不规则形状的窗体是一项高级技术,这通常涉及到Windows API的调用和自定义绘图。这种技术可以让窗体呈现出非矩形的外观,比如像千千静听音乐播放器和各种输入法那样,拥有独特的界面设计。在描述中...

    c#自绘菜单工具栏

    - `GraphicsPath`类可以创建复杂路径,用于绘制不规则形状。 7. **性能优化**: - 避免在每次`Paint`事件中创建新的`Graphics`、`Pen`和`Brush`对象,因为这会导致不必要的内存分配和性能下降。最好是在类级别上...

    winform创建不规则窗体和控件源码(值得下载)

    本文将深入探讨如何使用C#来创建不规则形状的窗体和控件,这些都是WinForm开发中的高级特性。 首先,要创建一个不规则形状的窗体,我们需要使用GDI+(Graphics Device Interface Plus)来绘制自定义的窗体边框。在...

    WPF制作不规则窗口 Tip消息提示框_可拖动_有关闭按钮.rar

    总的来说,创建一个具有不规则形状、可拖动和关闭按钮的WPF Tip消息提示框,需要结合C#代码和XAML,利用WPF提供的图形和布局机制,实现自定义的窗口渲染和交互行为。这不仅展示了WPF的灵活性,也为开发者提供了丰富...

    winform创建不规则窗体和控件源码

    在Windows Forms(Winform)开发中,创建不规则窗体和控件是一项高级技术,它允许开发者设计出具有独特形状的应用程序窗口,而非传统的矩形样式。本源码示例着重于利用C#编程语言来实现这一功能。下面将详细阐述相关...

Global site tag (gtag.js) - Google Analytics