图形开发基础(3)-实际例子

实现的功能包含:

1)实现一个椭圆的按钮。可居中显示一行文本。

2)鼠标离开按钮和进入按钮时,按钮边框和背景色需要发生变化。

实现步骤:

1)新增一个用户控件库。

public class UserButton:System.Windows.Forms.UserControl
    {

    }

2)定义控件属性:

private Color _borderColor = Color.Blue;

        /// <summary>
        /// 按钮边框色
        /// </summary>
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.DefaultValue(typeof(Color),"Blue")]
        public Color BorderColor { get { return _borderColor; }
            set { _borderColor = value; }
        }

        private Color _backColor = Color.White;

        /// <summary>
        /// 按钮背景色
        /// </summary>
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.DefaultValue(typeof(Color), "White")]
        public Color BackColor
        {
            get { return _backColor; }
            set { _backColor = value; }
        }

        private Color _hoverBorderColor = Color.Red;

        /// <summary>
        /// 鼠标悬停在按钮上方时的边框色
        /// </summary>
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.DefaultValue(typeof(Color), "Red")]
        public Color HoverBorderColor
        {
            get { return _hoverBorderColor; }
            set { _hoverBorderColor = value; }
        }

        private Color _hoverBackColor = Color.RoyalBlue;

        /// <summary>
        /// 按钮背景色
        /// </summary>
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.DefaultValue(typeof(Color), "RoyalBlue")]
        public Color HoverBackColor
        {
            get { return _hoverBackColor; }
            set { _hoverBackColor = value; }
        }

        private string _caption = string.Empty;

        /// <summary>
        /// 按钮文本
        /// </summary>
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.DefaultValue(null)]
        public string Caption
        {
            get { return _caption; }
            set { _caption = value; }
        }

        /// <summary>
        /// 鼠标悬停标志
        /// </summary>
        private bool bMouseHoverFlag = false;

3)添加相关事件

/// <summary>
        ///
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);

            using (System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath())
            {
                path.AddEllipse(0,0,this.ClientSize.Width-1,this.ClientSize.Height-1);
                if (bMouseHoverFlag)
                {
                    //绘制背景
                    using (SolidBrush b = new SolidBrush(this.HoverBackColor))
                    {
                        e.Graphics.FillPath(b, path);
                    }
                    //绘制边框
                    using (Pen p = new Pen(this.HoverBorderColor))
                    {
                        e.Graphics.DrawPath(p, path);
                    }
                }
                else {

                    //绘制背景
                    using (SolidBrush b = new SolidBrush(this.BackColor))
                    {
                        e.Graphics.FillPath(b, path);
                    }
                    //绘制边框
                    using (Pen p = new Pen(this.BorderColor))
                    {
                        e.Graphics.DrawPath(p, path);
                    }
                }
                if (this.Caption != string.Empty)
                {
                    using (StringFormat f = new StringFormat())
                    {
                        f.Alignment = System.Drawing.StringAlignment.Center;
                        f.LineAlignment = System.Drawing.StringAlignment.Center;
                        f.FormatFlags = System.Drawing.StringFormatFlags.NoWrap;
                        using (SolidBrush b = new SolidBrush(this.ForeColor))
                        {
                            e.Graphics.DrawString(this.Caption,this.Font,b,new RectangleF(0,0,this.ClientSize.Width,this.ClientSize.Height),f);
                        }

                    }
                }

            }
        }

4)添加效果:

 private bool CheckMouseHover(int x, int y)
        {
            bool flag = false;
            using (System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath())
            {
                path.AddEllipse(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1);
                flag = path.IsVisible(x,y);
                if (flag != bMouseHoverFlag)
                {
                    bMouseHoverFlag = flag;
                    this.Invalidate();
                }
            }
            return flag;
        }

        protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
        {
            base.OnMouseMove(e);
            this.CheckMouseHover(e.X,e.Y);
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            this.CheckMouseHover(-1, -1);

        }

        protected override void OnClick(EventArgs e)
        {
            Point p = System.Windows.Forms.Control.MousePosition;
            p = base.PointToClient(p);
            if (CheckMouseHover(p.X, p.Y))
            {
                base.OnClick(e);
            }
        }
时间: 2024-10-10 09:10:10

图形开发基础(3)-实际例子的相关文章

图形开发基础(2)

操作实例: 使用画笔和画刷: Pen myPen=new Pen(Color.Black); Graphics g=this.CreateGraphics(); g.DrawRectangle(myPen,30,30,70,50); 绘制直线: Graphics g=this.CreateGraphics(); Pen myPen=new Pen(Color.Red); g.DrawLine(myPen,130,30,70,50);

iOS开发-基础面试题(一) 分类: 面试题

iOS开发-基础面试题(一) 1.Difference between shallow copy and deep copy??浅复制和深复制的区别?? 答:浅层复制:只复制指向对象的指针,而不复制引用对象本身.?深层复制:复制引用对象本身.?意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源?还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们

.NET基础拾遗(5)多线程开发基础

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 一.多线程编程的基本概念 下面的一些基本概念可能和.NET的联系并不大,但对于掌握.NET中的多线程开发来说却十分重要.我们在开始尝试多线程开发前,应该对这些基础知识有所掌握,并且能够在操作系统层面理解多线程的运行方式. 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块

PHP实现微信公众平台开发—基础篇

PHP实现微信公众平台开发-基础篇 2 1课程介绍 2 2. 微信公众号账号介绍的申请流程详解 2 2.1微信三角色关系 2 2.2信息流的过程 2 2.4微信公众账号的认证 3 2.5订阅号的申请流程 3 3. 微信公众号的工作原理 3 3.1数据交互流程 3 3.2编辑模式和开发者模式的介绍 4 3.3编辑模式的简单演示 5 3.4接口介绍 5 4. 接入微信公众账号的API 5 1.验证配置介绍   5 2.验证参数介绍 5 3.填写验证配置 6 4.生成公网访问的脚本文件 6 5.验证代

Windows 驱动开发基础(九)内核函数

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函数:字符串处理函数,文件操作函数, 注册表读写函数.(这些函数都是运行时函数,所以都有Rtl字样) 1 字符串处理函数 首先驱动程序中,常用的字符串包括4种:CHAR (打印的时候注意小写%s), WCHAR(打印的时候注意大写%S), ANSI_STRING, UNICODE_STRING.后面两种

【开发随感】【一】【开发基础的基础】

正好在做公司网站,单独做了一套知识库和学习系统,也写了一系列的公司内部培训教程,下面陆续把教程里面一些我认为比较有意义和有价值的东西整理出来,希望能给大家提供帮助,如果有什么遗漏和谬误,可以留言或者通过邮件([email protected])方式与我交流 目录 [开发随感][一][开发基础的基础] 1开发基础的基础 一个好的开发,应该能够全面.高效.严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力

Daydream从入门到精通——快速入门开发基础教程二:Android端开发环境配置二

开始部署 上篇介绍了开发Daydream Android VR需要的基本环境,这篇我们来看看如何部署和运用官方示例. -------------------------------------------------------------------------------------------------------------------- Daydream快速入门开发基础教程一:Android端开发环境配置一 http://blog.csdn.net/jaikydota163/arti

iOS开发基础知识--碎片35

iOS开发基础知识--碎片35 1:iOS视图控制对象生命周期 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewController对象的视图即将消失.被覆盖或是隐藏时调用: viewDidDisappear-UIViewController对象的视图已经消

【读书笔记《Android游戏编程之从零开始》】12.游戏开发基础(Canvas 画布)

1.Canvas 画布 画布类 Canvas 封装了图形和图片绘制等内容,此类常用的函数说明如下: drawColor(int color) 作用:绘制颜色覆盖画布,常用于刷屏 参数:颜色值,也可用十六进制形式表示(ARGB) drawText(String text,float x,float y,Paint paint) 作用:绘制文本字符 第一个参数:文本内容 第二.三个参数:文本的X.Y坐标 第四个参数:画笔实例 drawPoint(float x,float y,Paint paint