C# winform中不规则窗体制作的解决方案,方案二[转]

来源:互联网 发布:android简书app源码 编辑:程序博客网 时间:2024/06/05 01:02

步骤1同方法1,先用图象处理软件制作您的不规则窗体的位图BMP
步骤2创建windows应用程序。创建windows窗体。
     
由于方法2是调用类来实现制作不规则窗体,所以您只需要在窗体的LOAD事件中加入以下代码:
private void login_Load(object sender, System.EventArgs e)
   {
    //
初始化调用不规则窗体生成代码
    BitmapRegion BitmapRegion =new BitmapRegion();//
此为生成不规则窗体和控件的类
    BitmapRegion.CreateControlRegion(this,new Bitmap("HMlogin.bmp"));
   }
其中"HMlogin.bmp"为您制作的位图。

下面就是文件BitmapRegion.cs

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace MsgClassLibrary


public class BitmapRegion
{
   public BitmapRegion()
   {}


   /// <summary>
   ///
创建支持位图区域的控件(目前有buttonform
   /// </summary>

   public static void CreateControlRegion(Control control, Bitmap bitmap)
   {
    //
判断是否存在控件和位图
    if(control == null || bitmap == null)
     return;

    //设置控件大小为位图大小
    control.Width = bitmap.Width;
    control.Height = bitmap.Height;
    //
当控件是form
    if(control is System.Windows.Forms.Form)
    {
     //
强制转换为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);
     // Apply new region
     //
应用新的区域
     form.Region = new Region(graphicsPath);
    }
     //
当控件是button
    else if(control is System.Windows.Forms.Button)
    {
     //
强制转换为 button
     Button button = (Button)control;
     //
不显示button text
     button.Text = "";

     //改变 cursorstyle
     button.Cursor = Cursors.Hand;
     //
设置button的背景图片
     button.BackgroundImage = bitmap;

     //计算位图中不透明部分的边界
     GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
     //
应用新的区域
     button.Region = new Region(graphicsPath);
    }
   }
   /// <summary>
   /// //
计算位图中不透明部分的边界
   /// </summary>
   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; row ++)
    {
     //
重设
     colOpaquePixel = 0;
     //
偏历所有列(X方向)
     for(int col = 0; col < bitmap.Width; col ++)
     {
      //
如果是不需要透明处理的点则标记,然后继续偏历
      if(bitmap.GetPixel(col, row) != colorTransparent)
      {
       //
记录当前
       colOpaquePixel = col;
       //
建立新变量来记录当前点
       int colNext = col;
       ///
从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
       for(colNext = colOpaquePixel; colNext < bitmap.Width; colNext ++)
       if(bitmap.GetPixel(colNext, row) == colorTransparent)
       break;
       //
将不透明点加到graphics path
       graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
       col = colNext;
      }
     }
    }
    // Return calculated graphics path
    return graphicsPath;
   }
}
}

完成窗口自身效果后此刻您要做的就是为窗体添加移动、关闭、最大最小化的事件代码了。

1、首先,关闭很简单,只需要在您的事件中加入
   this.Close();//
关闭此窗体
  

Application.Exit();//
退出应用程序
2
、最大最小化事件也很简单
   this.WindowState=FormWindowState.Minimized;//
窗口最小化   
   this.WindowState=FormWindowState.Maximized;//
窗口最大化
3
、移动相对比较麻烦
  
你先需要建立两个全局变量:
   private Point mouseOffset;        //
记录鼠标指针的坐标
    private bool isMouseDown = false; //
记录鼠标按键是否按下

然后为您的事件加入相应的代码:
private void form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
   {
    int xOffset;
    int yOffset;

    if (e.Button == MouseButtons.Left)
    {
     xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
     yOffset = -e.Y - SystemInformation.CaptionHeight -
      SystemInformation.FrameBorderSize.Height;
     mouseOffset = new Point(xOffset, yOffset);
     isMouseDown = true;
    }
   }

   private void form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
   {
    if (isMouseDown)
    {
     Point mousePos = Control.MousePosition;
     mousePos.Offset(mouseOffset.X, mouseOffset.Y);
     Location = mousePos;
    }
   }

   private void form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
   {
    //
修改鼠标状态isMouseDown的值
    //
确保只有鼠标左键按下并移动时,才移动窗体
    if (e.Button == MouseButtons.Left)
    {
     isMouseDown = false;
    }
   }