天天看點

不規則窗體demo

不規則窗體

主要用控件的​

​Region​

​屬性。效果如下

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

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

            //重新繪制視窗樣式
            string fileName = @"bg.jpg";
            Bitmap mybitmap = new Bitmap(fileName);
            CreateControlRegion(this, mybitmap);
            this.BackColor = Color.White;// 此處為添加部分  
            this.TransparencyKey = Color.White;//此處為添加部分 

            CreateControlRegion(button1, mybitmap);

            int btnWidth = button1.Width;
            int btnHeight = button1.Height;

            button1.Width = btnWidth / 2;
            button1.Height = btnHeight / 6;

            button1.Location = new Point((this.Width - button1.Width) / 2, (this.Height - button1.Height) / 2 - button1.Height);

            button1.Font = new System.Drawing.Font("微軟雅黑", 20);
            button1.Text = "Button";

        }

             /// <summary>
        /// 重新繪制視窗樣式
        /// </summary>
        /// <param name="control"></param>
        /// <param name="bitmap"></param>
        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;

        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(base.Handle, 0x112, 0xf012, 0);
            }
        }

        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();

        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int IParam);

        private void button1_Click(object sender, EventArgs e)
        {
            Close();
        }

    }
}