知识大全 利用C#实现标注式消息提示窗口

Posted

篇首语:书到用时方恨少,事非经过不知难。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用C#实现标注式消息提示窗口相关的知识,希望对你有一定的参考价值。

利用C#实现标注式消息提示窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

近一段时间由于项目需要一直专注于UI方面的编程 为了更加友好的将提示信息呈现给用户 我们必须对标准的Windows消息提示窗口进行处理 我们大家在Windows XP下使用U盘 闪存等移动存储设备 当插上或拔下这些设备时任务栏区域都会显示一个淡黄色背景 且具有标注样式的提示窗口弹出来 这样的提示即友善又美观 那么这到底是怎么实现的呢?其实道理并不复杂 该标注式提示窗口本身就是一个不规则窗体 当显示时它会将标注窗口的箭头指向不同控件 如下图 一般情况下的标注式提示窗口屏幕边缘的标注式提示窗口  一 技术要点  就像本文开头所说的 标注式消息提示窗口 其实就是一个具有不规则外形的窗体 但却具备了更加复杂的属性和行为 标注的箭头会根据不同控件指向不同的位置 当需要标注的控件过于接近屏幕的边缘时 标注窗口还会自动调整显示位置以及箭头的长短和大小   我们为新创建的窗体取名为InfoWindow 在类的头部定义intArc和intArrowHeight两个私有变量 可以适当调整它们的值来微调提示窗口的位置和箭头的大小与位置   提示窗口的箭头位置无非具有左上 右上 左下和右下四个可能性 我们为此定义了枚举类型的变量ArrowLocation 根据提示窗口位于屏幕的不同位置 GetArrowLocation可以计算提示窗口的位置并且返回适当的ArrowLocation 定义如下 ……public enum ArrowLocation TopLeft  TopRight  BottomLeft  BottomRight  SetInfoWindowRegion函数非常重要 它在Form Load事件即装载和显示提示窗体时被调用 当计算出新的提示窗口的位置和箭头显示位置后 调用SetBounds将更新后的位置和大小应用到提示窗口 gPath是GraphicsPath类型的私有变量 它表示标注式窗口的不规则图形路径 该图行路径也是根据提示窗口的位置和箭头显示的位置来创建 gPath AddArc方法用来绘制提示窗口四个边角的弧度部分 和AddLine方法一起描绘出提示窗口包括箭头的轮廓 一切就绪后我们就用这个gPath对象传递给Region对象 当将这个Region对象赋给Form窗体的Region属性后 窗体就具备了标注式提示窗口样式的不规则外形了 部分代码如下 private void SetInfoWindowRegion() if (!this IsHandleCreated)  return;  System Drawing Size windowSize = this Size; Point[] ArrowPoints = new Point[ ]; Point topLeftPoint = Point Empty; Point bottomRightPoint = (Point)windowSize; switch (this GetArrowLocation)   case ArrowLocation TopLeft:   ……  case ArrowLocation TopRight:   ……  case ArrowLocation BottomLeft:   ……  case ArrowLocation BottomRight:   ……  …… …… if ((this GetArrowLocation == ArrowLocation TopLeft) ||(this GetArrowLocation == ArrowLocation TopRight))   gPath AddArc(topLeftPoint X rectY arcRadius arcDia arcDia );  gPath AddLine(topLeftPoint X rectY topLeftPoint X rectY );  gPath AddArc(topLeftPoint X topLeftPoint Y arcDia arcDia );  gPath AddLine(rectX topLeftPoint Y ArrowPoints[ ] X topLeftPoint Y);  gPath AddLines(ArrowPoints);  gPath AddLine(ArrowPoints[ ] X topLeftPoint Y rectX topLeftPoint Y);  gPath AddArc(rectX arcRadius topLeftPoint Y arcDia arcDia );  gPath AddLine(bottomRightPoint X rectY bottomRightPoint X rectY );  gPath AddArc(rectX arcRadius rectY arcRadius arcDia arcDia );  gPath AddLine(rectX bottomRightPoint Y rectX bottomRightPoint Y);  else   gPath AddLine(rectX topLeftPoint Y rectX topLeftPoint Y);  gPath AddArc(rectX arcRadius topLeftPoint Y arcDia arcDia );  gPath AddLine(bottomRightPoint X rectY bottomRightPoint X rectY );  gPath AddArc(rectX arcRadius rectY arcRadius arcDia arcDia );  gPath AddLine(rectX bottomRightPoint Y ArrowPoints[ ] X bottomRightPoint Y);  gPath AddLines(ArrowPoints);  gPath AddLine(ArrowPoints[ ] X bottomRightPoint Y rectX bottomRightPoint Y);  gPath AddArc(topLeftPoint X rectY arcRadius arcDia arcDia );  gPath AddLine(topLeftPoint X rectY topLeftPoint X rectY );  gPath AddArc(topLeftPoint X topLeftPoint Y arcDia arcDia );  gPath CloseFigure(); this Region = new Region(this gPath);

  ShowInfoWindow函数用来将提示窗口显示出来 该函数需要将提示窗口附着的控件和需要显示的文本传递过来 然后 AnchorPointFromControl根据控件的位置返回提示窗口的箭头应该显示的坐标 代码如下

public static Point AnchorPointFromControl(Control anchorControl) if (anchorControl == null) throw new ArgumentException();  Point controlLocation = anchorControl Location; System Drawing Size controlSize = anchorControl Size; if (anchorControl Parent != null)  controlLocation = anchorControl Parent PointToScreen(controlLocation); return controlLocation + new Size(controlSize Width / controlSize Height / );  PointToScreen表明将工作区点的位置映射成屏幕坐标统一进行计算 上述代码最后以行说明提示窗口的箭头显示在附着控件的中点   将提示窗口的背景颜色设置成Info 外观如下图   我们发现这样的外观有点别扭 没错!因为提示窗口缺少黑色边框!所以 还需要在窗体的OnPaint事件中添加代码 如下 protected override void OnPaint(PaintEventArgs e) Pen p = new Pen(Color Black ); e Graphics DrawPath(p gPath); base OnPaint(e); cha138/Article/program/net/201311/12745

相关参考

知识大全 利用C#实现任务栏通知窗口

利用C#实现任务栏通知窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为程序员在享受的同时

知识大全 C#中如何处理父窗口及其子窗口标题

C#中如何处理父窗口及其子窗口标题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果你用MFC

知识大全 C#窗口透明

C#窗口透明  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem;  usin

知识大全 QQ接收不到消息提示,只有提示声音

QQ接收不到消息提示,只有提示声音  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!QQ接收不到消息提示

知识大全 为什么我QQ发完信息窗口会自动关闭 在哪模式里看不到原先有的那个发送完消息关闭窗口的设置了怎么办

为什么我QQ发完信息窗口会自动关闭在哪模式里看不到原先有的那个发送完消息关闭窗口的设置了怎么办?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整

知识大全 C#操作消息队列的代码

C#操作消息队列的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这是一个关于C#操作消息队

知识大全 javascript弹出窗口问题总结

无提示刷新网页  大家有没有发现有些网页刷新的时候会弹出一个提示窗口点确定才会刷新而有的页面不会提示不弹出提示窗口直接就刷新了如果页面没有form则不会弹出提示窗口如果页面有form表单  a)<

知识大全 C#动态特性的更多消息

C#动态特性的更多消息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  MadsTersen给大家

知识大全 Swinghacks——把提示窗口放到glass中

Swinghacks——把提示窗口放到glass中  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 苹果6s微信新消息提示声音怎么去掉

苹果6s微信新消息提示声音怎么去掉?首先打开微信的【我】-【设置】选择【新消息通知】可以看到【接收新消息通知】,不管显示是否开启,都按照下面的方法查看是否打开声音:看到下面也有【声音】和【震动】,这个