• 【C#】组件发布:MessageTip,轻快型消息提示窗


    -------------201610212046更新-------------

    更新至2.0版,基本完全重写,重点:

    • 改为基于原生LayeredWindow窗体和UpdateLayeredWindow API呈现动画,完全摒弃.net Form,这种消息框用前者再适合不过,后者对于这种场景过于臃肿了
    • 更高更快更强,更酷更炫更拉轰
    • 可自由定制若干消息窗样式。1.0版似乎只能换个图标而已

    项目已更新至开源仓库,有需要请自取。看图:

    -------------201608301610更新-------------

    根据几位猿友在评论中反馈的问题和建议做了更新,主要内容:

    • ShowXX的时候如果不指定point参数,则根据活动控件来确定显示位置,如果活动控件是文本输入类控件,则根据光标位置来确定
    • 如果指定了point参数,则直接根据该point来确定
    • 另外增加了一组ShowXX重载,接受Control和ToolStripItem(工具栏按钮等,下称item)对象,完了根据该对象来确定显示位置。这里要注意,item是无焦点的,所以在MessageTip中无法得知点击的是item,也就无法做到自动在item附近显示,所以这里有个最佳实践:就是如果想在item附近显示,那就需要使用上述重载,把item传进去;其余情况都可以让MessageTip自动判断显示位置
    • 显示位置太靠屏幕顶部时,改在基准点下方显示,并且动画由上浮改为下降
    • 多屏环境下的定位错误问题,目前是将消息框限定在基准点所在屏幕内显示
    • 对于有位猿友提到的偶发异常,由于在我的环境始终无法重现,所以只能猜测是在Load事件和OnPaint中同时争用TipIcon所致,暂且给TipIcon的getter加独占特性,希望能解决

    原文和网盘demo我就不更新了,项目已开源到如下几处,有兴趣的朋友请关注,欢迎fork/push/pull:

    -------------原文-------------

    注:本组件适用于.net2.0+的winform项目

    样子:

    实际效果比这gif顺滑,建议下载文末的Tester体验

    介绍:

    如图所见,这种提示在网页、手机上用的较多,相比正经的消息框(如MessageBox),我认为好处有:

    • 不需要用户对消息本身做出响应,点啥【确定】什么的
    • 不阻塞、不干预用户的后续操作,就是单纯告诉你一声完事了
    • 视觉上通过动画效果保证消息的送达性,弥补因无干预可能造成的“被无视”

    这就是我所谓的【轻快型消息提示窗】,适用于:

    • 能快速出结果的操作,比如在本地库跑个小语句啥的。如果是耗时操作,显然弄个进度提示更合适,比如这个
    • 只需要反馈小量信息的情形,通常不应超过15字。如果需要反馈大量信息,可以尝试这个

    特点:

    • 在鼠标附近显示消息。所以不适合耗时任务,因为等任务执行完,鼠标都不知跑哪里去了
    • 内置3种消息性质的图标,,亦可使用自定义图标(使用Show方法)
    • 上浮动画效果可开闭(属性AllowFloating,影响后续弹出的消息窗)
    • 可以只显示图标或文本,甚至图标文本全无也行~虽然这样没意思

    用法:

    //开闭上浮动画。默认开启
    MessageTip.AllowFloating = true|false;
    
    //默认停留时长(毫秒)。当ShowXXX中指定负值delay时,使用该值,默认500
    MessageTip.DefaultDelay = int;
    
    //文本(可为null或"",下同)、图标(为null时不显示图标)、停留时长(可选,下同,负值则使用DefaultDelay)
    MessageTip.Show("阿斯蒂芬", image | null, [delay]);
    
    //文本,内置的绿勾图标,停留时长
    MessageTip.ShowOk("执行成功", [delay]);
    
    //文本,内置的黄色感叹号图标,停留时长
    MessageTip.ShowWarning("执行成功", [delay]);
    
    //文本,内置的红叉图标,停留时长
    MessageTip.ShowError("执行成功", [delay]);

    背景:

    这东西我很早就想写了,因为很多时候正儿八经的弹出个MessageBox会影响心情,本来就是告知一声的事情,非得要去点一下确定,烦人,但因为一直有各种破事,到今天才弄。一开始是用AnimateWindow这个win32 API实现(MSDN),但它没有上浮的效果,所以干脆自己实现,原理无非是步进修改窗体的透明度(Opacity)和位置(Location),只是采用了异步的手段。异步在两个地方有使用,一是改变Location,目的是不让它与透明度动画打架;二是Show窗体时也是异步,目的是从线程层面完全与主UI线程隔离,达到快速Show出多个消息的效果,如图:

    不然就只能等一个消息完全消失完才能显示下一个,并且在主线程Show的话,有可能阻塞用户的其它操作。

    最后,恳请指出问题,或告知已有的更好方案,感谢!

    工程已放网盘,里面有个Tester供你体验,就是第一幅图那个。http://pan.baidu.com/s/1dEVjzMD

    -文毕-

  • 相关阅读:
    远程新建分支后,本地查看不到
    Python3之HTMLTestRunner测试报告美化
    Django项目之模型增删改查操作(CRUD)
    Django项目创建数据模型(Model)
    Django项目settings.py文件基础配置
    Django项目如何使用mysql数据库
    Django常用命令介绍
    快捷到处项目依赖包到requirements.txt
    pc 弹窗橡皮筋效果(自己纪录)
    小程序图片上传预览删除(记录)
  • 原文地址:https://www.cnblogs.com/ahdung/p/MessageTip.html
Copyright © 2020-2023  润新知