C# 创建不规则窗体

要求:

1 使得窗体或按钮的形状跟图片一致。

效果图:

2 代码:

参考文档:  修改或添加部分,已经用" 此处为添加部分"标注, 缺少则不能达到效果

http://wenku.baidu.com/view/9bdf813f767f5acfa0c7cd3e.html

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace BT
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string fileName = @"C:\Users\huangtao\Desktop\test.png";
            Bitmap mybitmap = new Bitmap(fileName);
            CreateControlRegion(this, mybitmap);
           this.BackColor = Color.White;// 此处为添加部分
            this.TransparencyKey = Color.White;//此处为添加部分
        }

        public static void CreateControlRegion(Control control, Bitmap bitmap)
        {
            // Return if control and bitmap are null
            //判断是否存在控件和位图
            if (control == null || bitmap == null)
                return;
            //设置控件大小为位图大小
            control.Width = bitmap.Width;
            control.Height = bitmap.Height;
            // Check if we are dealing with Form here
            //当控件是form时
            if (control is System.Windows.Forms.Form)
            {
                // Cast to a Form object
                //强制转换为FORM
                Form form = (Form)control;
                //当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点
                form.Width = control.Width;
                form.Height = control.Height;
                //没有边界
                form.FormBorderStyle = FormBorderStyle.None;
                //将位图设置成窗体背景图片
                form.BackgroundImage = bitmap;
                //计算位图中不透明部分的边界
                GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
                //应用新的区域
                form.Region = new Region(graphicsPath);

                // 以下为自己添加的语句,不添加此两句会出现问题
                form.Width = bitmap.Width;
                form.Height = bitmap.Height;
            }

            //当控件是button时
            else if (control is System.Windows.Forms.Button)
            {
                //强制转换为 button
                Button button = (Button)control;
                //不显示button text
                button.Text = "";

                //改变 cursor的style
                button.Cursor = Cursors.Hand;

                //设置button的背景图片
                button.BackgroundImage = bitmap;

                //计算位图中不透明部分的边界
                GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
                // Apply new region
                //应用新的区域
                button.Region = new Region(graphicsPath);
                button.Width = bitmap.Width;
                button.Height = bitmap.Height;
                button.FlatStyle = FlatStyle.Popup;//此处为添加部分
            }
        }

         private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
        {
            //创建 GraphicsPath
            GraphicsPath graphicsPath = new GraphicsPath();

            //使用左上角的一点的颜色作为我们透明色
            Color colorTransparent = bitmap.GetPixel(0, 0);

            //第一个找到点的X
            int colOpaquePixel = 0;

            // 偏历所有行(Y方向)
            for (int row = 0; row < bitmap.Height - 1; row++)
            {
                // Reset value
                //重设
                colOpaquePixel = 0;

                //偏历所有列(X方向)
                for (int col = 0; col < bitmap.Width - 1; col++)
                {
                    //如果是不需要透明处理的点则标记,然后继续偏历
                    if (bitmap.GetPixel(col, row) != colorTransparent)
                    {

                        colOpaquePixel = col;

                        //建立新变量来记录当前点
                        int colNext = col;

                        ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
                        for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                        {
                            Color gpi = bitmap.GetPixel(colNext, row);
                            if (bitmap.GetPixel(colNext, row) == colorTransparent)
                            {

                                break;
                            }
                        }
                        //将不透明点加到graphics path

                        {
                            graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
                        }
                        col = colNext;
                    }
                }
            }
            return graphicsPath;
        }

    }
}
时间: 2024-10-28 10:00:03

C# 创建不规则窗体的相关文章

C#创建不规则窗体的3种方式详解

现在,C#创建不规则窗体不是一件难事,下面总结一下: 一.自定义窗体 一般为规则的图形,如圆.椭圆等. 做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下: System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath(); shape.AddEllipse(0,0,this.Height, this.Width); this.Region = ne

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

一.序言 在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等.矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使用足矣.但在某些娱乐游戏程序中使用就略显呆板些了,这时若用不规则窗体替代原先的矩形窗体,将会使这类程序更添情趣.典型的例子有windows 自代的Media Player,新版本的Media Player有个控制面板的选项,选中这些面板,播放器就以选中的面板形状出现,这时的播放器比以前版本

详解使用C#制作不规则窗体的方法

本文转自翔宇网http://www.biye5u.com/article/Csharp/winform/2010/2593.html 以前想制作不规则窗体,大多使用API函数来实现,在C#中,也可以不使用API函数照样能制作出漂亮的不规则窗体,下面就介绍一下相关方法. 1.首先准备一张BMP格式的图片 图片的形式随意,但注意图片的背景最好设置成C#中提供的一些色系,如白色(#FFFFFF\white).黑色(#000000\black).黄色(#FFFF00\yellow).蓝色(#0000FF

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

首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼容问题解决办法.该网友的解决办法也是别出心裁的,为什么这样说呢,你下载了他的程序认真读一下就便知道,他的webBrowser控件的是单独放在一个Form中,让这个Form与WPF中的一个Bord控件进行关联,进行同步移动,但是在移动的时候会出现闪烁,并且还会出现运动的白点,用户体验肯定不好. OK,

GUI——AWT框架和容器,创建简单窗体

GUI概述:GUI(Graphical User Interface)—图形化用户界面.用户和程序之间可以通过GUI能方便友好地进行交互,在Java语言中,JFC(Java Foundation Classed)是开发GUI的API集,它主要包含以下几个部分: a)   AWT(抽象窗口工具包):Java开发用户界面最初的工具包,是建立JFC的主要基础; b)   Swing组件:建立在AWT之上,新的,功能更强大的图形组件包; c)   JAVA 2D:实现高质量的二维图形; AWT框架: ①

GTK不规则窗体

GTK不规则窗体示例 GdkBitmap *window_shape_bitmap = gdk_pixmap_new(NULL, m_ROI.width + 2, m_ROI.height + 2, 1); GdkGC *gc = gdk_gc_new(window_shape_bitmap); GdkColormap *colorMap = gdk_colormap_get_system(); GdkColor black, white; gdk_color_black(colorMap, &

WPF换肤之一:创建圆角窗体

原文:WPF换肤之一:创建圆角窗体 我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感.这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文中有任何错误或者不足,还请指出. WPF是微软大战略中的一个重心所在,学习WPF可谓是一举多得:首先,学习WPF可以让你了解SilverLight的80%:其次,XAML语言可以让你快速的入手WCF和WF:更甚者,就是WPF给予DX渲染核心,抛弃了传统WINFORM以GDI+为主的渲染方式,使得界面

MySql 服务器 创建Web窗体

1.创建Web窗体: 选择的是Visual C# 2. 3. 4. 5. 6.

绘图-不规则窗体

WPF实现不规则窗体,方法很多很多多.... 本文总结DebugLZQ认为简洁高效的几种方法 实现WPF不规则窗体的几种常用的方法如下: 1.使用Blend等工具绘制一想要的窗体.这个可以参考xiaowei0705的这篇博文:WPF制作不规则的窗体 . 2.给window的Clip属性赋Path值.这个可以参考DebugLZQ前面的博文:WPF Effect Clip以及Transform . 3.使用透明背景的PNG图像. 4.为Window主容器添加Border 5.使用Blender制作想