zoukankan      html  css  js  c++  java
  • .net winForm 实现类似qq 弹出新闻

     一、背景:

        echong 之前一直用 公司大牛c语言写的一个弹出托管,前几天写东西的时候发现com调用不是那么好使。而手头上写的这个东西又是.net 环境下C#实现的。调用的时候有些背景图片logo不好调用,索性直接用.net写一个。东西很简单,写出来只是做个记录整理。

     二、相关问题的提出和解决:

      1、展现形式

        1)最容易想到的自然是窗体的形式,考虑的窗的美观。

        2)窗体原来的边框样式FormBorderStyle = none

        3)然后用个Panel 填满整个窗体,name = Panel1 Panel BorderStye=FixedSingle

        4) 在Panel1 的上方设置一个同宽的Panel2 来划分头部

        5)在Panel2 左边放置个lable1 右边放置个 label2 方便做为标题字样 和 关闭(还可以加入logo等)

          6)效果:

        

      2、弹出的定位问题

        在1 后咱们有了一个能做完弹出提示的窗体,那么如何定位到右下角。最容易想到就是根据电脑的分辨率然后直接x坐标y坐标定位到右下角。但是这样做不同电脑的分辨率不同的情况下就不能达到目的。如果我们能取得当前显示设备的大小。那么只要定位到 显示器的 宽 和 高 。可以得出 定位的左边 X1= 总宽宽-弹出窗体的宽 Y1=总高-弹出窗体高。正好C# 给我们提供了 Screen 类 这个类很容易取得显示设备的高宽代码

      

    Rectangle r = Screen.GetWorkingArea(this); 
    this.Location = new Point(r.Right - this.Width, r.Bottom - this.Height); 

      以上两行代码实现了窗体定位到了右下角

      3、支持鼠标位置的移动

      

      通过 1,2基本上实现了我们想要的右下角弹出提示窗体的目的。但是发现窗体不能拖动 。我们想实现 这对 panel2 鼠标有拖动整个窗体的功效。 解决这个问题需要调用window内置API,user32.dll 提供了Windows用户界面相关应用程序接口

        [DllImport("user32.dll")]
             //方法扑捉
            public static extern bool ReleaseCapture();
            [DllImport("user32.dll")]
            public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
            public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_MOVE = 0xF010;
            public const int HTCAPTION = 0x0002;
            void Panel2MouseDown(object sender, MouseEventArgs e)
            {
                //扑捉事件
                ReleaseCapture();
                //发送消息给window Api 来实现
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);//
            }

    4、附带贴出设置panel

      发现存在问题  标题的地方 是不能拖动,因为panel跟标题存在区域的重叠,那么我们必须把panel设置为透明,以方便拖动,新建一个用户控件:

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    namespace ttsd
    {
        /// <summary>
        /// Description of UserControl1.
        /// </summary>
        public partial class UserControl1 :Panel
        {
            public UserControl1()
            {
            
            }
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams createParams = base.CreateParams;
                    createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
                    return createParams;
                }
            }
            protected override void OnPaintBackground(PaintEventArgs e)
            {
          
            }
        }
    }

    三、总体效果:

      当然我们可以做成通用的类,在类实例化对象的时候把标题 、图标、内容等等信息可以传入进去。

      

      

      

      

  • 相关阅读:
    KAFKA基础(四):Kafka架构深入(2)Kafka 生产者
    逆向工程,调试Hello World !程序(更新中)
    关于网络初级基础知识总结
    真!阿里P10整理的Java面试宝典,学了60%成功砍下了P8级Offer,真爽!
    【专升本计算机】甘肃省2020年专升本计算机测试题
    真!阿里P10整理的Java面试宝典,学了60%成功砍下了P8级Offer,真爽!
    python利用numpy存取文件
    泛在网技术考点整理
    [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
    汉诺塔问题
  • 原文地址:https://www.cnblogs.com/echosong/p/3500563.html
Copyright © 2011-2022 走看看