posts - 21,  comments - 60,  trackbacks - 3
因为要给师弟们讲课,我写了异型窗体制作(两种方法) 这篇博客。后来有个师弟说他把我的代码修改成了一个组件,想把这个组件拖拽到窗体里,经过简单设置就能实现不规则窗体,但是没有成功。经过实验,我这里重新把原来的代码整理了一下,下面这个组件CusomForm编译后就可以使用,拖拽到窗体后需要设置ParentForm、BackImage、TranTransparentColor三个属性,并且不用再写代码处理没有标题栏的窗体无法移动这个问题。
代码如下:
  1using System;
  2using System.ComponentModel;
  3using System.Drawing;
  4using System.Drawing.Design;
  5using System.Drawing.Drawing2D;
  6using System.Windows.Forms;
  7
  8namespace Spider.Common
  9{
 10    /// <summary>
 11    /// CustomForm 的摘要说明。
 12    /// </summary>

 13    [DefaultProperty("BackImage")]
 14    public class CustomForm : Component
 15    {
 16        private Form parentForm;
 17        private Bitmap BmpBack;
 18        private Color transparentColor = Color.Empty;
 19        /// <summary>
 20        /// 必需的设计器变量。
 21        /// </summary>

 22        private System.ComponentModel.Container components = null;
 23
 24        public CustomForm(System.ComponentModel.IContainer container)
 25        {
 26            ///
 27            /// Windows.Forms 类撰写设计器支持所必需的
 28            ///

 29            container.Add(this);
 30            InitializeComponent();
 31        }

 32
 33        public CustomForm()
 34        {
 35            ///
 36            /// Windows.Forms 类撰写设计器支持所必需的
 37            ///

 38            InitializeComponent();
 39
 40            //
 41            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
 42            //
 43        }

 44
 45        /// <summary> 
 46        /// 清理所有正在使用的资源。
 47        /// </summary>

 48        protected override void Dispose( bool disposing )
 49        {
 50            if( disposing )
 51            {
 52                if(components != null)
 53                {
 54                    components.Dispose();
 55                }

 56            }

 57            base.Dispose( disposing );
 58        }

 59
 60        组件设计器生成的代码
 70
 71        /// <summary>
 72        /// 设置或读取不规则窗体
 73        /// </summary>

 74        [DefaultValue(null), Category("外观")]
 75        public Form ParentForm
 76        {
 77            get return parentForm; }
 78            set {
 79                parentForm = value; 
 80                if (parentForm != null{
 81                    if (BmpBack != null{
 82                        SetWindowRegion();
 83                    }

 84                    parentForm.MouseDown += new MouseEventHandler(parentForm_MouseDown);
 85                    parentForm.MouseMove += new MouseEventHandler(parentForm_MouseMove);
 86                    parentForm.MouseUp += new MouseEventHandler(parentForm_MouseUp);
 87                }

 88            }

 89        }

 90
 91        /// <summary>
 92        /// 设置或读取背景图片,依据该图片生成不规则窗体
 93        /// </summary>

 94        [DefaultValue(null), Category("外观"),
 95        RefreshProperties(RefreshProperties.Repaint)]
 96        public Image BackImage
 97        {
 98            get return BmpBack; }
 99            set {
100                if (value != null{
101                    BmpBack = new Bitmap(value);
102                    if (parentForm != null{
103                        SetWindowRegion();
104                    }

105                }
 else {
106                    BmpBack = null;
107                    parentForm.BackgroundImage = null;
108                    parentForm.Region = new Region(new Rectangle(00
109                        parentForm.Width, parentForm.Height));
110                }

111            }

112        }

113
114        /// <summary>
115        /// 设置或读取背景图片的透明色,背景图片非透明色区域构成不规则窗体
116        /// </summary>

117        [DefaultValue(typeof(Color), "Color.Empty"),
118        Category("外观"),]
119        public Color TransparentColor
120        {
121            get {
122                return transparentColor;
123            }

124            set {
125                transparentColor = value;
126                if (BmpBack != null && parentForm != null{
127                    SetWindowRegion(transparentColor);
128                }

129            }

130        }

131
132        private void SetWindowRegion()
133        {
134            TransparentColor = BmpBack.GetPixel(00);
135            SetWindowRegion(transparentColor);
136        }

137
138        private void SetWindowRegion(Color transparentColor)
139        {
140            Color TempColor;
141            GraphicsPath gp;
142
143            gp = new GraphicsPath();
144            parentForm.FormBorderStyle = FormBorderStyle.None;
145            parentForm.Width = BmpBack.Width;
146            parentForm.Height = BmpBack.Height;
147            parentForm.BackgroundImage = BmpBack;
148
149            for (int nX = 0; nX < BmpBack.Width; nX++{
150                for (int nY = 0; nY < BmpBack.Height; nY++{
151                    TempColor = BmpBack.GetPixel(nX, nY);
152                    if (TempColor != transparentColor) {
153                        gp.AddRectangle(new Rectangle(nX, nY, 11));
154                    }

155                }

156            }

157
158            parentForm.Region = new Region(gp);
159        }

160
161        鼠标事件操作
190    }

191}

192
posted on 2005-11-02 13:04 山伟 阅读(...) 评论(...) 编辑 收藏