博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net winForm 实现类似qq 弹出新闻
阅读量:6824 次
发布时间:2019-06-26

本文共 2356 字,大约阅读时间需要 7 分钟。

 一、背景:

    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{    ///     /// Description of UserControl1.    ///     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)        {              }    }}

 

三、总体效果:

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

  

  

  

  

转载于:https://www.cnblogs.com/echosong/p/3500563.html

你可能感兴趣的文章
【转】HTML5的语音输入 渐进使用HTML5语言识别, so easy!
查看>>
数据仓库与数据挖掘的一些基本概念
查看>>
JAVA知多少
查看>>
使用ThinkPHP框架高速开发站点(多图)
查看>>
一步一步写算法(之 A*算法)
查看>>
ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议
查看>>
Silverlight TabItem选中,未选中样式设置
查看>>
PAT 1002 Hello World for U (20)
查看>>
[华为机试练习题]55.最大公约数 & 多个数的最大公约数
查看>>
文章标题
查看>>
对js原型对象的拓展和原型对象的重指向的区别的研究
查看>>
将数值四舍五入后格式化,带有千分位
查看>>
Atitit.反编译apk android源码以及防止反编译apk
查看>>
EF增删改查操作
查看>>
更改文件和目录的所有者
查看>>
[Angularjs]表单验证
查看>>
jquery------使用jQuery的委托方法
查看>>
Bmob后端云使用步骤
查看>>
ASP.NET Core 中间件详解及项目实战
查看>>
Android中的Uri.parse()
查看>>