900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > winform下自绘提示框风格窗体

winform下自绘提示框风格窗体

时间:2020-12-04 07:13:42

相关推荐

winform下自绘提示框风格窗体

昨天分享了一个环形滚动条控件,今天分享一个提示框风格的窗体。代码如下:

/// <summary>/// 继承自Form,但将FormBorderStyle设置为None/// </summary>public partial class TipForm : Form{public TipForm(){InitializeComponent();}/// <summary>/// 鼠标按下位置,方便移动窗体/// </summary>private Point ptMouseDown;/// <summary>/// 窗体下部分尖头的坐标位置/// </summary>private Point position;public Point Position{get { return position; }set { position = value;SetPosition(position);}}/// <summary>/// 设置窗口的圆角半径/// </summary>private int radius = 50;public int Radius{get { return radius; }set { radius = value; }}/// <summary>/// 重写OnPaint方法以绘制窗体边框/// </summary>/// <param name="e"></param>protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics graph = e.Graphics;graph.SmoothingMode = SmoothingMode.AntiAlias;GraphicsPath path = GetTipPath(ClientRectangle);Rectangle rect = new Rectangle(ClientRectangle.X, ClientRectangle.Y,ClientRectangle.Width, ClientRectangle.Height);rect.Inflate(-1, -1);GraphicsPath border = GetTipPath(rect);GraphicsPath curve = new GraphicsPath();graph.DrawPath(new Pen(Color.Black,2), border);this.Region = new Region(path);}/// <summary>/// 根据窗体下部的顶点位置设置窗体位置/// </summary>/// <param name="pos">屏幕坐标点</param>public void SetPosition(Point pos){this.Location = new Point(pos.X - Size.Width / 2,pos.Y - Size.Height);}/// <summary>/// 根据当前窗体的ClientRectangle属性获取Tip风格路径/// </summary>/// <param name="rect"></param>/// <returns></returns>private GraphicsPath GetTipPath(Rectangle rect){GraphicsPath path = new GraphicsPath();int height = rect.Height - Radius;path.StartFigure();path.AddArc(rect.X, rect.Y, Radius, Radius, 270, -90);path.AddArc(rect.X, rect.Y + height - Radius, Radius, Radius, 180, -90);path.AddLine(new Point(rect.X + Radius / 2, rect.Y + height),new Point(rect.X + rect.Width / 2 - Radius / 2,rect.Y + height));path.AddLine(new Point(rect.X + rect.Width / 2 - Radius / 2,rect.Y + height),new Point(rect.X + rect.Width / 2, rect.Y + height + Radius));path.AddLine(new Point(rect.X + rect.Width / 2, rect.Y + height + Radius),new Point(rect.X + rect.Width / 2 + Radius / 2,rect.Y + height));path.AddLine(new Point(rect.X + rect.Width / 2 + Radius / 2,rect.Y + height),new Point(rect.X + rect.Width - Radius / 2,rect.Y + height));path.AddArc(rect.X + rect.Width - radius, rect.Y + height - Radius, Radius, Radius, 90, -90);path.AddArc(rect.X + rect.Width - Radius, rect.Y, Radius, Radius, 0, -90);path.AddLine(new Point(rect.X + rect.Width - Radius / 2, rect.Y), new Point(rect.X + Radius / 2, rect.Y));path.CloseFigure();return path;}private void button1_Click(object sender, EventArgs e){Close();}/// <summary>/// 鼠标移动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TipForm_MouseMove(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){Point pt = e.Location;Location = new Point(Location.X + pt.X - ptMouseDown.X,Location.Y + pt.Y - ptMouseDown.Y);}}/// <summary>/// 鼠标按下事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TipForm_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){ptMouseDown = e.Location;}}private void btnClose_Click(object sender, EventArgs e){Close();}private void TipForm_SizeChanged(object sender, EventArgs e){Point pt = new Point(ClientRectangle.X + ClientRectangle.Width - Radius / 4 - 32,ClientRectangle.Y + Radius / 4);btnClose.Location = pt;}}

主要是通过创建一个表示窗体轮廓的路径,然后根据这个路径设置窗体的Region属性来完成的。下面是效果截图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。