效果图

一 准备工作

      两张透明的png图片(尺寸73 x 81),一张用于鼠标进入控件时显示,一张用于鼠标单击控件时显示。

新建自定义控件,在构造函数中添加代码

public GlassButton()

{

SetStyle(ControlStyles.DoubleBuffer, true);                   //双缓冲防止重绘时闪烁

SetStyle(ControlStyles.AllPaintingInWmPaint, true);           //忽略WM_ERASEBKGND 窗口消息减少闪烁

SetStyle(ControlStyles.UserPaint, true);                      //自定义绘制控件内容

SetStyle(ControlStyles.SupportsTransparentBackColor, true);   //模拟透明

SetStyle(ControlStyles.Selectable, true);                     //接收焦点

Size = new Size(73, 81);                                      //初始大小

Font = new Font("微软雅黑", 9);                               //控件字体

}

新建枚举,用来表示当前控件的状态

///<summary>

/// 控件状态

///</summary>

public enum State

{

///<summary>

/// 无

///</summary>

Normal = 0,

///<summary>

/// 获得焦点

///</summary>

Focused = 1,

///<summary>

/// 失去焦点

///</summary>

LostFocused = 2,

///<summary>

/// 鼠标指针进入控件

///</summary>

MouseEnter = 3

}

二 制作方法

      比较简单,在这里只贴一下代码,大家一看就明白

属性

///<summary>

/// 获取或设置控件显示的图片

///</summary>

[Description("获取或设置控件显示的图标")]

public Bitmap Bitmap

{

get { return _bmp; }

set {

_bmp = value;

Invalidate(false);

}

}

///<summary>

/// 重写控件焦点属性

///</summary>

[Description("重写控件焦点属性")]

public new bool Focused

{

get { return _focused; }

set

{

_focused = value;

if (_focused)

state = State.Focused;

else

state = State.LostFocused;

Invalidate(false);

}

}

重载事件

//自定义绘制

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

Graphics g = e.Graphics;

g.SmoothingMode = SmoothingMode.HighQuality;

g.PixelOffsetMode = PixelOffsetMode.HighQuality;

switch (state)

{

case State.Focused: {

DrawSelected(g);

break;

}

case State.MouseEnter: {

if (!Focused)

g.DrawImage(Properties.Resources.enter, ClientRectangle);

else

DrawSelected(g);

break;

}

}

DrawImage(g);

DrawText(g);

}

//焦点进入

protected override void OnEnter(EventArgs e)

{

base.OnEnter(e);

Focused = true;

}

//失去焦点

protected override void OnLeave(EventArgs e)

{

base.OnLeave(e);

Focused = false;

}

//禁止调整大小

protected override void OnResize(EventArgs e)

{

Width = 73;

Height = 81;

}

protected override void OnMouseEnter(EventArgs e)

{

base.OnMouseEnter(e);

state = State.MouseEnter;

Invalidate(false);

}

protected override void OnMouseLeave(EventArgs e)

{

base.OnMouseLeave(e);

if (!Focused)

{

state = State.LostFocused;

Invalidate(false);

}

}

//只响应单击鼠标左键事件

protected override void OnClick(EventArgs e)

{

MouseEventArgs m = (MouseEventArgs)e;

if (m.Button == MouseButtons.Left)

{

base.OnClick(e);

Focus();

}

}

方法

#region//Draw

void DrawSelected(Graphics g)

{

g.DrawImage(Properties.Resources.down, ClientRectangle);

}

void DrawImage(Graphics g)

{

if (_bmp != null)

{

Bitmap bmp = ScaleZoom(_bmp);

bmp_Left = (Width - bmp.Width) / 2;

g.DrawImage(bmp, new Rectangle(bmp_Left, bmp_Top, bmp.Width, bmp.Height));

}

}

void DrawText(Graphics g)

{

SizeF size = g.MeasureString(Text, Font);

g.DrawString(Text, Font, new SolidBrush(ForeColor), (Width - size.Width) / 2, 58);

}

#endregion

#region//按比例缩放图片

public Bitmap ScaleZoom(Bitmap bmp)

{

if (bmp != null)

{

double zoomScale;

if (bmp.Width > bmp_Size || bmp.Height > bmp_Size)

{

double imageScale = (double)bmp.Width / (double)bmp.Height;

double thisScale = 1;

if (imageScale > thisScale)

{

zoomScale = (double)bmp_Size / (double)bmp.Width;

return BitMapZoom(bmp, bmp_Size, (int)(bmp.Height * zoomScale));

}

else

{

zoomScale = (double)bmp_Size / (double)bmp.Height;

return BitMapZoom(bmp, (int)(bmp.Width * zoomScale), bmp_Size);

}

}

}

return bmp;

}

#endregion

#region//缩放BitMap

///<summary>

/// 图片缩放

///</summary>

///<param name="bmpSource">源图片</param>

///<param name="bmpSize">缩放图片的大小</param>

///<returns>缩放的图片</returns>

public Bitmap BitMapZoom(Bitmap bmpSource, int bmpWidth, int bmpHeight)

{

Bitmap bmp, zoomBmp;

try

{

bmp = new Bitmap(bmpSource);

zoomBmp = new Bitmap(bmpWidth, bmpHeight);

Graphics gh = Graphics.FromImage(zoomBmp);

gh.InterpolationMode = InterpolationMode.HighQualityBicubic;

gh.DrawImage(bmp, new Rectangle(0, 0, bmpWidth, bmpHeight), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);

gh.Dispose();

return zoomBmp;

}

catch

{ }

finally

{

bmp = null;

zoomBmp = null;

GC.Collect();

}

return null;

}

#endregion

三 要点

      要点就在于各个按钮之间焦点切换的问题,就如效果图所示,当有一个按钮获取了焦点,其他按钮将显示为失去焦点的状态。

MSDN上建议当控件得到焦点时使用Enter事件,也就表示焦点进入当前所选择控件,当控件失去焦点时使用Leave事件。

所以要重载Control组件的OnEnter和OnLeave事件,在此控件中重写了Focused属性,当引发了控件的焦点事件后将触发OnPaint事件重新绘制,而引发Enter事件的发起者来自于控件的Focus()方法。

//焦点进入

protected override void OnEnter(EventArgs e)

{

base.OnEnter(e);

Focused = true;

}

//失去焦点

protected override void OnLeave(EventArgs e)

{

base.OnLeave(e);

Focused = false;

}

http://up.2cto.com/2011/1102/20111102023717645.zip

C# 模仿360安全卫士玻璃按钮 修正版(源码)相关推荐

  1. c155.top index.php,PHP网页游戏《三国霸业》修正版源码

    [实例简介] PHP网页游戏<三国霸业>修正版源码 修正包括浏览器兼容性问题和PHP升级问题等. 简易安装说明档 1.上传所有文件至服务器目录 2.创建数据库 3.进入数据库,点右上角的操 ...

  2. 2022全新Ripro日主题V9.0升级修正版源码+美化包和插件

    正文: 2022全新Ripro日主题V9.0升级修正版源码+美化包和插件,我现在分享的是RiPro9.0的二开版本,这个模板是本人花了Q找人弄到的,我给各位弄了2个美化包和全屏水印以及防复制插件. 模 ...

  3. 炫彩界面库-模仿360安全卫士8.8,支持透明,换肤

    炫彩界面库-模仿360安全卫士8.8 此示例程序使用炫彩界面开发,采用贴图方式实现,控件透明,换肤. 代码下载地址:点击打开链接  代码在炫彩界面库下载包中.

  4. Vue模仿todo超详细讲解(附源码)

    Vue模仿todo超详细讲解(附源码) 一.todo基本DOM结构 二.todo功能需求分析 1.新增任务 2.点击变成完成状态 3.点击删除 4.双击进入编辑以及修改保存 5.底部的状态筛选 6.l ...

  5. Python与seo工具脚本,360/搜狗相关搜索词采集源码参考

    搜索引擎相关搜索词应该是不少seoer在寻找和选择使用的关键词拓展类别,除开热门的百度相关搜索词采集,当然还有360搜索引擎以及搜狗搜索引擎,当然知道方法以后,应用python来实现,基本都是大同小异 ...

  6. Qt/C++ 模仿 360安全卫士 10.2版本

    本着分享的精神写这篇博文.看到帖吧说模仿360有奖的,不竟手痒~写个来玩玩,没打算去争.利用空闲时间,写了有四天时间吧.期间各种找图标资源啊!!有几个没找到~!现在觉得UI设计师才是最牛的!那么些丑陋 ...

  7. 模仿Hibernate的逆向工程_java版_源码下载

    在这篇blog:"Hibernate逆向工程原理_java版本"中谈到了Hibernate逆向工程原理. 我喜欢理论和实践相结合....so,今天我试着模仿hibernate的逆向 ...

  8. jQuery超炫酷按钮插件及源码

    现在大部分网页的按钮都是经过美化的,那些原始的浏览器按钮太过于枯燥乏味,让用户失去和网站交互的兴趣.早期我们都是通过背景图片来美化网页按钮,而现在我们可以利用扩展性更好的CSS3来制作漂亮的网页按钮, ...

  9. 模仿美图秀秀拼图应用ios源码

    模仿美图秀秀拼图应用源码,这个是模仿美图秀秀拼图应用源码,模拟美图秀秀拼图功能,支持图片自由拖动,添加边框,以及不规则图形的切割,也可以说是十分不错的拼图功能实现. <ignore_js_op& ...

最新文章

  1. MySQL数据类型--------字符串类型实战
  2. linux shell输出数字小数点前少了0_南京课工场IT培训:SHELL 超详细基础知识,适合新手小白(一)
  3. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数
  4. matlab-代数方程
  5. 重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础
  6. Linux 内存机制
  7. php博客文章修改,wordpress博客如何快速修改文章阅读数
  8. svn 服务器的搭建以及客户端的使用
  9. C++笔记-设置cout输出数据的宽度和填充
  10. chrome无法拖拽离线安装CRX格式插件解决方法
  11. Python3.0的新改动
  12. 试题17 方程的解(枚举法)
  13. 当磁盘工具无法修复磁盘时,你可以这样做!
  14. 升级VS2019后调试出现“表达式计算器中发生内部错误”
  15. 5G无线关键技术 — 低时延高可靠物联网设计
  16. Java Web程序设计——JSP技术(一)
  17. win7连接xp共享打印机方法
  18. [深度学习概念]·声纹识别技术简介
  19. UIPinchGestureRecognizer 放大、缩小手势
  20. 【C语言】算法学习·种类并查集

热门文章

  1. Mysql——存储引擎
  2. html引入babel-polyfill,babel-polyfill的引用和使用
  3. 又双叒叕来更新啦!Hadoop———MapReduce篇
  4. 关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施
  5. ajax中post传值,ajax post传值
  6. ABAP SQL聚合函数简介
  7. Python numpy astype 强制类型转换
  8. QT设置次级刻度线Pen
  9. TDH 常见运维命令(部分)
  10. 试点来了!应急部发布《“工业互联网+危化安全生产”试点建设方案》