在Windows中怎样创建异形窗口?

  
创建规则的非矩形窗口:
 
    在程序开头加上命名空间:

    using System.Drawing;

    在Windows窗体可视化的编程界面中放置好窗体和控件,比如窗体叫from1,在窗体的paint事件中加入重新绘制自己的代码就可以了。

    所有的控件都有paint事件,在运行中都可以这样对自身的形状进行重新绘制。

private   void  Form1_Paint( object  sender, PaintEventArgs e)

 
{

       System.Drawing.Drawing2D.GraphicsPath shape 
= new System.Drawing.Drawing2D.GraphicsPath();    //Gdi+

       shape.AddEllipse(
00this.Width, this.Height);     //绘制椭圆窗口

       t
his.Region = new System.Drawing.Region(shape);

  }

      可以把这段代码放到程序里,运行起来看一下效果。

创建不规则的异型窗体:

    基本的思路是:创建一个性化的位图,把不想显示的地方设置成一种特殊的颜色。添加一个窗体,并把窗体的背景图设置为自己设计的位图,将特殊色设置为透明色。好了。

例子1:用于显示器颜色在24位以下的。

    自己做一张图backPic.bmp,把边界以外的地方设置成黄色,添加窗体form2。

    把窗体的backgroundImage属性设置成位图,transparencyKey属性设置成黄色。

    添加代码使窗体能够关闭,最小化,移动等。

例子2:用于所有显示器。

private   void  Form2_Load( object  sender, EventArgs e)
      
{
            Bitmap b 
= new Bitmap("..///..///Resources///backPic.bmp");
            BitmapRegion.CreateControlRegion(
this, b);              
            
//此为生成不规则窗体和控件的类
       }

  BitmapRegion类的定义:还可以用于不规则控件。

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

namespace  IrregularForm
{
    
public   class  BitmapRegion
    {
        
public  BitmapRegion()
        { }

    
        
//  创建支持位图区域的控件(目前有button和form)
        
        
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);
               
                
// 应用新的区域
                form.Region  =   new  Region(graphicsPath);
            }
          
            
// 当控件是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);
               
                
// 应用新的区域
                button.Region  =   new  Region(graphicsPath);
            }
        }
       
        
// 计算位图中不透明部分的边界
      
        
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  graphicsPath;
        }
    } 

}

 

 

   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值