C#:控制WinForm界面的显示

控制WinForm界面在屏幕的四个角落显示,具体代码中有说明:

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

namespace Tooltip
{
    /// <summary>
    /// 弹出自方向   右上、右下、左上、左下
    /// </summary>
    internal enum PopUp
    {
        LeftUp,     //左上
        LeftDown,   //左下
        RightUp,    //右上
        RightDown   //右下
    }

    /// <summary>
    /// 显示窗体
    /// </summary>
    public class ShowForm
    {
        #region 字段 属性 

        private int screenWidth;    //除任务栏外的屏幕的宽
        private int screenHeight;   //除任务栏外的屏幕的高

        private Timer timer = new Timer();  //计时器

        private Form _form;
        /// <summary>
        /// 显示的窗体
        /// </summary>
        public Form TheForm
        {
            set
            {
                this._form = value;
                SetLocation();
            }
            get { return this._form; }
        }

        private System.Drawing.Point locationPoint;
        /// <summary>
        /// 窗体显示位置
        /// </summary>
        public System.Drawing.Point LocationPoint
        {
            set
            {
                this.locationPoint = value;
                LimitShowArea();
            }
            get { return this.locationPoint; }
        }

        private int time;
        /// <summary>
        /// 设置弹出窗体过程的整个时间
        /// </summary>
        public int Time
        {
            set { this.time = value; }
            get { return this.time; }
        }

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数
        /// </summary>
        public ShowForm()
        {
            //this._form = form;

            screenWidth = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
            screenHeight = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;

            this.time = 3;

            //this.timer.Interval = 100;
            this.timer.Tick += new EventHandler(timer_Tick);
            this.timer.Enabled = false;
        }

        #endregion

        #region 动态化窗体 开始 结束
            #region 窗体动态化参数

                private int x_distance;     //运动时在X轴上的距离
                private int y_distance;     //运动时在Y轴上的距离
                private int tickCount;      //总运动次数
                private int x_step;         //运动时在Y轴上的步长
                private int y_step;         //运动时在Y轴上的步长
                private int num = 0;        //运动到第几次
                private Point reachPoint = new Point();     //运动到的具体位置

            #endregion

        /// <summary>
        /// 设置窗体动态化参数
        /// </summary>
        private void SetFormDynamicParms()
        {
            x_distance = this.locationPoint.X - this.screenWidth;
            y_distance = this.locationPoint.Y - this.screenHeight;

            tickCount = this.time * 1000 / this.timer.Interval;
            PopUp popUpDirection = this.JudgeDirection();
            switch (popUpDirection)
            {
                case PopUp.LeftUp:
                    x_distance = this.locationPoint.X + this._form.Width;       //x_distance = this.locationPoint.X;
                    y_distance = this.locationPoint.Y + this._form.Height;      //y_distance = this.locationPoint.Y
                    break;
                case PopUp.LeftDown:
                    x_distance = this.locationPoint.X + this._form.Width;       //x_distance = this.locationPoint.X;
                    y_distance = this.locationPoint.Y - this.screenHeight;
                    break;
                case PopUp.RightUp:
                    x_distance = this.locationPoint.X - this.screenWidth;
                    y_distance = this.locationPoint.Y + this._form.Height;      //y_distance = this.locationPoint.Y;
                    break;
                default:
                    break;
            }

            x_step = x_distance / tickCount;
            y_step = y_distance / tickCount;

        }

        /// <summary>
        /// 计时器间隔执行函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer_Tick(object sender, EventArgs e)
        {
            if (this.num == 0)
            {
                SetFormDynamicParms();
                num++;
            }
            else
            {
                this.reachPoint.X = this.locationPoint.X - x_distance + x_step * num;
                this.reachPoint.Y = this.locationPoint.Y - y_distance + y_step * num;
                if (this.num < this.tickCount)
                {
                    this._form.Location = this.reachPoint;
                    this._form.Opacity = this.num * 100 / this.tickCount;
                    this.num++;
                }
                else
                {
                    this._form.Location = this.locationPoint;
                    this._form.Opacity = 100;
                    this.num = 0;
                    this.timer.Stop();
                }
            }
        }

        /// <summary>
        /// 开始显示动态窗体
        /// </summary>
        public void Start()
        {
            this.timer.Enabled = true;
            this.timer.Start();
            this._form.Opacity = 0;
            this._form.Show();

        }

        /// <summary>
        /// 关闭显示的窗体
        /// </summary>
        public void Close()
        {
            this.timer.Stop();
            this.timer.Enabled = false;
            this._form.Close();
        }

        #endregion

        #region 默认显示位置

        private void SetLocation()
        {
            Point lct = new Point();
            lct.X = screenWidth - this.TheForm.Width;
            lct.Y = screenHeight - this.TheForm.Height;
            this.LocationPoint = lct;
        }

        #endregion

        #region 限制弹框的显示区域

        private void LimitShowArea()
        {
            if (this.locationPoint.X < 0 )
            {
                this.locationPoint.X = 0;
            }

            if (this.locationPoint.Y < 0)
            {
                this.locationPoint.Y = 0;
            }

            int maxX = this.screenWidth - this._form.Width;   //Form 不溢出 X轴最大值
            if (this.locationPoint.X > maxX)
            {
                this.locationPoint.X = maxX;
            }

            int maxY = this.screenHeight - this._form.Height;   //Form 不溢出 Y轴最大值
            if (this.locationPoint.Y > maxY)
            {
                this.locationPoint.Y = maxY;
            }
        }

        #endregion

        #region 窗体显示 右上、右下、左上、左下

        /// <summary>
        /// 窗体中心点
        /// </summary>
        /// <returns></returns>
        private Point FormCentre()
        {
            Point frmCentre = new Point();
            frmCentre.X = this.locationPoint.X + this._form.Width / 2;
            frmCentre.Y = this.locationPoint.Y + this._form.Height / 2;
            return frmCentre;
        }

        /// <summary>
        /// 屏幕中心点
        /// </summary>
        /// <returns></returns>
        private Point ScreenCentre()
        {
            Point screenCentre = new Point();
            screenCentre.X = this.screenWidth / 2;
            screenCentre.Y = this.screenHeight / 2;
            return screenCentre;
        }

        /// <summary>
        /// 判断窗体显示自的方向
        /// </summary>
        /// <returns></returns>
        private PopUp JudgeDirection()
        {
            PopUp popup = PopUp.RightDown;

            Point frmCentre = FormCentre();
            Point screenCentre = ScreenCentre();

            if (frmCentre.X < screenCentre.X)
            {
                if (frmCentre.Y < screenCentre.Y)
                {
                    popup = PopUp.LeftUp;
                }
                else
                {
                    popup = PopUp.LeftDown;
                }
            }
            else
            {
                if (frmCentre.Y < screenCentre.Y)
                {
                    popup = PopUp.RightUp;
                }
                else
                {
                    popup = PopUp.RightDown;
                }
            }

            return popup;
        }

        #endregion
    }
}

参考:屏幕、任务栏 工作域大小

当前的屏幕除任务栏外的工作域大小
    this.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
    this.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;

当前的屏幕包括任务栏的工作域大小
this.Width=System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
this.Height=System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;

任务栏大小
this.Width=System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width-System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
this.Height=System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height-System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;

winform实现全屏显示
WinForm:
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
this.TopMost = true;   

winform获取屏幕区域
Rectangle ScreenArea = System.Windows.Forms.Screen.GetWorkingArea(this);

时间: 2024-10-10 06:38:10

C#:控制WinForm界面的显示的相关文章

日积(Running)月累(ZSSURE):WCF学习之“通过事件绑定控制WinForm宿主程序主界面控件”

背景: WCF服务需要寄宿到相应的可运行进程中执行,常见的有四种寄宿,分别是控制台程序.WinForm程序.IIS和Windows服务.之前学习老A博客和<WCF全面解析>时最常用到的是控制台寄宿,近期由于项目需求,需要在WinForm程序中调用WCF服务,本博文通过一个简单的实例来演示WCF在WinForm中的寄宿.并着重介绍如何利用事件绑定控制宿主主UI界面控件. 题记: 之前一直坚守在C++阵地,对于新语言.新技术(诸如Python.J2EE.Bigdata.AI)不甚感冒.自以为&qu

C#获取显示器屏幕数量 控制winform显示到哪一个屏幕

原文:C#获取显示器屏幕数量 控制winform显示到哪一个屏幕 获取当前系统连接的屏幕数量: Screen.AllScreens.Count();获取当前屏幕的名称:string CurrentScreenName = Screen.FromControl(this).DeviceName;获取当前屏幕对象:Screen CurrentScreen = Screen.FromControl(this);获取当前鼠标所在的屏幕:Screen CurrentScreen = Screen.From

C#为什么多线程控制winform需要用委托?

C#(C#培训 )为什么多线程控制winform需要用委托?比如我新起了一个线程A,在A线程里要对winform的list控件里显示数据,我需要用一个委托函数来实现. 因为winform是主线程创建的,你用另外一个线程来调用它就可能会出现两个线程同时访问同一个资源的问题,这个时候很容易出现错误,比如A线程改变窗口的颜色为红色,B线程取窗口的颜色,如果这两个线程正好碰到一起,可能A略先于B,那么就是B取出来的红色,如果略后于那么就是原来的颜色,而这和CPU的繁忙度.时间片的轮转是相关的,是一种随机

Web界面和Winform界面生成,代码生成工具

在上面一篇随笔<代码生成工具之界面快速生成>介绍了代码生成工具Database2Sharp的界面生成操作,其中介绍了Web界面(包括列表界面.内容显示.内容编辑界面的生成,另外还介绍了Winform界面的内容编辑界面的生成,本篇主要继续介绍Winform界面生成中的查询列表界面的操作展示等信息. 基于Winform的界面生成,配合我的Winform开发框架,提供了三种不同的界面生成,包括传统界面样式.DotNetBar界面样式和DevExpress界面样式的代码生成,这几种界面是目前Winfo

在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法

本文较为详细的讲述了在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法,分享给大家供大家参考之用.具体方法如下: 在我们开发基于WCF访问方式的Winform程序的时候,一般情况下需要对界面显示的字段进行中文显示的解析.如果是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,但是不建议这样处理:一般情况下,我们把中文对照信息放到业务类里面去统一解析,但是这样会导致每次WCF访问方式请求解析中文化的操作耗费一定的响应时间.如果使用缓存存储中文字段的对照表,那么

第一次做winform界面问题总结

1.winform窗体 a. 最大,最小按钮:this.maxizebox,this.minizebox b.不允许用户修改窗口大小: this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; c.修改标题: this.text d.窗口居中: this.SetBounds((Screen.GetBounds(this).Width / 2) - (this.Width / 2), (Screen.GetBo

如何在Winform界面中设计图文并茂的界面

在Winform里面,很多控件元素都是标准的,如图标.按钮.工具栏等等,所以一般设计标准的Winform界面比较快捷,但是往往这样的界面相对单调一些,特别在界面控件比较少的情况下,我们往往需要加入一些图片.背景什么来衬托一下,看起来图文并茂一些,本文主要介绍,如何在Winfrom里面利用各种控件的特点,设计一个相对比较美观.图文并茂的Winform界面. 1.界面效果分析 在一些场景里面,如一些进销存的系统里面,我们往往把一些相关的模块处理放在一起,如进货.退货.库存调入.调出.产品.库存.盘点

Android——控制UI界面

一.使用XML布局文件控制UI界面 res\layout\activity_main.xml代码如下: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/FrameLayout1" android:layout_width

WinForm LED循环显示信息,使用定时器Threading.Timer

原文:WinForm LED循环显示信息,使用定时器Threading.Timer 这里用一个示例来演示timer如何使用.示例:LED屏幕显示描述:这个示例其实很简单,LED屏幕上显示3个信息:        1:排队叫号         2:催缴费         3:等待列表.因为LED屏幕大小的关系,列表需要分页显示. 正常情况下,这3个信息都需要从服务器上去获得,这里的示例只做简单的模拟, 界面很简单,如图,这里我就不美化了. Timer构造函数参数说明: Callback:一个 Ti