官网

http://www.hzhcontrols.com

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 

麻烦博客下方点个【推荐】,谢谢

NuGet

Install-Package HZH_Controls

目录

https://www.cnblogs.com/bfyx/p/11364884.html

用处及效果

 HZH_Controls.Forms.FrmAnchorTips.ShowTips(button1, "测试提示信息\nLEFT", AnchorTipsLocation.LEFT);
HZH_Controls.Forms.FrmAnchorTips.ShowTips(button1, "测试提示信息\nRIGHT", AnchorTipsLocation.RIGHT);
HZH_Controls.Forms.FrmAnchorTips.ShowTips(button1, "测试提示信息\nTOP", AnchorTipsLocation.TOP);
HZH_Controls.Forms.FrmAnchorTips.ShowTips(button1, "测试提示信息\nBOTTOM", AnchorTipsLocation.BOTTOM);

准备工作

依然是GDI+画图,不懂可以自行百度一下

开始

思路是:根据参数画图,根据图显示不规则窗体

添加一个窗体FrmAnchorTips

重写一些函数

   #region Override

         protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
base.OnClosing(e);
haveHandle = false;
this.Dispose();
} protected override void OnHandleCreated(EventArgs e)
{
InitializeStyles();
base.OnHandleCreated(e);
haveHandle = true;
} protected override CreateParams CreateParams
{
get
{
CreateParams cParms = base.CreateParams;
cParms.ExStyle |= 0x00080000; // WS_EX_LAYERED
return cParms;
}
} #endregion
  private void InitializeStyles()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
UpdateStyles();
}

根据图片显示窗体,这个是网上copy的

  #region 根据图片显示窗体    English:Display Forms Based on Pictures
/// <summary>
/// 功能描述:根据图片显示窗体 English:Display Forms Based on Pictures
/// 作  者:HZH
/// 创建日期:2019-08-29 15:31:16
/// 任务编号:
/// </summary>
/// <param name="bitmap">bitmap</param>
private void SetBits(Bitmap bitmap)
{
if (!haveHandle) return; if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))
throw new ApplicationException("The picture must be 32bit picture with alpha channel."); IntPtr oldBits = IntPtr.Zero;
IntPtr screenDC = Win32.GetDC(IntPtr.Zero);
IntPtr hBitmap = IntPtr.Zero;
IntPtr memDc = Win32.CreateCompatibleDC(screenDC); try
{
Win32.Point topLoc = new Win32.Point(Left, Top);
Win32.Size bitMapSize = new Win32.Size(bitmap.Width, bitmap.Height);
Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION();
Win32.Point srcLoc = new Win32.Point(, ); hBitmap = bitmap.GetHbitmap(Color.FromArgb());
oldBits = Win32.SelectObject(memDc, hBitmap); blendFunc.BlendOp = Win32.AC_SRC_OVER;
blendFunc.SourceConstantAlpha = ;
blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;
blendFunc.BlendFlags = ; Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, , ref blendFunc, Win32.ULW_ALPHA);
}
finally
{
if (hBitmap != IntPtr.Zero)
{
Win32.SelectObject(memDc, oldBits);
Win32.DeleteObject(hBitmap);
}
Win32.ReleaseDC(IntPtr.Zero, screenDC);
Win32.DeleteDC(memDc);
}
}
#endregion

然后是win32类

  class Win32
{
[StructLayout(LayoutKind.Sequential)]
public struct Size
{
public Int32 cx;
public Int32 cy; public Size(Int32 x, Int32 y)
{
cx = x;
cy = y;
}
} [StructLayout(LayoutKind.Sequential, Pack = )]
public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
} [StructLayout(LayoutKind.Sequential)]
public struct Point
{
public Int32 x;
public Int32 y; public Point(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
} public const byte AC_SRC_OVER = ;
public const Int32 ULW_ALPHA = ;
public const byte AC_SRC_ALPHA = ; [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("gdi32.dll", ExactSpelling = true)]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObj); [DllImport("user32.dll", ExactSpelling = true)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int DeleteDC(IntPtr hDC); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int DeleteObject(IntPtr hObj); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pptSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr ExtCreateRegion(IntPtr lpXform, uint nCount, IntPtr rgnData);
}

然后就是构造函数了,根据传入参数,画出图片并设置窗体

  #region 构造函数    English:Constructor
/// <summary>
/// 功能描述:构造函数 English:Constructor
/// 作  者:HZH
/// 创建日期:2019-08-29 15:27:51
/// 任务编号:
/// </summary>
/// <param name="rectControl">停靠区域</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
private FrmAnchorTips(
Rectangle rectControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
int fontSize = ,
int autoCloseTime = )
{
InitializeComponent();
Graphics g = this.CreateGraphics();
Font _font = new Font("微软雅黑", fontSize);
Color _background = background == null ? Color.FromArgb(, , ) : background.Value;
Color _foreColor = foreColor == null ? Color.White : foreColor.Value;
System.Drawing.SizeF sizeText = g.MeasureString(strMsg, _font);
g.Dispose();
var formSize = new Size((int)sizeText.Width + , (int)sizeText.Height + );
if (formSize.Width < )
formSize.Width = ;
if (formSize.Height < )
formSize.Height = ;
if (location == AnchorTipsLocation.LEFT || location == AnchorTipsLocation.RIGHT)
{
formSize.Width += ;
}
else
{
formSize.Height += ;
} #region 获取窗体path English:Get the form path
GraphicsPath path = new GraphicsPath();
Rectangle rect;
switch (location)
{
case AnchorTipsLocation.TOP:
rect = new Rectangle(, , formSize.Width - , formSize.Height - - );
this.Location = new Point(rectControl.X + (rectControl.Width - rect.Width) / , rectControl.Y - rect.Height - );
break;
case AnchorTipsLocation.RIGHT:
rect = new Rectangle(, , formSize.Width - - , formSize.Height - );
this.Location = new Point(rectControl.Right, rectControl.Y + (rectControl.Height - rect.Height) / );
break;
case AnchorTipsLocation.BOTTOM:
rect = new Rectangle(, , formSize.Width - , formSize.Height - - );
this.Location = new Point(rectControl.X + (rectControl.Width - rect.Width) / , rectControl.Bottom);
break;
default:
rect = new Rectangle(, , formSize.Width - - , formSize.Height - );
this.Location = new Point(rectControl.X - rect.Width - , rectControl.Y + (rectControl.Height - rect.Height) / );
break;
}
int cornerRadius = ; path.AddArc(rect.X, rect.Y, cornerRadius * , cornerRadius * , , );//左上角
#region 上边
if (location == AnchorTipsLocation.BOTTOM)
{
path.AddLine(rect.X + cornerRadius, rect.Y, rect.Left + rect.Width / - , rect.Y);//上
path.AddLine(rect.Left + rect.Width / - , rect.Y, rect.Left + rect.Width / , rect.Y - );//上
path.AddLine(rect.Left + rect.Width / , rect.Y - , rect.Left + rect.Width / + , rect.Y);//上
path.AddLine(rect.Left + rect.Width / + , rect.Y, rect.Right - cornerRadius * , rect.Y);//上
}
else
{
path.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * , rect.Y);//上
}
#endregion
path.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y, cornerRadius * , cornerRadius * , , );//右上角
#region 右边
if (location == AnchorTipsLocation.LEFT)
{
path.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height / - );//右
path.AddLine(rect.Right, rect.Y + rect.Height / - , rect.Right + , rect.Y + rect.Height / );//右
path.AddLine(rect.Right + , rect.Y + rect.Height / , rect.Right, rect.Y + rect.Height / + );//右
path.AddLine(rect.Right, rect.Y + rect.Height / + , rect.Right, rect.Y + rect.Height - cornerRadius * );//右
}
else
{
path.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height - cornerRadius * );//右
}
#endregion
path.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y + rect.Height - cornerRadius * , cornerRadius * , cornerRadius * , , );//右下角
#region 下边
if (location == AnchorTipsLocation.TOP)
{
path.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.Left + rect.Width / + , rect.Bottom);
path.AddLine(rect.Left + rect.Width / + , rect.Bottom, rect.Left + rect.Width / , rect.Bottom + );
path.AddLine(rect.Left + rect.Width / , rect.Bottom + , rect.Left + rect.Width / - , rect.Bottom);
path.AddLine(rect.Left + rect.Width / - , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
}
else
{
path.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
}
#endregion
path.AddArc(rect.X, rect.Bottom - cornerRadius * , cornerRadius * , cornerRadius * , , );//左下角
#region 左边
if (location == AnchorTipsLocation.RIGHT)
{
path.AddLine(rect.Left, rect.Y + cornerRadius * , rect.Left, rect.Y + rect.Height / - );//左
path.AddLine(rect.Left, rect.Y + rect.Height / - , rect.Left - , rect.Y + rect.Height / );//左
path.AddLine(rect.Left - , rect.Y + rect.Height / , rect.Left, rect.Y + rect.Height / + );//左
path.AddLine(rect.Left, rect.Y + rect.Height / + , rect.Left, rect.Y + rect.Height - cornerRadius * );//左
}
else
{
path.AddLine(rect.X, rect.Bottom - cornerRadius * , rect.X, rect.Y + cornerRadius * );//左
}
#endregion
path.CloseFigure();
#endregion Bitmap bit = new Bitmap(formSize.Width, formSize.Height);
this.Size = formSize; #region 画图 English:Drawing
Graphics gBit = Graphics.FromImage(bit);
gBit.SetGDIHigh();
gBit.FillPath(new SolidBrush(_background), path);
gBit.DrawString(strMsg, _font, new SolidBrush(_foreColor), rect.Location + new Size(, ));
gBit.Dispose();
#endregion SetBits(bit);
if (autoCloseTime > )
{
Timer t = new Timer();
t.Interval = autoCloseTime;
t.Tick += (a, b) =>
{
this.Close();
};
t.Enabled = true;
}
}
#endregion

再来2个静态函数以供调用

  #region 显示一个提示    English:Show a hint
/// <summary>
/// 功能描述:显示一个提示 English:Show a hint
/// 作  者:HZH
/// 创建日期:2019-08-29 15:28:58
/// 任务编号:
/// </summary>
/// <param name="parentControl">停靠控件</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="deviation">偏移量</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
public static FrmAnchorTips ShowTips(
Control parentControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
Size? deviation = null,
int fontSize = ,
int autoCloseTime = )
{
Point p;
if (parentControl is Form)
{
p = parentControl.Location;
}
else
{
p = parentControl.Parent.PointToScreen(parentControl.Location);
}
if (deviation != null)
{
p = p + deviation.Value;
}
return ShowTips(parentControl.FindForm(), new Rectangle(p, parentControl.Size), strMsg, location, background, foreColor, fontSize, autoCloseTime);
}
#endregion #region 显示一个提示 English:Show a hint
/// <summary>
/// 功能描述:显示一个提示 English:Show a hint
/// 作  者:HZH
/// 创建日期:2019-08-29 15:29:07
/// 任务编号:
/// </summary>
/// <param name="parentForm">父窗体</param>
/// <param name="rectControl">停靠区域</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
/// <returns>返回值</returns>
public static FrmAnchorTips ShowTips(
Form parentForm,
Rectangle rectControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
int fontSize = ,
int autoCloseTime = )
{
FrmAnchorTips frm = new FrmAnchorTips(rectControl, strMsg, location, background, foreColor, fontSize, autoCloseTime);
frm.TopMost = true;
frm.Show(parentForm);
return frm;
}
#endregion

全部代码

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms; namespace HZH_Controls.Forms
{
public partial class FrmAnchorTips : Form
{
bool haveHandle = false;
#region 构造函数 English:Constructor
/// <summary>
/// 功能描述:构造函数 English:Constructor
/// 作  者:HZH
/// 创建日期:2019-08-29 15:27:51
/// 任务编号:
/// </summary>
/// <param name="rectControl">停靠区域</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
private FrmAnchorTips(
Rectangle rectControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
int fontSize = ,
int autoCloseTime = )
{
InitializeComponent();
Graphics g = this.CreateGraphics();
Font _font = new Font("微软雅黑", fontSize);
Color _background = background == null ? Color.FromArgb(, , ) : background.Value;
Color _foreColor = foreColor == null ? Color.White : foreColor.Value;
System.Drawing.SizeF sizeText = g.MeasureString(strMsg, _font);
g.Dispose();
var formSize = new Size((int)sizeText.Width + , (int)sizeText.Height + );
if (formSize.Width < )
formSize.Width = ;
if (formSize.Height < )
formSize.Height = ;
if (location == AnchorTipsLocation.LEFT || location == AnchorTipsLocation.RIGHT)
{
formSize.Width += ;
}
else
{
formSize.Height += ;
} #region 获取窗体path English:Get the form path
GraphicsPath path = new GraphicsPath();
Rectangle rect;
switch (location)
{
case AnchorTipsLocation.TOP:
rect = new Rectangle(, , formSize.Width - , formSize.Height - - );
this.Location = new Point(rectControl.X + (rectControl.Width - rect.Width) / , rectControl.Y - rect.Height - );
break;
case AnchorTipsLocation.RIGHT:
rect = new Rectangle(, , formSize.Width - - , formSize.Height - );
this.Location = new Point(rectControl.Right, rectControl.Y + (rectControl.Height - rect.Height) / );
break;
case AnchorTipsLocation.BOTTOM:
rect = new Rectangle(, , formSize.Width - , formSize.Height - - );
this.Location = new Point(rectControl.X + (rectControl.Width - rect.Width) / , rectControl.Bottom);
break;
default:
rect = new Rectangle(, , formSize.Width - - , formSize.Height - );
this.Location = new Point(rectControl.X - rect.Width - , rectControl.Y + (rectControl.Height - rect.Height) / );
break;
}
int cornerRadius = ; path.AddArc(rect.X, rect.Y, cornerRadius * , cornerRadius * , , );//左上角
#region 上边
if (location == AnchorTipsLocation.BOTTOM)
{
path.AddLine(rect.X + cornerRadius, rect.Y, rect.Left + rect.Width / - , rect.Y);//上
path.AddLine(rect.Left + rect.Width / - , rect.Y, rect.Left + rect.Width / , rect.Y - );//上
path.AddLine(rect.Left + rect.Width / , rect.Y - , rect.Left + rect.Width / + , rect.Y);//上
path.AddLine(rect.Left + rect.Width / + , rect.Y, rect.Right - cornerRadius * , rect.Y);//上
}
else
{
path.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * , rect.Y);//上
}
#endregion
path.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y, cornerRadius * , cornerRadius * , , );//右上角
#region 右边
if (location == AnchorTipsLocation.LEFT)
{
path.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height / - );//右
path.AddLine(rect.Right, rect.Y + rect.Height / - , rect.Right + , rect.Y + rect.Height / );//右
path.AddLine(rect.Right + , rect.Y + rect.Height / , rect.Right, rect.Y + rect.Height / + );//右
path.AddLine(rect.Right, rect.Y + rect.Height / + , rect.Right, rect.Y + rect.Height - cornerRadius * );//右
}
else
{
path.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height - cornerRadius * );//右
}
#endregion
path.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y + rect.Height - cornerRadius * , cornerRadius * , cornerRadius * , , );//右下角
#region 下边
if (location == AnchorTipsLocation.TOP)
{
path.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.Left + rect.Width / + , rect.Bottom);
path.AddLine(rect.Left + rect.Width / + , rect.Bottom, rect.Left + rect.Width / , rect.Bottom + );
path.AddLine(rect.Left + rect.Width / , rect.Bottom + , rect.Left + rect.Width / - , rect.Bottom);
path.AddLine(rect.Left + rect.Width / - , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
}
else
{
path.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
}
#endregion
path.AddArc(rect.X, rect.Bottom - cornerRadius * , cornerRadius * , cornerRadius * , , );//左下角
#region 左边
if (location == AnchorTipsLocation.RIGHT)
{
path.AddLine(rect.Left, rect.Y + cornerRadius * , rect.Left, rect.Y + rect.Height / - );//左
path.AddLine(rect.Left, rect.Y + rect.Height / - , rect.Left - , rect.Y + rect.Height / );//左
path.AddLine(rect.Left - , rect.Y + rect.Height / , rect.Left, rect.Y + rect.Height / + );//左
path.AddLine(rect.Left, rect.Y + rect.Height / + , rect.Left, rect.Y + rect.Height - cornerRadius * );//左
}
else
{
path.AddLine(rect.X, rect.Bottom - cornerRadius * , rect.X, rect.Y + cornerRadius * );//左
}
#endregion
path.CloseFigure();
#endregion Bitmap bit = new Bitmap(formSize.Width, formSize.Height);
this.Size = formSize; #region 画图 English:Drawing
Graphics gBit = Graphics.FromImage(bit);
gBit.SetGDIHigh();
gBit.FillPath(new SolidBrush(_background), path);
gBit.DrawString(strMsg, _font, new SolidBrush(_foreColor), rect.Location + new Size(, ));
gBit.Dispose();
#endregion SetBits(bit);
if (autoCloseTime > )
{
Timer t = new Timer();
t.Interval = autoCloseTime;
t.Tick += (a, b) =>
{
this.Close();
};
t.Enabled = true;
}
}
#endregion #region 显示一个提示 English:Show a hint
/// <summary>
/// 功能描述:显示一个提示 English:Show a hint
/// 作  者:HZH
/// 创建日期:2019-08-29 15:28:58
/// 任务编号:
/// </summary>
/// <param name="parentControl">停靠控件</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="deviation">偏移量</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
public static FrmAnchorTips ShowTips(
Control parentControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
Size? deviation = null,
int fontSize = ,
int autoCloseTime = )
{
Point p;
if (parentControl is Form)
{
p = parentControl.Location;
}
else
{
p = parentControl.Parent.PointToScreen(parentControl.Location);
}
if (deviation != null)
{
p = p + deviation.Value;
}
return ShowTips(parentControl.FindForm(), new Rectangle(p, parentControl.Size), strMsg, location, background, foreColor, fontSize, autoCloseTime);
}
#endregion #region 显示一个提示 English:Show a hint
/// <summary>
/// 功能描述:显示一个提示 English:Show a hint
/// 作  者:HZH
/// 创建日期:2019-08-29 15:29:07
/// 任务编号:
/// </summary>
/// <param name="parentForm">父窗体</param>
/// <param name="rectControl">停靠区域</param>
/// <param name="strMsg">消息</param>
/// <param name="location">显示方位</param>
/// <param name="background">背景色</param>
/// <param name="foreColor">文字颜色</param>
/// <param name="fontSize">文字大小</param>
/// <param name="autoCloseTime">自动关闭时间,当<=0时不自动关闭</param>
/// <returns>返回值</returns>
public static FrmAnchorTips ShowTips(
Form parentForm,
Rectangle rectControl,
string strMsg,
AnchorTipsLocation location = AnchorTipsLocation.RIGHT,
Color? background = null,
Color? foreColor = null,
int fontSize = ,
int autoCloseTime = )
{
FrmAnchorTips frm = new FrmAnchorTips(rectControl, strMsg, location, background, foreColor, fontSize, autoCloseTime);
frm.TopMost = true;
frm.Show(parentForm);
return frm;
}
#endregion #region Override protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
base.OnClosing(e);
haveHandle = false;
this.Dispose();
} protected override void OnHandleCreated(EventArgs e)
{
InitializeStyles();
base.OnHandleCreated(e);
haveHandle = true;
} protected override CreateParams CreateParams
{
get
{
CreateParams cParms = base.CreateParams;
cParms.ExStyle |= 0x00080000; // WS_EX_LAYERED
return cParms;
}
} #endregion private void InitializeStyles()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
UpdateStyles();
} #region 根据图片显示窗体 English:Display Forms Based on Pictures
/// <summary>
/// 功能描述:根据图片显示窗体 English:Display Forms Based on Pictures
/// 作  者:HZH
/// 创建日期:2019-08-29 15:31:16
/// 任务编号:
/// </summary>
/// <param name="bitmap">bitmap</param>
private void SetBits(Bitmap bitmap)
{
if (!haveHandle) return; if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))
throw new ApplicationException("The picture must be 32bit picture with alpha channel."); IntPtr oldBits = IntPtr.Zero;
IntPtr screenDC = Win32.GetDC(IntPtr.Zero);
IntPtr hBitmap = IntPtr.Zero;
IntPtr memDc = Win32.CreateCompatibleDC(screenDC); try
{
Win32.Point topLoc = new Win32.Point(Left, Top);
Win32.Size bitMapSize = new Win32.Size(bitmap.Width, bitmap.Height);
Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION();
Win32.Point srcLoc = new Win32.Point(, ); hBitmap = bitmap.GetHbitmap(Color.FromArgb());
oldBits = Win32.SelectObject(memDc, hBitmap); blendFunc.BlendOp = Win32.AC_SRC_OVER;
blendFunc.SourceConstantAlpha = ;
blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;
blendFunc.BlendFlags = ; Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, , ref blendFunc, Win32.ULW_ALPHA);
}
finally
{
if (hBitmap != IntPtr.Zero)
{
Win32.SelectObject(memDc, oldBits);
Win32.DeleteObject(hBitmap);
}
Win32.ReleaseDC(IntPtr.Zero, screenDC);
Win32.DeleteDC(memDc);
}
}
#endregion
} public enum AnchorTipsLocation
{
LEFT,
TOP,
RIGHT,
BOTTOM
} class Win32
{
[StructLayout(LayoutKind.Sequential)]
public struct Size
{
public Int32 cx;
public Int32 cy; public Size(Int32 x, Int32 y)
{
cx = x;
cy = y;
}
} [StructLayout(LayoutKind.Sequential, Pack = )]
public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
} [StructLayout(LayoutKind.Sequential)]
public struct Point
{
public Int32 x;
public Int32 y; public Point(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
} public const byte AC_SRC_OVER = ;
public const Int32 ULW_ALPHA = ;
public const byte AC_SRC_ALPHA = ; [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("gdi32.dll", ExactSpelling = true)]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObj); [DllImport("user32.dll", ExactSpelling = true)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int DeleteDC(IntPtr hDC); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int DeleteObject(IntPtr hObj); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern int UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pptSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr ExtCreateRegion(IntPtr lpXform, uint nCount, IntPtr rgnData);
}
}
 namespace HZH_Controls.Forms
{
partial class FrmAnchorTips
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null; /// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} #region Windows Form Designer generated code /// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// FrmAnchorTips
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(, );
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "FrmAnchorTips";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "FrmAnchorTips";
this.ResumeLayout(false); } #endregion
}
}

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

(五十一)c#Winform自定义控件-文字提示-HZHControls的更多相关文章

  1. (二十一)c#Winform自定义控件-气泡提示

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  2. (三十五)c#Winform自定义控件-下拉框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. (二十五)c#Winform自定义控件-有确定取消的窗体(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  4. (四十五)c#Winform自定义控件-水波图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  5. (八十一)c#Winform自定义控件-时间轴-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  6. (六十五)c#Winform自定义控件-思维导图/组织架构图(工业)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  7. (八十)c#Winform自定义控件-分割线标签-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  8. (五)c#Winform自定义控件-复选框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. (十五)c#Winform自定义控件-键盘(二)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

随机推荐

  1. webpack打包出现WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. 错误

    打包运行的时候出现以下错误 WARNING in configurationThe 'mode' option has not been set, webpack will fallback to ' ...

  2. 【GZOI 2019】特技飞行

    Problem Description 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代表着水平位置,纵坐标代表着飞行高度. ...

  3. Winform项目常用配置方法

    在我们做项目的时候经常遇到需要动态配置系统的情况,比如说10台电脑装了同一个软件,需要识别唯一码,这时候我们会用到配置方法. 具体方法如下: 1) Config文件 里面增加你需要的变量,具体用法如下 ...

  4. java打字游戏-一款快速提升java程序员打字速度的游戏(附源码)

    一.效果如图: 源码地址:https://gitee.com/hoosson/TYPER 纯干货,别忘了留个赞哦!

  5. Nginx核心流程及模块介绍

    Nginx核心流程及模块介绍 1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 ...

  6. filezilla无法登陆ubuntu虚拟机

    一般情况下,是新安装的虚拟机没有安装ssh造成的 进入虚拟机控制台,输入 sudo apt-get openssh-server 回车 等安装完成即可登陆.

  7. Jmeter性能测试分布式技术

    一.什么是分布式测试 分布式测试是指通过局域网和Internet,把分布于不同地点.独立完成特定功能的测试计算机连接起来,以达到测试资源共享.分散操作.集中管理.协同工作.负载均衡.测试过程监控等目的 ...

  8. Python类中的self的作用

    Python编写类的时候,每个函数第一个参数都是self.后来对Python越来越熟悉,再回头看self的概念,慢慢就明白了. 谷歌上有一段解释很到位,贴出来给大家: self represents ...

  9. Postman文件上传

    1:请求Url 2:选择消息体 3:选择表单参数 4:填写参数KEY-VALUE,记得打钩 5:Send发送请求

  10. WebShell代码分析溯源(六)

    WebShell代码分析溯源 一.一句话变形马样本 <?php call_user_func('assert', $_REQUEST['assert']); ?> 二.代码分析 1.分析代 ...