实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Runtime.InteropServices; namespace CustomUIControls { public class TaskbarNotifier : System.Windows.Forms.Form { #region TaskbarNotifier Protected Members protected Bitmap BackgroundBitmap = null; protected Bitmap CloseBitmap = null; protected Point CloseBitmapLocation; protected Size CloseBitmapSize; protected Rectangle RealTitleRectangle; protected Rectangle RealContentRectangle; protected Rectangle WorkAreaRectangle; protected Timer timer = new Timer(); protected TaskbarStates taskbarState = TaskbarStates.hidden; protected string titleText; protected string contentText; protected Color normalTitleColor = Color.FromArgb(255,0,0); protected Color hoverTitleColor = Color.FromArgb(255,0,0); protected Color normalContentColor = Color.FromArgb(0,0,0); protected Color hoverContentColor = Color.FromArgb(0,0,0x66); protected Font normalTitleFont = new Font("Arial",12,FontStyle.Regular,GraphicsUnit.Pixel); protected Font hoverTitleFont = new Font("Arial",12,FontStyle.Bold,GraphicsUnit.Pixel); protected Font normalContentFont = new Font("Arial",11,FontStyle.Regular,GraphicsUnit.Pixel); protected Font hoverContentFont = new Font("Arial",11,FontStyle.Regular,GraphicsUnit.Pixel); protected int nShowEvents; protected int nHideEvents; protected int nVisibleEvents; protected int nIncrementShow; protected int nIncrementHide; protected bool bIsMouseOverPopup = false; protected bool bIsMouseOverClose = false; protected bool bIsMouseOverContent = false; protected bool bIsMouseOverTitle = false; protected bool bIsMouseDown = false; protected bool bKeepVisibleOnMouseOver = true; protected bool bReShowOnMouseOver = false; #endregion #region TaskbarNotifier Public Members public Rectangle TitleRectangle; public Rectangle ContentRectangle; public bool TitleClickable = false; public bool ContentClickable = true; public bool CloseClickable = true; public bool EnableSelectionRectangle = true; public event EventHandler CloseClick = null; public event EventHandler TitleClick = null; public event EventHandler ContentClick = null; #endregion #region TaskbarNotifier Enums public enum TaskbarStates { hidden = 0, appearing = 1, visible = 2, disappearing = 3 } #endregion #region TaskbarNotifier Constructor public TaskbarNotifier() { FormBorderStyle = FormBorderStyle.None; WindowState = FormWindowState.Minimized; base.Show(); base.Hide(); WindowState = FormWindowState.Normal; ShowInTaskbar = false; TopMost = true; MaximizeBox = false; MinimizeBox = false; ControlBox = false; timer.Enabled = true; timer.Tick = new EventHandler(OnTimer); } #endregion #region TaskbarNotifier Properties public TaskbarStates TaskbarState { get { return taskbarState; } } public string TitleText { get { return titleText; } set { titleText=value; Refresh(); } } public string ContentText { get { return contentText; } set { contentText=value; Refresh(); } } public Color NormalTitleColor { get { return normalTitleColor; } set { normalTitleColor = value; Refresh(); } } public Color HoverTitleColor { get { return hoverTitleColor; } set { hoverTitleColor = value; Refresh(); } } public Color NormalContentColor { get { return normalContentColor; } set { normalContentColor = value; Refresh(); } } public Color HoverContentColor { get { return hoverContentColor; } set { hoverContentColor = value; Refresh(); } } public Font NormalTitleFont { get { return normalTitleFont; } set { normalTitleFont = value; Refresh(); } } public Font HoverTitleFont { get { return hoverTitleFont; } set { hoverTitleFont = value; Refresh(); } } public Font NormalContentFont { get { return normalContentFont; } set { normalContentFont = value; Refresh(); } } public Font HoverContentFont { get { return hoverContentFont; } set { hoverContentFont = value; Refresh(); } } public bool KeepVisibleOnMousOver { get { return bKeepVisibleOnMouseOver; } set { bKeepVisibleOnMouseOver=value; } } public bool ReShowOnMouseOver { get { return bReShowOnMouseOver; } set { bReShowOnMouseOver=value; } } #endregion #region TaskbarNotifier Public Methods [DllImport("user32.dll")] private static extern Boolean ShowWindow(IntPtr hWnd,Int32 nCmdShow); public void Show(string strTitle, string strContent, int nTimeToShow, int nTimeToStay, int nTimeToHide) { WorkAreaRectangle = Screen.GetWorkingArea(WorkAreaRectangle); titleText = strTitle; contentText = strContent; nVisibleEvents = nTimeToStay; CalculateMouseRectangles(); int nEvents; if (nTimeToShow > 10) { nEvents = Math.Min((nTimeToShow / 10), BackgroundBitmap.Height); nShowEvents = nTimeToShow / nEvents; nIncrementShow = BackgroundBitmap.Height / nEvents; } else { nShowEvents = 10; nIncrementShow = BackgroundBitmap.Height; } if( nTimeToHide > 10) { nEvents = Math.Min((nTimeToHide / 10), BackgroundBitmap.Height); nHideEvents = nTimeToHide / nEvents; nIncrementHide = BackgroundBitmap.Height / nEvents; } else { nHideEvents = 10; nIncrementHide = BackgroundBitmap.Height; } switch (taskbarState) { case TaskbarStates.hidden: taskbarState = TaskbarStates.appearing; SetBounds(WorkAreaRectangle.Right-BackgroundBitmap.Width-17, WorkAreaRectangle.Bottom-1, BackgroundBitmap.Width, 0); timer.Interval = nShowEvents; timer.Start(); ShowWindow(this.Handle, 4); break; case TaskbarStates.appearing: Refresh(); break; case TaskbarStates.visible: timer.Stop(); timer.Interval = nVisibleEvents; timer.Start(); Refresh(); break; case TaskbarStates.disappearing: timer.Stop(); taskbarState = TaskbarStates.visible; SetBounds(WorkAreaRectangle.Right-BackgroundBitmap.Width-17, WorkAreaRectangle.Bottom-BackgroundBitmap.Height-1, BackgroundBitmap.Width, BackgroundBitmap.Height); timer.Interval = nVisibleEvents; timer.Start(); Refresh(); break; } } public new void Hide() { if (taskbarState != TaskbarStates.hidden) { timer.Stop(); taskbarState = TaskbarStates.hidden; base.Hide(); } } public void SetBackgroundBitmap(string strFilename, Color transparencyColor) { BackgroundBitmap = new Bitmap(strFilename); Width = BackgroundBitmap.Width; Height = BackgroundBitmap.Height; Region = BitmapToRegion(BackgroundBitmap, transparencyColor); } public void SetBackgroundBitmap(Image image, Color transparencyColor) { BackgroundBitmap = new Bitmap(image); Width = BackgroundBitmap.Width; Height = BackgroundBitmap.Height; Region = BitmapToRegion(BackgroundBitmap, transparencyColor); } public void SetCloseBitmap(string strFilename, Color transparencyColor, Point position) { CloseBitmap = new Bitmap(strFilename); CloseBitmap.MakeTransparent(transparencyColor); CloseBitmapSize = new Size(CloseBitmap.Width/3, CloseBitmap.Height); CloseBitmapLocation = position; } public void SetCloseBitmap(Image image, Color transparencyColor, Point position) { CloseBitmap = new Bitmap(image); CloseBitmap.MakeTransparent(transparencyColor); CloseBitmapSize = new Size(CloseBitmap.Width/3, CloseBitmap.Height); CloseBitmapLocation = position; } #endregion #region TaskbarNotifier Protected Methods protected void DrawCloseButton(Graphics grfx) { if (CloseBitmap != null) { Rectangle rectDest = new Rectangle(CloseBitmapLocation, CloseBitmapSize); Rectangle rectSrc; if (bIsMouseOverClose) { if (bIsMouseDown) rectSrc = new Rectangle(new Point(CloseBitmapSize.Width*2, 0), CloseBitmapSize); else rectSrc = new Rectangle(new Point(CloseBitmapSize.Width, 0), CloseBitmapSize); } else rectSrc = new Rectangle(new Point(0, 0), CloseBitmapSize); grfx.DrawImage(CloseBitmap, rectDest, rectSrc, GraphicsUnit.Pixel); } } protected void DrawText(Graphics grfx) { if (titleText != null && titleText.Length != 0) { StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.NoWrap; sf.Trimming = StringTrimming.EllipsisCharacter; if (bIsMouseOverTitle) grfx.DrawString(titleText, hoverTitleFont, new SolidBrush(hoverTitleColor), TitleRectangle, sf); else grfx.DrawString(titleText, normalTitleFont, new SolidBrush(normalTitleColor), TitleRectangle, sf); } if (contentText != null && contentText.Length != 0) { StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; sf.Trimming = StringTrimming.Word; if (bIsMouseOverContent) { grfx.DrawString(contentText, hoverContentFont, new SolidBrush(hoverContentColor), ContentRectangle, sf); if (EnableSelectionRectangle) ControlPaint.DrawBorder3D(grfx, RealContentRectangle, Border3DStyle.Etched, Border3DSide.Top | Border3DSide.Bottom | Border3DSide.Left | Border3DSide.Right); } else grfx.DrawString(contentText, normalContentFont, new SolidBrush(normalContentColor), ContentRectangle, sf); } } protected void CalculateMouseRectangles() { Graphics grfx = CreateGraphics(); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; SizeF sizefTitle = grfx.MeasureString(titleText, hoverTitleFont, TitleRectangle.Width, sf); SizeF sizefContent = grfx.MeasureString(contentText, hoverContentFont, ContentRectangle.Width, sf); grfx.Dispose(); if (sizefTitle.Height > TitleRectangle.Height) { RealTitleRectangle = new Rectangle(TitleRectangle.Left, TitleRectangle.Top, TitleRectangle.Width , TitleRectangle.Height ); } else { RealTitleRectangle = new Rectangle(TitleRectangle.Left, TitleRectangle.Top, (int)sizefTitle.Width, (int)sizefTitle.Height); } RealTitleRectangle.Inflate(0,2); if (sizefContent.Height > ContentRectangle.Height) { RealContentRectangle = new Rectangle((ContentRectangle.Width-(int)sizefContent.Width)/2 ContentRectangle.Left, ContentRectangle.Top, (int)sizefContent.Width, ContentRectangle.Height ); } else { RealContentRectangle = new Rectangle((ContentRectangle.Width-(int)sizefContent.Width)/2 ContentRectangle.Left, (ContentRectangle.Height-(int)sizefContent.Height)/2 ContentRectangle.Top, (int)sizefContent.Width, (int)sizefContent.Height); } RealContentRectangle.Inflate(0,2); } protected Region BitmapToRegion(Bitmap bitmap, Color transparencyColor) { if (bitmap == null) throw new ArgumentNullException("Bitmap", "Bitmap cannot be null!"); int height = bitmap.Height; int width = bitmap.Width; GraphicsPath path = new GraphicsPath(); for (int j=0; j<height; j ) for (int i=0; i<width; i ) { if (bitmap.GetPixel(i, j) == transparencyColor) continue; int x0 = i; while ((i < width) && (bitmap.GetPixel(i, j) != transparencyColor)) i ; path.AddRectangle(new Rectangle(x0, j, i-x0, 1)); } Region region = new Region(path); path.Dispose(); return region; } #endregion #region TaskbarNotifier Events Overrides protected void OnTimer(Object obj, EventArgs ea) { switch (taskbarState) { case TaskbarStates.appearing: if (Height < BackgroundBitmap.Height) SetBounds(Left, Top-nIncrementShow ,Width, Height nIncrementShow); else { timer.Stop(); Height = BackgroundBitmap.Height; timer.Interval = nVisibleEvents; taskbarState = TaskbarStates.visible; timer.Start(); } break; case TaskbarStates.visible: timer.Stop(); timer.Interval = nHideEvents; if ((bKeepVisibleOnMouseOver && !bIsMouseOverPopup ) || (!bKeepVisibleOnMouseOver)) { taskbarState = TaskbarStates.disappearing; } timer.Start(); break; case TaskbarStates.disappearing: if (bReShowOnMouseOver && bIsMouseOverPopup) { taskbarState = TaskbarStates.appearing; } else { if (Top < WorkAreaRectangle.Bottom) SetBounds(Left, Top nIncrementHide, Width, Height - nIncrementHide); else Hide(); } break; } } protected override void OnMouseEnter(EventArgs ea) { base.OnMouseEnter(ea); bIsMouseOverPopup = true; Refresh(); } protected override void OnMouseLeave(EventArgs ea) { base.OnMouseLeave(ea); bIsMouseOverPopup = false; bIsMouseOverClose = false; bIsMouseOverTitle = false; bIsMouseOverContent = false; Refresh(); } protected override void OnMouseMove(MouseEventArgs mea) { base.OnMouseMove(mea); bool bContentModified = false; if ( (mea.X > CloseBitmapLocation.X) && (mea.X < CloseBitmapLocation.X CloseBitmapSize.Width) && (mea.Y > CloseBitmapLocation.Y) && (mea.Y < CloseBitmapLocation.Y CloseBitmapSize.Height) && CloseClickable ) { if (!bIsMouseOverClose) { bIsMouseOverClose = true; bIsMouseOverTitle = false; bIsMouseOverContent = false; Cursor = Cursors.Hand; bContentModified = true; } } else if (RealContentRectangle.Contains(new Point(mea.X, mea.Y)) && ContentClickable) { if (!bIsMouseOverContent) { bIsMouseOverClose = false; bIsMouseOverTitle = false; bIsMouseOverContent = true; Cursor = Cursors.Hand; bContentModified = true; } } else if (RealTitleRectangle.Contains(new Point(mea.X, mea.Y)) && TitleClickable) { if (!bIsMouseOverTitle) { bIsMouseOverClose = false; bIsMouseOverTitle = true; bIsMouseOverContent = false; Cursor = Cursors.Hand; bContentModified = true; } } else { if (bIsMouseOverClose || bIsMouseOverTitle || bIsMouseOverContent) bContentModified = true; bIsMouseOverClose = false; bIsMouseOverTitle = false; bIsMouseOverContent = false; Cursor = Cursors.Default; } if (bContentModified) Refresh(); } protected override void OnMouseDown(MouseEventArgs mea) { base.OnMouseDown(mea); bIsMouseDown = true; if (bIsMouseOverClose) Refresh(); } protected override void OnMouseUp(MouseEventArgs mea) { base.OnMouseUp(mea); bIsMouseDown = false; if (bIsMouseOverClose) { Hide(); if (CloseClick != null) CloseClick(this, new EventArgs()); } else if (bIsMouseOverTitle) { if (TitleClick != null) TitleClick(this, new EventArgs()); } else if (bIsMouseOverContent) { if (ContentClick != null) ContentClick(this, new EventArgs()); } } protected override void OnPaintBackground(PaintEventArgs pea) { Graphics grfx = pea.Graphics; grfx.PageUnit = GraphicsUnit.Pixel; Graphics offScreenGraphics; Bitmap offscreenBitmap; offscreenBitmap = new Bitmap(BackgroundBitmap.Width, BackgroundBitmap.Height); offScreenGraphics = Graphics.FromImage(offscreenBitmap); if (BackgroundBitmap != null) { offScreenGraphics.DrawImage(BackgroundBitmap, 0, 0, BackgroundBitmap.Width, BackgroundBitmap.Height); } DrawCloseButton(offScreenGraphics); DrawText(offScreenGraphics); grfx.DrawImage(offscreenBitmap, 0, 0); } #endregion private void InitializeComponent() { // // TaskbarNotifier // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(292, 273); this.Name = "TaskbarNotifier"; this.Load = new System.EventHandler(this.TaskbarNotifier_Load); } private void TaskbarNotifier_Load(object sender, System.EventArgs e) { } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论