非常高兴有朋友关注这篇博客,同一时候也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是因为3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江。眼下新工作也处于熟悉其中,希望大家能体谅。刚好这周末有点时间,我就接着写写,这篇博客主要是针对刚開始学习的人,希望给为他们能提供一种较易理解的窗口皮肤制作思路,记得自己当初学习C#编程的时候也是摸着石头过河。

闲话少说,我还是接着上篇博客继续写,上次说明了下怎样收集图片资源,这次就以360安全卫士来做演示样例进行模仿,本来也想过模仿下qq,可是qq的界面不太大众化也比較复杂,因为主要目的是希望让刚開始学习的人弄明确做皮肤制作的思路,话说"授人以鱼不如授人以渔",因此这套博客的解讲的过程会比較简单易懂,让刚開始学习的人也能学的明确,而且会将每篇相应的代码上传到我的csdn资源中,感兴趣的能够下载。我相信仅仅要明确了思路,加上自己努力,qq之类的界面也是能够搞定的。

这一篇博客主要是讲自己定义窗口的实现大体思路,以及最小化、最大化、关闭button的实现。整体思路是去掉窗口的默认边框,用其它的控件来替代最小化、最大化、关闭button的默认实现。第一讲不会考虑太多的细节,待功能开发的差点儿相同时再进行一些代码的重构。因为是第一篇关于代码的,所以会从项目的创建、图片资源的引入開始,一步步解说。

第一步:资源图片的选择

资源图片下载地址:[http://download.csdn.net/detail/bbirdsky/6923955]找到压缩包中的360safe.zip;

这一讲主要使用到的图片资源有:./MainFrame/Image/

background_mainwnd.jpg  // 这张做为窗口的背景,为了命名简单更名为img_bg

sys_button_***.jpg   //这4张分别相应最小化、最大化(还原)、关闭按钮的图片,更名为btn_***



第二步:创建解决方式(MySkins)

并加入一个Window窗口控件库项MySkins目用于做自定皮肤,另外加入一个Window窗口应用程序项目MySkinsTest用于做測试,并将MySkinsTest做为默认启动项目,并为MySkinsTest加入引用项目MySkins步骤如图:

第三步:创建文件夹结构

创建Contorl、Entity、Frame、Util用于存放相应的类文件,以及将图片资源加入进项目的图片资源中去,终于的项目结构如图:

第四步:測试代码

先在MySkins项目中加入一个BaseForm窗口,并在MySkinsTest測试项目中让默认的Form1窗口继承自BaseForm,測试项目仅仅是用于測试MySkins项目的效果,注意一定要先加入MySkins依赖项目,不然会找不到BaseForm这个类!

namespace MySkinsTest
{
public partial class Form1 : BaseForm
{
public Form1()
{
InitializeComponent();
}
}
}

第五步:皮肤代码(BaseForm)

1、此篇的核心就是BaseForm窗口基类,首先在Frame文件夹下创建一个普通的Form窗口,并做例如以下属性设置:

    1>将FormBorderStyle设置为None,此时Form窗口就没有边框以及最大小、最小化、关闭button了;

        将BackgroundImage设置为img_bg,并将DoubleBuffered双缓冲设置为true。

        

2>加入三个PictureBox分别用于替代最小化、最大化、关闭button,也能够尝试使用Button替代;

        将PictureBox的BackColor设置为Transparent透明,默认是灰色;

        将三个PictureBox的定位设置为Anchor:Top,Right,这样最大化后的按扭位置后按右上保持不变;

        绑定鼠标点击、移入移出、按下抬起事件,建议是同样事件用同一个事件方法处理。

        

3>加入一个ToolTip控件,用于显示提示信息,设置完的效果例如以下图:

        

2、代码分析:本讲主要包括ControlState控件状态和ResUtils资源帮助类。

1>因为图片的背景图片是4个为一组的,因此定义状态枚举类:ControlState,代码例如以下:

     /// <summary>
/// 控件状态
/// </summary>
public enum ControlState
{
Normal = 1,//控件默认时
MouseOver = 2,//鼠标移上控件时
MouseDown = 3,//鼠标按下控件时
Disable = 4 //当控件不可用时
}

2>因为须要从资源中获取图片以及须要对获取的图片按状态进行切分,因些须要帮助类:ResUtils,代码例如以下:

    /// <summary>
/// 资源辅助类
/// </summary>
class ResUtils
{
/// <summary>
/// 依据资源名称获取图像
/// </summary>
/// <param name="name">资源名称</param>
/// <returns>图像</returns>
public static Bitmap GetResAsImage(string name)
{
if (name == null || name == "")
{
return null;
}
return (Bitmap)Properties.Resources.ResourceManager.GetObject(name);
} /// <summary>
/// 图片button的背景图是4个,依据状态获取当中背景图
/// </summary>
/// <param name="name">图片名称</param>
/// <param name="state">状态</param>
/// <returns></returns>
public static Bitmap GetResWithState(String name, ControlState state)
{
Bitmap bitmap = (Bitmap)GetResAsImage(name);
if (bitmap == null)
{
return null;
}
int block = 0;
switch (state)
{
case ControlState.Normal: block = 0; break;
case ControlState.MouseOver: block = 1; break;
case ControlState.MouseDown: block = 2; break;
case ControlState.Disable: block = 3; break;
}
int width = bitmap.Width / 4;
Rectangle rect = new Rectangle(block * width, 0, width, bitmap.Height);
return bitmap.Clone(rect, bitmap.PixelFormat);
}
}

3>对于最小化、最大化、关闭的实现代码例如以下:

     this.WindowState = FormWindowState.Maximized;  // 最大化

     this.WindowState = FormWindowState.Minimized;  // 最小化

     this.WindowState = FormWindowState.Normal;      // 一般状态

     this.Close();  // 关闭

3、第一讲终于的效果实现了一个比較简单自己定义窗口,具有最大化、最小化以及关闭功能。

    不具备的功能:没有窗口小图标、标题,不能对窗口进行拖动、调整窗口大小,这是下一节要实现的功能。 

    小图标和标题比較简单好实现 ,窗口拖动、调整大小不使用win32Api也能够实现,可是效果不是太好,下节将使用win32Api进行实现!

    对Win32不了解的能够看看这个文档:http://download.csdn.net/detail/bbirdsky/6910413

最后,我将继续保持更新。本篇相应代码下载:http://download.csdn.net/detail/bbirdsky/7366791。

C#窗口皮肤制作(二):创建窗口库项目以及最小化、最大化、关闭button的实现的更多相关文章

  1. Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体

    一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...

  2. delphi -----(去掉窗口最大化,最小化、关闭),主窗口,和子窗口之间的设置

    一.去掉窗口最大化,最小化.关闭 borderIcons:biSystemMenu:false borderStyle:bsSizeable 二.主子窗口 主main: //调用子窗体procedur ...

  3. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)

    转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm   这篇文章主要介绍了JS实现漂亮的窗口 ...

  4. iPhone手机解锁效果&&自定义滚动条&&拖拽--Clone&&窗口拖拽(改变大小/最小化/最大化/还原/关闭)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. git使用(二)----创建版本库

    创建版本库(操作都是在linux环境下) 什么是版本库呢?版本库又名仓库,英文名repository,其实就是一个目录,可以进行增删查改 创建一个目录,这里在根目录下创建一个git_home目录mkd ...

  6. 二创建maven父子项目

    关于maven中的parent聚合一直都有没好好总结,固有这篇. ------------------------------------------------------------------- ...

  7. Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...

  8. NSIS隐藏窗口标题栏自带的按钮(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比较好奇楼主为啥要隐藏关闭按钮,就顺口问了下,结果楼主已经弃楼,未给出原因,猜着可能是为了做自定义页面美化,无法改变按纽外观之类的,后来琢磨了下, ...

  9. android studio学习----如何创建一个库项目

    首先,打开Android studio的软件工具,进入到界面中点击菜单的“file”选项. 2 在弹出的下拉的菜单中,可以看到的是为"New Module“的选项点击进入.   3 进入到c ...

随机推荐

  1. 转:javascript获取上一访问页面

    原文链接:移动端返回上一页,刚需!document.referrer 详解 全文如下: 返回上一页,在PC端我们可以使用:history.go(-1)或者history.back(),可以正常返回第一 ...

  2. http常见状态码有哪些?

    ajax常见面试题 1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互 2:原生js ajax请求有几个 ...

  3. @media 各大尺寸

    @media screen and (min-width:1200px){ #page{ width: 1100px; }#content,.div1{width: 730px;}#secondary ...

  4. Nested Prefab Mode 嵌套预制体 保存问题 Dirty

    Unity2018.3 Nested Prefab Mode 嵌套预制体 Unity2018.3开始,新增了一个Prefab Mode,俗称嵌套预制体,在Prefab里套Prefab.实际应用中多少会 ...

  5. mocha、chai、sinon和istanbul实现100%单元测试覆盖率

    敏捷软件开发中,最重要实践的就是测试驱动开发,在单元测试层面,我们试着实现一个重要的指标就是测试覆盖率.测试覆盖率衡量我们的代码是否已经全部被测试到了. 但是指标本身不是目的,借助测试覆盖率检查,我们 ...

  6. springCloud微服务入门

    目录 前言 Eureka 注册中心server 新建 配置 服务提供者service 新建 配置 服务消费者controller 新建 配置 使用 Feign负载均衡 前言 springCloud是一 ...

  7. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

  8. MySQL案例09:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log

    刚处理完“挖矿”事件,在做最后一个MySQL NBU备份的时候,发现从库有问题,好奇的是怎么主从状态异常没有告警呢?先不管这么多了,处理了这个问题再完善告警内容. 一.错误信息 从库show slav ...

  9. 解决 hibernate cannot define positional parameter after any named parameters have been defined

    解决 hibernate  cannot define positional parameter after any named parameters have been defined 把模糊查询的 ...

  10. Deadline下:写论文的总结

    终于赶在了11月底截止的时刻提交上了导航年会的论文.三天加上两个半晚上差不多干完了80%的活,无论是否能够被录,这次的写作收获很大. 认识到了: 1. 读文献时,一定要带着问题,如果是我来做,我会怎么 ...