【C# WinForm】类似QQ靠近屏幕边缘缩放功能

当窗体离屏幕四周一定距离时,改变窗体位置,引导窗体靠边;靠边后,当鼠标离开窗体时,改变窗体位置,窗体隐藏,凸出一点在屏幕内;隐藏后,当鼠标移到窗体时,窗体显示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FrmZoom
{
    public partial class FrmMain : Form
    {
        // 窗体是否引导
        bool isGuide = false;
        // 窗体是否隐藏
        bool isShrink = false;
        // 窗体引导距离
        const int GUIDE_DISTANCE = 15;
        // 窗体靠边凸出部分距离
        const int BULGE_DISTANCE = 3;

        public FrmMain()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 设置500毫秒检查一次窗体是否需要缩放
            this.timZoom.Interval = 500;
            // 启动窗体缩放事件
            this.timZoom.Enabled = true;
        }

        /// <summary>
        /// 引导窗体
        /// </summary>
        private void GuideFrm()
        {
            /* 判断窗体边缘是否进入引导距离
             * true     靠边,“isGuide = false;”,窗体已引导
             * false    “isGuide = false;”,窗体未引导
             */
            if (this.Left < GUIDE_DISTANCE && this.Left > -GUIDE_DISTANCE)
            {
                this.Left = 0;
                isGuide = true;
            }
            else if (this.Top < GUIDE_DISTANCE && this.Top > -GUIDE_DISTANCE)
            {
                this.Top = 0;
                isGuide = true;
            }
            else if (this.Right < (Screen.GetWorkingArea(this).Width + GUIDE_DISTANCE) && this.Right > (Screen.GetWorkingArea(this).Width - GUIDE_DISTANCE))
            {
                this.Left = Screen.GetWorkingArea(this).Width - this.Width;
                isGuide = true;
            }
            else
            {
                isGuide = false;
            }
        }

        /// <summary>
        /// 隐藏窗体
        /// </summary>
        private void HideFrm()
        {
            /* 窗体是否靠边
             * true     窗体隐藏
             * false    
             */
            if (this.Left == 0)
            {
                this.Left = -(this.Width - BULGE_DISTANCE);
            }
            else if (this.Top == 0)
            {
                this.Top = -(this.Height - BULGE_DISTANCE);
            }
            else if (this.Right == (Screen.GetWorkingArea(this).Width))
            {
                this.Left = Screen.GetWorkingArea(this).Width - BULGE_DISTANCE;
            }
            // 窗体已隐藏
            isShrink = true;
            // 窗体引导关闭
            isGuide = false;

            // 窗体置顶
            this.TopMost = true;
            // 在Windows任务栏中不显示窗体
            this.ShowInTaskbar = false;
        }

        /// <summary>
        /// 显示窗体
        /// </summary>
        private void ShowFrm()
        {
            // 窗体是否靠边
            if (this.Left == -(this.Width - BULGE_DISTANCE))
            {
                this.Left = 0;
            }
            else if (this.Top == -(this.Height - BULGE_DISTANCE))
            {
                this.Top = 0;
            }
            else if (this.Right == Screen.GetWorkingArea(this).Width + this.Width - BULGE_DISTANCE)
            {
                this.Left = Screen.GetWorkingArea(this).Width - this.Width;
            }
            // 窗体未隐藏
            isShrink = false;

            // 窗口不置顶
            this.TopMost = false;
            // 在Windows任务栏中显示窗体
            this.ShowInTaskbar = true;
        }

        /// <summary>
        /// 窗体缩放
        /// </summary>
        private void ZoomFrm()
        {
            // 获取鼠标位置
            int mouseX = MousePosition.X;
            int mouseY = MousePosition.Y;
            // 获取窗体位置
            int frmX = this.Location.X;
            int frmY = this.Location.Y;

            /* 鼠标是否在窗体内
             * true     显示窗体
             * false    隐藏窗体
             */
            if (mouseX > frmX - 1 && mouseX < frmX + this.Width + 1 && mouseY > frmY - 1 && mouseY < frmY + this.Height + 1)
            {
                // 窗体隐藏时才显示窗体
                if (isShrink)
                {
                    ShowFrm();
                }
            }
            else
            {
                // 窗体引导时才隐藏窗体
                if (isGuide)
                {
                    HideFrm();
                }
            }
        }

        /// <summary>
        /// 移动窗体事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Move(object sender, EventArgs e)
        {
            // 引导窗体
            GuideFrm();
        }

        /// <summary>
        /// 窗体缩放事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timZoom_Tick(object sender, EventArgs e)
        {
            // 缩放窗体
            ZoomFrm();
        }
    }
}

示例项目:http://download.csdn.net/detail/u011689438/8823845

时间: 2024-10-13 01:01:11

【C# WinForm】类似QQ靠近屏幕边缘缩放功能的相关文章

C#如何实现类似QQ那样靠边隐藏的功能

http://www.cnblogs.com/yechensi/archive/2009/08/02/1537145.html C#如何实现类似QQ那样靠边隐藏的功能 你想过为自己的程序添加靠边隐藏的功能吗?还在为计算窗体的大小及位置而烦恼吗?想这么简单的轻松调用吗? DockWindow.FormDockTemplate m_oDockFormTemplate = new DockWindow.FormDockTemplate(this); 不用吃惊,您只需要在你的窗体初始化的时候(也就是窗体

实现类似QQ自拍头像的功能(demo源码)

在很多软件系统中,都允许用户设置自己的头像,甚至可以直接使用摄像头照相作为自己的头像,就像QQ的自拍头像功能一样. 这种功能是如何实现的了?最直接的,我们可以使用Windows提供的VFW技术或DirectX技术来捕获摄像头采集到的视频和图片.但是,无论使用这两种技术中的哪一个,要实现一个兼容所有摄像头而又运行稳定的拍照功能,都不是那么容易.幸运的是,OMCS已经内置集成了这种功能的一个WinForm控件PhotoPanel,我们可以直接拿来使用. PhotoPanel控件的主要接口如下图所示:

WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右下角会显示一个窗体,一般情况下该窗体会隐藏停靠在右边,只露出很小部分,当鼠标移动到这个很小部分时,窗体全部显示,显示过程是从右边滑动到左边,当鼠标离开窗体时,窗体需要隐藏在右边,只露出很小部分,隐藏过程是从左边滑动到右边. 实现此类效果我碰到的连个难点是:1.如何判断鼠标离开了窗体?2.窗体显示隐藏

C#实现类似QQ的隐藏浮动窗体、消息闪动

功能简介 当语音客服系统登录成功进入主界面时,本聊天工具将会自动隐藏在左下角位置,当鼠标移动到左下角时,自动弹出,当鼠标移开聊天窗体时,自动隐藏.如果想让聊天窗体固定在桌面,只要拖动一下聊天窗口,让它不停留在边界位置就可以了.隐藏和悬浮方式类型QQ. 1. 系统主界面 当点击最小化按钮时, 在电脑右下角会显示任务图标,点击任务图标,将会在左下角位置弹出. 主界面各部分介绍: a) 消息列表:该区域的功能主要是显示消息记录. b) 发送消息:输入要发送的消息进行发送,默认群聊,输入消息后,按回车键

winform-实现类似QQ停靠桌面上边缘隐藏的效果

//实现类似QQ停靠桌面上边缘隐藏的效果! private void timer1_Tick(object sender, EventArgs e) { System.Drawing.Point pp = new Point(Cursor.Position.X, Cursor.Position.Y);//获取鼠标在屏幕的坐标点 Rectangle Rects = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top

qq划屏幕红包程序

qq划屏幕红包程序

Android实现ListView或GridView首行/尾行距离屏幕边缘距离

Android上ListView&GridView默认行都是置顶的,这样会很丑. 一般为了解决这个问题都会在首行或尾行加上一个隐藏的View,那样实在是太麻烦了.在网上看博客的时候突然看到这个属性真的很有用! 直接上关键属性: 设置ListView或GridView的android:clipToPadding = true, 然后通过paddingTop和paddingBottom设置距离就好了. 博客原文: http://www.cnblogs.com/xitang/p/3606578.htm

在类似qq或者微信聊天中。如何根据不同的手机发送图片

原文:在类似qq或者微信聊天中.如何根据不同的手机发送图片   前一段时间,公司自己要求做多客服开发,但是对于发送图片这一块,当时很苦恼,我用自己的手机(米2)测试,不管是本地,还是云相册,最新照片.都没有问题,但是测试那边一直说图片发不了,而且还会崩.很纳闷.      后来经过debug,发现4.4以上的手机,它的图片路径居然不一样,有file://开头的,也有content://开头的,还有/mnt/sdcard/开头的,坑爹啊,我自己的手机是4.1的,不一样.     4.4以前的路径都

[C# 网络编程系列]专题九:实现类似QQ的即时通信程序

转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序. 一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些