c#自定义窗体

我想美化窗体或者是其他控件、无外乎三种方式:

1、重写WinForm自带的控件,这需要熟练掌握GDI+ 技术、并且需要熟悉控件的各种事件及属性,还有些控件没有太多可以重写的东东,

所以这种方式对于我而言有点难度,放弃![放弃的原因是有更好的方式]

2、使用第三方控件。可惜大部分是需要付费的,放弃!

3、使用皮肤控件。 以 “C# 皮肤控件” Google ,哇,好多啊… 突然间看到一个很熟悉的名字 “IrisSkin2.dll”,没错就是它,以前还用过的,

但是由于当时没有好看的.ssk皮肤文件,所以对它没引起足够的重视。而此时突然有了自己制作ssk文件的想法,于是 借助Google强大的搜索引擎找到了“skinbuilder” 一款制作ssk皮肤文件的牛X工具。

1、重写WinForm自带的控件

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace Demo

{

///

/// 窗体自绘辅助类

///

public class RenderHelper

{

///

/// 设置窗体的圆角矩形

///

/// 需要设置的窗体

/// 圆角矩形的半径

public static void SetFormRoundRectRgn(Form form, int rgnRadius)

{

int hRgn = 0;

hRgn = Win32.CreateRoundRectRgn(0, 0, form.Width 1, form.Height 1, rgnRadius, rgnRadius);

Win32.SetWindowRgn(form.Handle, hRgn, true);

Win32.DeleteObject(hRgn);

}

///

/// 移动窗体

///

public static void MoveWindow(Form form)

{

Win32.ReleaseCapture();

Win32.SendMessage(form.Handle, Win32.WM_NCLBUTTONDOWN, Win32.HTCAPTION, 0);

}

///

/// 取低位 X 坐标

///

public static int LOWORD(int value)

{

return value & 0xFFFF;

}

///

/// 取高位 Y 坐标

///

public static int HIWORD(int value)

{

return value >> 16;

}

///

/// 绘制窗体边框

///

/// 需要绘制边框的窗体

/// 绘制边框所用的绘图对象

/// 边框图片

/// 边框的圆角矩形

public static void DrawFormFringe(Form destForm, Graphics g, Image fringeImg, int radius)

{

DrawNineRect(

g,

fringeImg,

new Rectangle(-radius, -radius, destForm.ClientSize.Width 2 * radius, destForm.ClientSize.Height 2 * radius),

new Rectangle(0, 0, fringeImg.Width, fringeImg.Height));

}

///

/// 画九宫图

///

/// 绘图对象

/// 所需绘制的图片

/// 目标矩形

/// 来源矩形

public static void DrawNineRect(Graphics g, Image img, Rectangle DestRect, Rectangle SrcRect)

{

int offset = 5;

Rectangle NineRect = new Rectangle(img.Width / 2 - offset, img.Height / 2 - offset, 2 * offset, 2 * offset);

int x = 0, y = 0, nWidth, nHeight;

int xSrc = 0, ySrc = 0, nSrcWidth, nSrcHeight;

int nDestWidth, nDestHeight;

nDestWidth = DestRect.Width;

nDestHeight = DestRect.Height;

// 左上-------------------------------------;

x = DestRect.Left;

y = DestRect.Top;

nWidth = NineRect.Left - SrcRect.Left;

nHeight = NineRect.Top - SrcRect.Top;

xSrc = SrcRect.Left;

ySrc = SrcRect.Top;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nWidth, nHeight, GraphicsUnit.Pixel);

// 上-------------------------------------;

x = DestRect.Left NineRect.Left - SrcRect.Left;

nWidth = nDestWidth - nWidth - (SrcRect.Right - NineRect.Right);

xSrc = NineRect.Left;

nSrcWidth = NineRect.Right - NineRect.Left;

nSrcHeight = NineRect.Top - SrcRect.Top;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nSrcWidth, nSrcHeight, GraphicsUnit.Pixel);

// 右上-------------------------------------;

x = DestRect.Right - (SrcRect.Right - NineRect.Right);

nWidth = SrcRect.Right - NineRect.Right;

xSrc = NineRect.Right;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nWidth, nHeight, GraphicsUnit.Pixel);

// 左-------------------------------------;

x = DestRect.Left;

y = DestRect.Top NineRect.Top - SrcRect.Top;

nWidth = NineRect.Left - SrcRect.Left;

nHeight = DestRect.Bottom - y - (SrcRect.Bottom - NineRect.Bottom);

xSrc = SrcRect.Left;

ySrc = NineRect.Top;

nSrcWidth = NineRect.Left - SrcRect.Left;

nSrcHeight = NineRect.Bottom - NineRect.Top;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nSrcWidth, nSrcHeight, GraphicsUnit.Pixel);

// 中-------------------------------------;

x = DestRect.Left NineRect.Left - SrcRect.Left;

nWidth = nDestWidth - nWidth - (SrcRect.Right - NineRect.Right);

xSrc = NineRect.Left;

nSrcWidth = NineRect.Right - NineRect.Left;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nSrcWidth, nSrcHeight, GraphicsUnit.Pixel);

// 右-------------------------------------;

x = DestRect.Right - (SrcRect.Right - NineRect.Right);

nWidth = SrcRect.Right - NineRect.Right;

xSrc = NineRect.Right;

nSrcWidth = SrcRect.Right - NineRect.Right;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nSrcWidth, nSrcHeight, GraphicsUnit.Pixel);

// 左下-------------------------------------;

x = DestRect.Left;

y = DestRect.Bottom - (SrcRect.Bottom - NineRect.Bottom);

nWidth = NineRect.Left - SrcRect.Left;

nHeight = SrcRect.Bottom - NineRect.Bottom;

xSrc = SrcRect.Left;

ySrc = NineRect.Bottom;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nWidth, nHeight, GraphicsUnit.Pixel);

// 下-------------------------------------;

x = DestRect.Left NineRect.Left - SrcRect.Left;

nWidth = nDestWidth - nWidth - (SrcRect.Right - NineRect.Right);

xSrc = NineRect.Left;

nSrcWidth = NineRect.Right - NineRect.Left;

nSrcHeight = SrcRect.Bottom - NineRect.Bottom;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nSrcWidth, nSrcHeight, GraphicsUnit.Pixel);

// 右下-------------------------------------;

x = DestRect.Right - (SrcRect.Right - NineRect.Right);

nWidth = SrcRect.Right - NineRect.Right;

xSrc = NineRect.Right;

g.DrawImage(img, new Rectangle(x, y, nWidth, nHeight), xSrc, ySrc, nWidth, nHeight, GraphicsUnit.Pixel);

}

///

/// 绘制窗体主体部分白色透明层

///

/// 需要绘制的窗体

/// 绘图对象

public static void DrawFromAlphaMainPart(Form form, Graphics g)

{

Color[] colors =

{

Color.FromArgb(5, Color.White),

Color.FromArgb(30, Color.White),

Color.FromArgb(150, Color.White),

Color.FromArgb(180, Color.White),

Color.FromArgb(30, Color.White),

Color.FromArgb(5, Color.White)

};

float[] pos =

{

0.0f,

0.05f,

0.15f,

0.85f,

0.99f,

1.0f

};

ColorBlend colorBlend = new ColorBlend(6);

colorBlend.Colors = colors;

colorBlend.Positions = pos;

RectangleF destRect = new RectangleF(0, 0, form.Width, form.Height);

using (LinearGradientBrush lBrush = new LinearGradientBrush(destRect, colors[0], colors[5], LinearGradientMode.Vertical))

{

lBrush.InterpolationColors = colorBlend;

g.FillRectangle(lBrush, destRect);

}

}

}


3、使用皮肤控件。

例如IrisSkin2.dll皮肤控件

1、添加引用 IrisSkin2.dll 或 IrisSkin4.dll。

2、修改 Program.cs Main函数

Application.Run(new Form1());

修改为

Form1 frm = new  Form1();

Sunisoft.IrisSkin.SkinEngine skin = new Sunisoft.IrisSkin.SkinEngine((System.ComponentModel.Component)frm);

skin.SkinFile = "***.ssk"; // 指定皮肤文件

skin.TitleFont = new System.Drawing.Font("微软雅黑", 10F);// 指定标题栏的Font。

Application.Run(frm);

另外看SkinEngine重载的构造函数,还有如下的几个。

嘿嘿,第三个构造函数: 流…  可以存储加密ssk文件啦…

虽然skinBuilder 支持编译加密的ssk文件,但是觉得效果不好,有时直接编译出的加密ssk文件无法正常使用。

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容