怎样实现Vista半透窗体
来源:互联网 发布:在线子域名爆破工具 编辑:程序博客网 时间:2024/06/06 06:56
How to make a Transparent WinForm like VistaForm in VS2005
Introduction
This is article about how to make a transparent form in VS2005 like VistaForm. When I saw the VistaForm at my very first time. I was thinking how to make a form like that. I searched lots fo web sites for a good solution, but I didn't find an answer. Some guys told me to make such a form with 3 forms, I think it's a crasy idea, we can do that, but i don't know how we can use the form in Dialog model. I tried serval ways to implement this form and now the solution i provide maybe a good and simply idea. I'm not really making the form to be tansparent, the code is as following. The most important code is Graphics.CopyFromScreen
Source Code
e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), new Size(this.Width, 23));e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), new Size(3, this.Height));e.Graphics.CopyFromScreen(this.PointToScreen(new Point(this.Width - 4, 0)), new Point(this.Width - 4, 0), new Size(3, this.Height));e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, this.Height - 4)), new Point(0, this.Height - 4), new Size(this.Width, 3));
Key Point
public GlassForm(){ InitializeComponent(); //FocusForm = this; base.Padding = new Padding(4, 24, 5, 4); //this property is very important to make form repaint base.Opacity = 0.99; this.FormBorderStyle = FormBorderStyle.None; SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); SetStyle(ControlStyles.ResizeRedraw, true);}public new double Opacity//we make a new Opcity property to stop any modify //of this property from outside{ get { return 1; }}
protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e); e.Graphics.Clear(System.Drawing.Color.White); e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), new Size(this.Width, 23)); e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), new Size(3, this.Height)); e.Graphics.CopyFromScreen(this.PointToScreen(new Point(this.Width - 4, 0)), new Point(this.Width - 4, 0), new Size(3, this.Height)); e.Graphics.CopyFromScreen(this.PointToScreen(new Point(0, this.Height - 4)), new Point(0, this.Height - 4), new Size(this.Width, 3)); if (FocusForm==this) { e.Graphics.FillRectangle(new SolidBrush( this.ColorSetting.ActiveHeaderColor), new Rectangle(new Point(0, 0), this.Size)); } else { e.Graphics.FillRectangle(new SolidBrush( this.ColorSetting.HeaderColor), new Rectangle(new Point(0, 0), this.Size)); } //.HighQuality; e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath(); path.AddLine(2, 0, this.Width - 4, 0); path.AddLine(this.Width - 4, 0, this.Width - 2, 2); path.AddLine(this.Width - 2, 2, this.Width - 2, this.Height - 4); path.AddLine(this.Width - 2, this.Height - 4, this.Width - 4, this.Height - 2); path.AddLine(this.Width - 4, this.Height - 2, 2, this.Height - 2); path.AddLine(2, this.Height - 2, 0, this.Height - 4); path.AddLine(0, this.Height - 4, 0, 2); path.AddLine(0, 2, 2, 0); System.Drawing.Drawing2D.GraphicsPath pathFrame = new System.Drawing.Drawing2D.GraphicsPath(); pathFrame.AddLine(2, 0, this.Width - 3, 0); pathFrame.AddLine(this.Width - 3, 0, this.Width - 1, 2); pathFrame.AddLine(this.Width - 1, 2, this.Width - 1, this.Height - 3); pathFrame.AddLine(this.Width - 1, this.Height - 4, this.Width - 4, this.Height - 1); pathFrame.AddLine(this.Width - 4, this.Height - 1, 2, this.Height - 1); pathFrame.AddLine(2, this.Height - 1, 0, this.Height - 4); pathFrame.AddLine(0, this.Height - 4, 0, 2); pathFrame.AddLine(0, 2, 2, 0); this.Region = new Region(pathFrame); //e.Graphics.FillPath(new SolidBrush(Color.FromArgb(30, // this.HeaderColor)), pathFrame); this.BackColor = this.ColorSetting.BackColor; if (FocusForm == this) e.Graphics.DrawPath(new Pen(this.ColorSetting.ActiveBorderColor), path); else e.Graphics.DrawPath(new Pen(this.ColorSetting.BorderColor), path); Rectangle clientRegion = new Rectangle(3, 23, this.Width - 8, this.Height - 28); e.Graphics.FillRectangle(new SolidBrush( this.ColorSetting.BackColor), clientRegion); if (FocusForm == this) e.Graphics.DrawRectangle(new Pen(this.ColorSetting.ActiveBorderColor), clientRegion); else e.Graphics.DrawRectangle(new Pen(this.ColorSetting.BorderColor), clientRegion); if(this.BackgroundImage!=null) e.Graphics.DrawImage(this.BackgroundImage, clientRegion); if(this.Icon!=null) e.Graphics.DrawIcon(this.Icon, new Rectangle(3, 3, 16, 16)); Font f = new Font("ArialBlack", (float)9,FontStyle.Bold); e.Graphics.DrawString(this.Text, f, Brushes.White, 21, 3); e.Graphics.DrawString(this.Text, f, Brushes.White, 23, 3); e.Graphics.DrawString(this.Text, f, Brushes.White, 22, 2); e.Graphics.DrawString(this.Text, f, Brushes.White, 22, 4); e.Graphics.DrawString(this.Text, f, Brushes.Black, 22, 3); if (this.IsMinOn) { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.MinHigh, this.MinRegion.GetBounds(e.Graphics)); } else { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.Min, this.MinRegion.GetBounds(e.Graphics)); } if (this.IsCloseOn) { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.CloseHigh, this.CloseRegion.GetBounds(e.Graphics)); } else { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.Close, this.CloseRegion.GetBounds(e.Graphics)); } if (this.IsMaxOn) { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.MaxHigh, this.MaxRegion.GetBounds(e.Graphics)); } else { e.Graphics.DrawImage( global::Sayes.Controls.Vista.Properties.Resources.Max, this.MaxRegion.GetBounds(e.Graphics)); }}
以上源码,可以到这里下载:http://download.csdn.net/source/511107
也可以到出处下载: http://www.codeproject.com/KB/aspnet/How_to_make_VistaForm.aspx
- 怎样实现Vista半透窗体
- 怎样实现控件随窗体大小而改变!!
- [VB.NET]VB.NET2005中怎样实现子窗体控制父窗体的控件属性?
- 怎样作登录窗体
- C#轻松仿造Vista风格窗体
- C#怎样实现窗体透明而控件不透明,或者就是怎样无窗体显示图片,就像圣诞那样的程序,不吝赐教!
- vs2005 winform窗体怎样打包
- WinForm 怎样关闭登陆窗体
- VC++.NET winForm中怎样实现两个窗体互相修改对方TextBox的值,我是菜鸟:)
- [VB.NET]怎样实现MDI窗体菜单上的“窗口”菜单下面的功能
- Windows Vista上怎样安装linux
- showModalDialog弹出窗体怎样得到父窗体元素
- win7 ,vista 下不支持无窗体ActiveX控件的解决办法
- 怎样判断一个form1窗体存在?
- 怎样为MdiParent父窗体添加背景图片
- 怎样调用dll里的窗体
- 怎样去掉VB窗体上的图标
- C#中怎样调用子窗体
- Python编码规范
- ZOJ 1093 Monkey and banana
- Socket网络传输(C#)
- 为什么开发者不愿意重构他们的程序?(摘录)
- 不会再用眼泪去感动爱情
- 怎样实现Vista半透窗体
- Web页面输入框相同尺寸不同长度的问题
- 八个DOS命令
- 不要放开相互牵着的手
- 修改文件时间与创建新文件:touch
- DELPHI原创摘抄
- X61上Fedora core 8安装
- CStatic 的使用
- Linux系统启动过程中进程情况