C#制作高仿360安全卫士窗体<二>
继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家,写的非常乱而且很少文字介绍。在这里先说明一下,我是一个纯粹想搞技术的,文笔较差。我也想锻炼自己所以才会慢慢的将自己的所学分享出来。一来可以锻炼自己的文笔,二来可以分享知识留给像我一样喜欢这些东西的朋友。所以以后如果缺少介绍和说明,请大家多多补充指正,相互提高。下面进入主题。 上一篇主要讲的如何绘制一个按钮,那么今天讲解如何绘制窗体。之前也说过,先制作按钮的作用是可以将按钮用到窗体上面那些系统按钮如最大化、最小化、关闭、还原等。首先我们对按钮的不同状态的图片进行提取,在上一篇提出来皮肤文件之后,将按钮的文件sys_button_max.png,sys_button_min.png,sys_button_close.png,sys_button_max.png,sys_button_restore.png这几个图片文件进行提取。在这里说明,可以直接使用,也可以自己进行加工。以下是我加工过的(如果需要可以直接右键另存为):
一、嵌入资源 图片素材准备好之后在解决方案中Images目录里面建立一个FormImages文件夹,将图片素材拷贝进去,并设置图片属性中生成操作选择为“嵌入的资源”。 二、创建窗体 资源嵌入之后再在ControlEx目录中建立一个FormEx文件夹,在该文件夹下创建一个名为BaseForm的窗体。该窗体需要修改的选项很少,大部分可以使用代码来解决。窗体创建完毕后,将创建好的ButtonEx拖进窗体,这里需要拖放5个。为了使内容更好看,还拖一个Panel进来。摆放的位置可以随意,后期通过代码控制,但是为了便于开发我摆放为如下:
三、编码
控件摆放完了之后就可以开始编码了,窗体编码主要难度在于消息的处理还有一个比较麻烦一点的是窗体中不同状态下按钮的位置处理,我直接上代码不懂的留言询问我再详细解答:
1、变量申明
#region 声明
private int Rgn;
private Graphics g;
private bool _IsResize = true;//是否允许改变窗口大小
private FormSystemBtn _FormSystemBtnSet = FormSystemBtn.SystemAll;
private Bitmap btn_closeImg = ImageObject.GetResBitmap("FANGSI.UI.Images.FormImages.btn_close.png");
private Bitmap btn_maxImg = ImageObject.GetResBitmap("FANGSI.UI.Images.FormImages.btn_max.png");
private Bitmap btn_miniImg = ImageObject.GetResBitmap("FANGSI.UI.Images.FormImages.btn_mini.png");
private Bitmap btn_restoreImg = ImageObject.GetResBitmap("FANGSI.UI.Images.FormImages.btn_restore.png");
private Bitmap _BackImg = ImageObject.GetResBitmap("FANGSI.UI.Images.FormImages.background_mainwnd.jpg");
private Size oldSize;//记录当前窗口大小
private bool _MaximizeBox = true;//是否启用最大化按钮
private int _TopHeight = ;//窗体头部高度
//枚举系统按钮状态
public enum FormSystemBtn
{
SystemAll = ,
SystemNo = ,
btn_close = ,
btn_miniAndbtn_close = ,
btn_maxAndbtn_close =
}
#endregion
2、构建方法,主要将窗体消息的处理以及按钮位置等信息进行设置
#region 方法
protected void SystemBtnSet()
{
int btnTop = ;
int btnRight = ;
int panelMargin = ;
if (WindowState == FormWindowState.Maximized && FormBorderStyle != System.Windows.Forms.FormBorderStyle.None)
{
btnTop = ;
btnRight = ;
panelMargin = ;
}
this.ContentPanel.Location = new Point(panelMargin, _TopHeight);
this.ContentPanel.Size = new Size(ClientRectangle.Width - (panelMargin * ), ClientRectangle.Height - _TopHeight - panelMargin); switch ((int)_FormSystemBtnSet)
{
case :
btn_close.BackImg = btn_closeImg;
btn_close.Location = new Point(this.Width - , btnTop);
btn_mini.BackImg = btn_miniImg;
btn_mini.Location = new Point(this.Width - , btnTop);
btn_max.BackImg = btn_maxImg;
btn_restore.BackImg = btn_restoreImg;
if (WindowState == FormWindowState.Normal)
{
btn_max.Location = new Point(this.Width - , btnTop);
btn_restore.Location = new Point(this.Width - , -);
}
else
{
btn_max.Location = new Point(this.Width - , -);
btn_restore.Location = new Point(this.Width - , btnTop);
}
break;
case :
btn_close.BackImg = btn_closeImg;
btn_close.Location = new Point(this.Width - , -);
btn_max.BackImg = btn_maxImg;
btn_max.Location = new Point(this.Width - , -);
btn_mini.BackImg = btn_miniImg;
btn_mini.Location = new Point(this.Width - , -);
btn_restore.BackImg = btn_restoreImg;
btn_restore.Location = new Point(this.Width - , -);
break;
case :
btn_close.BackImg = btn_closeImg;
btn_close.Location = new Point(this.Width - , btnTop);
btn_max.BackImg = btn_maxImg;
btn_max.Location = new Point(this.Width - , -);
btn_mini.BackImg = btn_miniImg;
btn_mini.Location = new Point(this.Width - , -);
btn_restore.BackImg = btn_restoreImg;
btn_restore.Location = new Point(this.Width - , -);
break;
case :
btn_close.BackImg = btn_closeImg;
btn_close.Location = new Point(this.Width - , btnTop);
btn_max.BackImg = btn_maxImg;
btn_max.Location = new Point(this.Width - , -);
btn_mini.BackImg = btn_miniImg;
btn_mini.Location = new Point(this.Width - , );
btn_restore.BackImg = btn_restoreImg;
btn_restore.Location = new Point(this.Width - , -);
break;
case :
btn_close.BackImg = btn_closeImg;
btn_close.Location = new Point(this.Width - , btnTop);
btn_mini.BackImg = btn_miniImg;
btn_mini.Location = new Point(this.Width - , -);
btn_max.BackImg = btn_maxImg;
btn_restore.BackImg = btn_restoreImg;
if (WindowState == FormWindowState.Normal)
{
btn_max.Location = new Point(this.Width - , btnTop);
btn_restore.Location = new Point(this.Width - , -);
}
else
{
btn_max.Location = new Point(this.Width - , -);
btn_restore.Location = new Point(this.Width - , btnTop);
}
break;
}
} private void WM_NCHITTEST(ref Message m)
{
int wparam = m.LParam.ToInt32();
Point point = new Point(Win32.LOWORD(wparam), Win32.HIWORD(wparam));
point = PointToClient(point);
if (_IsResize)
{
if (point.X <= )
{
if (point.Y <= ) m.Result = (IntPtr)Win32.HTTOPLEFT; else if (point.Y > Height - )
m.Result = (IntPtr)Win32.HTBOTTOMLEFT;
else
m.Result = (IntPtr)Win32.HTLEFT;
}
else if (point.X >= Width - )
{
if (point.Y <= ) m.Result = (IntPtr)Win32.HTTOPRIGHT; else if (point.Y >= Height - )
m.Result = (IntPtr)Win32.HTBOTTOMRIGHT;
else
m.Result = (IntPtr)Win32.HTRIGHT;
}
else if (point.Y <= ) { m.Result = (IntPtr)Win32.HTTOP; } else if (point.Y >= Height - )
m.Result = (IntPtr)Win32.HTBOTTOM;
else
m.Result = (IntPtr)Win32.HTCAPTION;
}
else
{ m.Result = (IntPtr)Win32.HTCAPTION; }
} private void btn_close_Click(object sender, EventArgs e)
{
this.Close();
} private void btn_mini_Click(object sender, EventArgs e)
{
Win32.PostMessage(base.Handle, Win32.WM_SYSCOMMAND, Win32.SC_MINIMIZE, );
} private void btn_max_Click(object sender, EventArgs e)
{
Win32.PostMessage(base.Handle, Win32.WM_SYSCOMMAND, Win32.SC_MAXIMIZE, );
} private void btn_restore_Click(object sender, EventArgs e)
{
Win32.PostMessage(base.Handle, Win32.WM_SYSCOMMAND, Win32.SC_RESTORE, );
} private void btn_close_MouseEnter(object sender, EventArgs e)
{
toolTip1.SetToolTip(btn_close, "关闭");
} private void btn_max_MouseEnter(object sender, EventArgs e)
{
toolTip1.SetToolTip(btn_max, "最大化");
} private void btn_mini_MouseEnter(object sender, EventArgs e)
{
toolTip1.SetToolTip(btn_mini, "最小化");
} private void btn_restore_MouseEnter(object sender, EventArgs e)
{
toolTip1.SetToolTip(btn_restore, "还原");
}
#endregion
3、属性定义以及方法重写,将扩展属性和窗体重绘等方法结合上一篇的基础类库进行处理
#region 重写方法
protected override void OnInvalidated(InvalidateEventArgs e)
{
base.OnInvalidated(e);
} //重绘窗口
protected override void OnPaint(PaintEventArgs e)
{
try
{
g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality; //高质量
g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量
ImageDrawRect.DrawRect(g, ClientRectangle, base.BackColor, _TopHeight);//绘制白色内容区域
Brush brush = new SolidBrush(Color.White);//定义画笔
PointF point = new PointF(, );//定义标题显示坐标
Font TitleFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)()));
g.DrawString(base.Text, TitleFont, brush, point.X, point.Y); }
catch
{ }
} //重载WndProc方法
protected override void WndProc(ref Message m)
{
try
{
switch (m.Msg)
{
//用户选择最大化按钮,最小化按钮,复原按钮或关闭按钮时,窗口将会接收该消息
case Win32.WM_SYSCOMMAND:
#region
if ((m.WParam != (IntPtr)Win32.SC_MAXIMIZE) && (m.WParam.ToInt32() != 0xf032))
{
if ((m.WParam == (IntPtr)Win32.SC_RESTORE) || (m.WParam.ToInt32() == 0xf122))
{
base.Size = this.oldSize;
}
else if ((m.WParam == (IntPtr)Win32.SC_MINIMIZE) || (m.WParam.ToInt32() == 0xf022))
{
if (this.oldSize.Width == )
{
this.oldSize = base.Size;
}
}
break;
}
this.oldSize = base.Size; #endregion
break;
//在需要计算窗口客户区的大小和位置时发送。通过处理这个消息,应用程序可以在窗口大小或位置改变时控制客户区的内容
case Win32.WM_NCCALCSIZE:
//窗体客户区以外的重绘消息,一般是由系统负责处理
case Win32.WM_NCPAINT:
return;
//鼠标移动,按下或释放都会执行该消息
case Win32.WM_NCHITTEST:
WM_NCHITTEST(ref m);
return;
//画窗体被激活或者没有被激活时的样子
case Win32.WM_NCACTIVATE:
#region
if (m.WParam == (IntPtr)Win32.WM_FALSE)
{
m.Result = (IntPtr)Win32.WM_TRUE;
}
#endregion
return;
default:
base.WndProc(ref m);
return;
}
base.WndProc(ref m);
}
catch { }
} private void BaseForm_Resize(object sender, EventArgs e)
{
SystemBtnSet();
} protected override void OnResizeEnd(EventArgs e)
{
base.OnResizeEnd(e);
this.oldSize = base.Size;
} ///
/// 重写标题属性
///
public override string Text
{
set
{
if (value != base.Text)
{
base.Text = value;
this.Invalidate();
}
}
get
{
return base.Text;
}
}
#endregion
3、窗体属性的定义
#region 属性 [DefaultValue(true)]
[CategoryAttribute("放肆雷特皮肤扩展属性"), Description("是否允许改变窗口大小")]
public bool IsResize
{
get { return this._IsResize; }
set { _IsResize = value; }
} [DefaultValue(true)]
[CategoryAttribute("放肆雷特皮肤扩展属性"), Description("是否在右上角显示最大化按钮")]
public new bool MaximizeBox
{
get
{
return base.MaximizeBox;
}
set
{
base.MaximizeBox = value; this.btn_max.Enabled = value;
}
} [CategoryAttribute("放肆雷特皮肤扩展属性"), Description("系统按钮设置")]
public FormSystemBtn FormSystemBtnSet
{
get
{
return _FormSystemBtnSet;
}
set
{
_FormSystemBtnSet = value;
this.Invalidate(); }
} [CategoryAttribute("放肆雷特皮肤扩展属性"), Description("获取或设置窗体图标")]
public new Icon Icon
{
get
{
return base.Icon;
}
set
{
if (value != base.Icon)
{
base.Icon = value;
this.Invalidate();
} }
} [CategoryAttribute("放肆雷特皮肤扩展属性"), Description("获取或设置窗体头部高度"), DefaultValue()]
public new int TopHeight
{
get
{
return _TopHeight;
}
set
{
_TopHeight = value;
this.Invalidate(); }
}
#endregion
4、窗体构造函数中窗体样式以及动作进行初始化设置
#region 构造函数
public BaseForm()
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);//自绘
this.SetStyle(ControlStyles.DoubleBuffer, true);// 双缓冲
this.SetStyle(ControlStyles.ResizeRedraw, true);//调整大小时重绘
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);// 双缓冲
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); //透明效果
if (this.BackgroundImage == null)
{
this.BackgroundImage = _BackImg;
}
SystemBtnSet();
}
#endregion
使用的时候只需要在窗体中继承这个窗体就可以使用窗体的风格了!下面是效果图:
进行到这里窗体和按钮结合的窗体就已经出来了,中间的背景图片是从360安全卫士提取出来的资源中拿到的。如果还有不懂的欢迎进行留言提问。下一篇就开始将文本框的制作敬请期待喔。。
本文来自 放肆雷特 | 胖子的技术博客
C#制作高仿360安全卫士窗体<二>的更多相关文章
- C#制作高仿360安全卫士窗体(四)- 水晶按钮
项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...
- C#制作高仿360安全卫士窗体(三)
距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...
- C#制作高仿360安全卫士窗体3
C#制作高仿360安全卫士窗体(三) 距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作 ...
- C#制作高仿360安全卫士窗体2
C#制作高仿360安全卫士窗体 继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家 ...
- C#制作高仿360安全卫士窗体<一>
开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体. ...
- 高仿360界面的实现(用纯XML和脚本实现)
源码下载:360UI 本项目XML的桌面渲染依赖GQT开源项目(请感兴趣的朋友加入QQ讨论群:101189702,在群共享文件里下载GQT源码),以下是360界面实现的全部XML代码,所有的代码都在3 ...
- 制作高仿QQ的聊天系统(上)—— 布局文件 & 减少过度绘制
由于没有自己的服务器,我就找了个能实现双方通信的SDK,这个SDK是友盟的用户反馈SDK.本系列的博文关注的不是网络通信,而是如何在网络通信机制已经做好的情况下,做出一个可用的聊天系统.其实,刚开始做 ...
- C# WPF仿360安全卫士11
首先上效果图: 这是我的第一篇随笔,最近因为写一个播放器,开始学习WPF相关技术,随着不断入坑,播放器倒是做出来了,掉坑里了... 本着闲着也是闲着的精神,拿360开刀了: 主界面主要使用DMSkin ...
- (原创)高仿360云盘android端的UI实现
前些日子几大互联网巨头展开了一轮网盘空间大战.一下子从G级别提高到了T级别.以后谁的空间没有1T估计都不好意思开口了~~~ 试用了一下360云盘的客户端,比较小清新(不是给360打广告~~~).刚好U ...
随机推荐
- 基于MVC设计模式的两种软件架构简介
第一种模式,可处理组合命令,具有撤销(Undo)和重做(Redo)功能,支持多种数据库类型 1.Action采用组合模式,既可以代表一个简单的动作,也可以代表一组动作组合.List<Ac ...
- Spring事务:传播行为与隔离级别
文章主要来源:https://github.com/dengdaiyemanren/onetopiconeday/wiki/spring%E4%BA%8B%E5%8A%A1%E9%85%8D%E7%B ...
- WCF学习笔记(一)
WCF是什么? 官方解释: Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至 ...
- wget下载FTP的文件
在Linux中我们怎么样实现wget来下载文件 下面例子 下载所有的py结尾的文件到当前目录 wget ftp://anymous:anymous@42.51.152.2/soft/*.py 递归的 ...
- 【转】MYISAM表批量压缩
关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档 ...
- Laravel 5 基础(八)- 模型、控制器、视图基础流程
添加路由 Route::get('artiles', 'ArticlesController@index'); 创建控制器 php artisan make:controller ArticlesCo ...
- 远程连接数据库(通过pgAdmin)
1.编辑/var/lib/pgsql/data/pg_hba.conf,增加语句 host all all 192.168.105.225/36 trust 让数据库接受网络 192.168.105 ...
- 包装类(Wrapper Class)
1)包装类.针对于原生数据类型的包装.所有的包装类(8个)对位于java.lang包下.java中的8个包装类分别是:Byte,Short,Integer,Long,Float.Double,Char ...
- SQL基础学习篇--字符函数
字符函数可与SELECT,UPDATE,DELETE RIGHT()----从右侧开始选择 SELECT RIGHT(列,字符数量) FROM 表 LEFT()----从左侧开始选择 SUBSTR ...
- char const*, char*const, const char *const的区别
C++标准规定,const关键字放在类型或变量名之前等价的.所以,const char*和 char const*是一样的. const char* //常量指针---指向常量的指针----指针指 ...