423 lines
14 KiB
C#
423 lines
14 KiB
C#
namespace DevComponents.DotNetBar
|
|
{
|
|
using System;
|
|
using System.Windows.Forms;
|
|
using System.Drawing;
|
|
using System.Drawing.Text;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
/// <summary>
|
|
/// Summary description for Tooltip.
|
|
/// </summary>
|
|
[System.ComponentModel.ToolboxItem(false),System.ComponentModel.DesignTimeVisible(false)]
|
|
public class ToolTip : System.Windows.Forms.Control
|
|
{
|
|
const long WS_POPUP=0x80000000L;
|
|
const long WS_CLIPSIBLINGS=0x04000000L;
|
|
const long WS_CLIPCHILDREN=0x02000000L;
|
|
const long WS_EX_TOOLWINDOW=0x00000080L;
|
|
const long WS_EX_TOPMOST=0x00000008L;
|
|
|
|
// When set to true tooltip will be shown Immediately without delay
|
|
//static bool bShowToolTip;
|
|
|
|
private string m_ToolTip;
|
|
private TextMarkup.BodyElement m_TextMarkup = null;
|
|
private eDotNetBarStyle m_Style = eDotNetBarStyle.Office2003;
|
|
private PopupShadow m_DropShadow=null;
|
|
private bool m_AntiAlias = false;
|
|
/// <summary>
|
|
/// Gets or sets the rectangle of the control or item tooltip is displayed for.
|
|
/// </summary>
|
|
public Rectangle ReferenceRectangle = Rectangle.Empty;
|
|
|
|
public ToolTip()
|
|
{
|
|
m_ToolTip="";
|
|
this.SetStyle(ControlStyles.Selectable,false);
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
|
|
this.SetStyle(ControlStyles.Opaque,true);
|
|
this.SetStyle(ControlStyles.ResizeRedraw,true);
|
|
this.Font = SystemFonts.DefaultFont; // System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font;
|
|
this.BackColor=SystemColors.Control;
|
|
this.ForeColor=SystemColors.ControlText;
|
|
}
|
|
|
|
|
|
public new string Text
|
|
{
|
|
get
|
|
{
|
|
return m_ToolTip;
|
|
}
|
|
set
|
|
{
|
|
m_ToolTip=value;
|
|
if (MarkupEnabled && TextMarkup.MarkupParser.IsMarkup(ref m_ToolTip))
|
|
m_TextMarkup = TextMarkup.MarkupParser.Parse(m_ToolTip);
|
|
else
|
|
m_TextMarkup = null;
|
|
if (m_TextMarkup != null)
|
|
AntiAlias = true;
|
|
|
|
if (_TooltipShown)
|
|
{
|
|
UpdateSize();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static bool _MarkupEnabled = true;
|
|
/// <summary>
|
|
/// Gets or sets whether text-markup is enabled for the tooltips.
|
|
/// </summary>
|
|
public static bool MarkupEnabled
|
|
{
|
|
get { return _MarkupEnabled; }
|
|
set
|
|
{
|
|
_MarkupEnabled = value;
|
|
}
|
|
}
|
|
|
|
|
|
public bool AntiAlias
|
|
{
|
|
get { return m_AntiAlias; }
|
|
set { m_AntiAlias = value; }
|
|
}
|
|
private int _ColorDepth = -1;
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
// Get the Color of ToolTip text
|
|
Color textColor = SystemColors.InfoText;
|
|
Color backColor = SystemColors.Info;
|
|
Color backColor2=Color.Empty;
|
|
Color borderColor = ColorScheme.GetColor("767676");
|
|
|
|
if (_ColorDepth == -1)
|
|
{
|
|
_ColorDepth = Screen.FromControl(this).BitsPerPixel;
|
|
}
|
|
if (_ColorDepth < 8)
|
|
{
|
|
backColor = Color.White;
|
|
textColor = Color.Black;
|
|
}
|
|
else
|
|
{
|
|
if (StyleManager.IsMetro(m_Style))
|
|
{
|
|
DevComponents.DotNetBar.Metro.ColorTables.MetroColorTable metroColors = DevComponents.DotNetBar.Metro.Rendering.MetroRender.GetColorTable();
|
|
backColor = metroColors.CanvasColor;
|
|
textColor = metroColors.ForeColor;
|
|
}
|
|
else if (BarFunctions.IsOffice2007Style(m_Style) && this.BackColor == SystemColors.Control)
|
|
{
|
|
backColor = ColorScheme.GetColor("FFFFFF");
|
|
backColor2 = ColorScheme.GetColor("E4E4F0");
|
|
textColor = ColorScheme.GetColor("4C4C4C");
|
|
}
|
|
else
|
|
{
|
|
textColor = GetToolTipColor();
|
|
if (this.BackColor != SystemColors.Control)
|
|
backColor = this.BackColor;
|
|
}
|
|
}
|
|
|
|
Graphics g=e.Graphics;
|
|
Rectangle r=this.ClientRectangle;
|
|
|
|
if (m_AntiAlias)
|
|
{
|
|
g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
|
|
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
|
}
|
|
|
|
SmoothingMode sm = g.SmoothingMode;
|
|
g.SmoothingMode = SmoothingMode.None;
|
|
if (BarFunctions.IsOffice2007Style(m_Style))
|
|
{
|
|
DisplayHelp.DrawRectangle(g, borderColor, r);
|
|
}
|
|
else
|
|
{
|
|
System.Windows.Forms.ControlPaint.DrawBorder3D(g, r, System.Windows.Forms.Border3DStyle.Raised, System.Windows.Forms.Border3DSide.All);
|
|
}
|
|
|
|
r.Inflate(-1,-1);
|
|
if (backColor2.IsEmpty)
|
|
DisplayHelp.FillRectangle(g, r, backColor);
|
|
else
|
|
DisplayHelp.FillRectangle(g, r, backColor, backColor2);
|
|
|
|
r.Offset(1,0);
|
|
|
|
g.SmoothingMode = sm;
|
|
|
|
if (m_TextMarkup == null)
|
|
TextDrawing.DrawString(g, GetDrawText(), this.Font, textColor, r, GetStringFormat());
|
|
else
|
|
{
|
|
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, textColor, (this.RightToLeft == RightToLeft.Yes), e.ClipRectangle, true);
|
|
m_TextMarkup.Bounds = new Rectangle(r.Location, m_TextMarkup.Bounds.Size);
|
|
m_TextMarkup.Render(d);
|
|
}
|
|
}
|
|
|
|
private void UpdateSize()
|
|
{
|
|
// Calculate Size of the window
|
|
using (Graphics g = this.CreateGraphics())
|
|
{
|
|
if (m_AntiAlias)
|
|
{
|
|
g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
|
|
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
|
}
|
|
Size size = GetTooltipSize(g);
|
|
this.Size = size;
|
|
g.SmoothingMode = SmoothingMode.Default;
|
|
g.TextRenderingHint = TextRenderingHint.SystemDefault;
|
|
}
|
|
|
|
if (!_FixedLocation.IsEmpty)
|
|
this.Location = _FixedLocation;
|
|
|
|
this.Invalidate();
|
|
|
|
Rectangle r = this.Bounds;
|
|
if (m_DropShadow != null)
|
|
{
|
|
NativeFunctions.SetWindowPos(m_DropShadow.Handle, this.Handle, r.Left + 5, r.Top + 5, r.Width - 2, r.Height - 2, NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
|
|
m_DropShadow.UpdateShadow();
|
|
}
|
|
}
|
|
|
|
private bool _TooltipShown = false;
|
|
private Size GetTooltipSize(Graphics g)
|
|
{
|
|
Size sz = Size.Empty;
|
|
if (m_TextMarkup == null)
|
|
sz = TextDrawing.MeasureString(g, GetDrawText(), this.Font, Screen.PrimaryScreen.WorkingArea.Size, GetStringFormat());
|
|
else
|
|
{
|
|
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
|
|
m_TextMarkup.Measure(Screen.PrimaryScreen.WorkingArea.Size, d);
|
|
sz = m_TextMarkup.Bounds.Size;
|
|
m_TextMarkup.Arrange(new Rectangle(Point.Empty, sz), d);
|
|
}
|
|
sz.Width += Dpi.Width4;
|
|
sz.Height += Dpi.Height4;
|
|
return sz;
|
|
}
|
|
public void ShowToolTip()
|
|
{
|
|
if (!this.IsHandleCreated)
|
|
this.CreateControl();
|
|
|
|
|
|
// Calculate Size of the window
|
|
Graphics g=this.CreateGraphics();
|
|
|
|
if (m_AntiAlias)
|
|
{
|
|
g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint;
|
|
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
|
}
|
|
Size sz = Size.Empty;
|
|
try
|
|
{
|
|
g.PageUnit = GraphicsUnit.Pixel;
|
|
sz = GetTooltipSize(g);
|
|
//if (m_TextMarkup == null)
|
|
// sz = TextDrawing.MeasureString(g, GetDrawText(), this.Font, Screen.PrimaryScreen.WorkingArea.Size, GetStringFormat());
|
|
//else
|
|
//{
|
|
// TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, this.Font, SystemColors.Control, (this.RightToLeft == RightToLeft.Yes));
|
|
// m_TextMarkup.Measure(Screen.PrimaryScreen.WorkingArea.Size, d);
|
|
// sz = m_TextMarkup.Bounds.Size;
|
|
// m_TextMarkup.Arrange(new Rectangle(Point.Empty, sz), d);
|
|
//}
|
|
}
|
|
finally
|
|
{
|
|
g.SmoothingMode = SmoothingMode.Default;
|
|
g.TextRenderingHint = TextRenderingHint.SystemDefault;
|
|
g.Dispose();
|
|
}
|
|
g=null;
|
|
|
|
Point mousePosition=System.Windows.Forms.Control.MousePosition;
|
|
Rectangle r=new Rectangle(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y,(int)sz.Width,(int)sz.Height);
|
|
//r.Inflate(2,2);
|
|
r.Offset(12,24);
|
|
|
|
ScreenInformation screen=BarFunctions.ScreenFromPoint(mousePosition);
|
|
if(screen!=null)
|
|
{
|
|
System.Drawing.Size layoutArea=screen.WorkingArea.Size;
|
|
layoutArea.Width-=(int)(layoutArea.Width*.2f);
|
|
|
|
if (r.Right > screen.WorkingArea.Right)
|
|
{
|
|
r.X = r.Left - (r.Right - screen.WorkingArea.Right);
|
|
}
|
|
|
|
if (r.Bottom > screen.Bounds.Bottom)
|
|
{
|
|
if (ReferenceRectangle.IsEmpty)
|
|
r.Y = mousePosition.Y - r.Height;
|
|
else
|
|
{
|
|
r.Y = ReferenceRectangle.Y - r.Height - 1;
|
|
}
|
|
}
|
|
|
|
if(r.Contains(System.Windows.Forms.Control.MousePosition.X,System.Windows.Forms.Control.MousePosition.Y))
|
|
{
|
|
// We have to move it out of mouse position
|
|
if (r.Height + System.Windows.Forms.Control.MousePosition.Y + 1 <= screen.WorkingArea.Height && (ReferenceRectangle.IsEmpty || !ReferenceRectangle.IntersectsWith(new Rectangle(r.X, System.Windows.Forms.Control.MousePosition.Y + 1, r.Width, r.Height))))
|
|
r.Y=System.Windows.Forms.Control.MousePosition.Y+1;
|
|
else
|
|
r.Y=System.Windows.Forms.Control.MousePosition.Y-r.Height-1;
|
|
}
|
|
}
|
|
|
|
if (!_FixedLocation.IsEmpty)
|
|
r.Location = _FixedLocation;
|
|
|
|
this.Location=r.Location;
|
|
this.ClientSize=r.Size;
|
|
|
|
if(NativeFunctions.ShowDropShadow && this.ShowDropShadow)
|
|
{
|
|
if(m_DropShadow==null)
|
|
{
|
|
m_DropShadow=new PopupShadow(NativeFunctions.AlphaBlendingSupported);
|
|
m_DropShadow.CreateControl();
|
|
}
|
|
//m_DropShadow.Location=new Point(r.Left+4,r.Top+4);
|
|
//m_DropShadow.Size=r.Size;
|
|
// TODO: Bug Cannot set size and location correctly using the Size and Location because Form caption is hidden
|
|
m_DropShadow.Hide();
|
|
}
|
|
NativeFunctions.SetWindowPos(this.Handle,new IntPtr(NativeFunctions.HWND_TOP),0,0,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOSIZE | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE);
|
|
if(m_DropShadow!=null)
|
|
{
|
|
NativeFunctions.SetWindowPos(m_DropShadow.Handle,this.Handle,r.Left+5,r.Top+5,r.Width-2,r.Height-2,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE);
|
|
m_DropShadow.UpdateShadow();
|
|
}
|
|
_TooltipShown = true;
|
|
}
|
|
|
|
private string GetDrawText()
|
|
{
|
|
string s = m_ToolTip.Replace(@"\\n", "{spec_nl}");
|
|
s = s.Replace(@"\n", Environment.NewLine);
|
|
return s.Replace("{spec_nl}",@"\n");
|
|
}
|
|
|
|
private eTextFormat GetStringFormat()
|
|
{
|
|
eTextFormat format = eTextFormat.Default | eTextFormat.WordBreak | eTextFormat.VerticalCenter;
|
|
return format;
|
|
}
|
|
|
|
private Color GetToolTipColor()
|
|
{
|
|
if(this.ForeColor!=SystemColors.ControlText)
|
|
return this.ForeColor;
|
|
|
|
Color clrRet=SystemColors.WindowText;
|
|
|
|
try
|
|
{
|
|
Microsoft.Win32.RegistryKey objReg=Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel\\Colors\\",false);
|
|
string sColor=objReg.GetValue("InfoText").ToString();
|
|
objReg.Close();
|
|
objReg=null;
|
|
|
|
if(sColor==null || sColor=="")
|
|
return clrRet;
|
|
|
|
Char [] separator = {' '};
|
|
string[] sArr=sColor.Split(separator,3);
|
|
if(sArr.GetUpperBound(0)==2)
|
|
clrRet=Color.FromArgb(System.Convert.ToInt16(sArr[0]),System.Convert.ToInt16(sArr[1]),System.Convert.ToInt16(sArr[2]));
|
|
}
|
|
catch(Exception)
|
|
{
|
|
}
|
|
|
|
return clrRet;
|
|
}
|
|
|
|
protected override void OnLocationChanged(EventArgs e)
|
|
{
|
|
base.OnLocationChanged(e);
|
|
if(m_DropShadow!=null)
|
|
{
|
|
NativeFunctions.SetWindowPos(m_DropShadow.Handle,new IntPtr(NativeFunctions.HWND_TOP),this.Left+5,this.Top+5,0,0,NativeFunctions.SWP_SHOWWINDOW | NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOSIZE);
|
|
}
|
|
}
|
|
|
|
private Point _FixedLocation = Point.Empty;
|
|
/// <summary>
|
|
/// Specifies fixed location for tooltip window.
|
|
/// </summary>
|
|
public Point FixedLocation
|
|
{
|
|
get { return _FixedLocation; }
|
|
set { _FixedLocation = value; }
|
|
}
|
|
|
|
protected override CreateParams CreateParams
|
|
{
|
|
get
|
|
{
|
|
CreateParams p=base.CreateParams;
|
|
p.Style=unchecked((int)(WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
|
|
p.ExStyle=(int)(WS_EX_TOOLWINDOW | WS_EX_TOPMOST);
|
|
p.Caption="";
|
|
return p;
|
|
}
|
|
}
|
|
|
|
protected override void OnVisibleChanged(EventArgs e)
|
|
{
|
|
if(!this.Visible && m_DropShadow!=null)
|
|
{
|
|
m_DropShadow.Hide();
|
|
m_DropShadow.Dispose();
|
|
m_DropShadow=null;
|
|
}
|
|
base.OnVisibleChanged(e);
|
|
}
|
|
|
|
public eDotNetBarStyle Style
|
|
{
|
|
get { return m_Style; }
|
|
set
|
|
{
|
|
m_Style = value;
|
|
if (BarFunctions.IsOffice2007Style(m_Style))
|
|
this.AntiAlias = true;
|
|
}
|
|
}
|
|
|
|
private bool _ShowDropShadow = true;
|
|
public bool ShowDropShadow
|
|
{
|
|
get { return _ShowDropShadow; }
|
|
set
|
|
{
|
|
_ShowDropShadow = value;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|