c#自定義窗體

我想美化窗體或者是其他控件、無外乎三種方式:

1、重寫WinForm自帶的控件视译,這需要熟練掌握GDI+ 技術(shù)、并且需要熟悉控件的各種事件及屬性归敬,還有些控件沒有太多可以重寫的東東酷含,

所以這種方式對于我而言有點(diǎn)難度,放棄汪茧![放棄的原因是有更好的方式]

2第美、使用第三方控件÷剿可惜大部分是需要付費(fèi)的什往,放棄!

3慌闭、使用皮膚控件别威。 以 “C# 皮膚控件” Google ,哇驴剔,好多啊… 突然間看到一個很熟悉的名字 “IrisSkin2.dll”省古,沒錯就是它,以前還用過的丧失,

但是由于當(dāng)時沒有好看的.ssk皮膚文件假夺,所以對它沒引起足夠的重視波势。而此時突然有了自己制作ssk文件的想法橄教,于是 借助Google強(qiáng)大的搜索引擎找到了“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

{

///

/// 設(shè)置窗體的圓角矩形

///

/// 需要設(shè)置的窗體

/// 圓角矩形的半徑

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 坐標(biāo)

///

public static int LOWORD(int value)

{

return value & 0xFFFF;

}

///

/// 取高位 Y 坐標(biāo)

///

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));

}

///

/// 畫九宮圖

///

/// 繪圖對象

/// 所需繪制的圖片

/// 目標(biāo)矩形

/// 來源矩形

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函數(shù)

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);// 指定標(biāo)題欄的Font鲁沥。

Application.Run(frm);

另外看SkinEngine重載的構(gòu)造函數(shù),還有如下的幾個耕魄。

嘿嘿画恰,第三個構(gòu)造函數(shù): 流… ?可以存儲加密ssk文件啦…

雖然skinBuilder 支持編譯加密的ssk文件,但是覺得效果不好吸奴,有時直接編譯出的加密ssk文件無法正常使用允扇。

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奄抽,隨后出現(xiàn)的幾起案子蔼两,更是在濱河造成了極大的恐慌甩鳄,老刑警劉巖逞度,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妙啃,居然都是意外死亡档泽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門揖赴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馆匿,“玉大人,你說我怎么就攤上這事燥滑〗ケ保” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵铭拧,是天一觀的道長赃蛛。 經(jīng)常有香客問我,道長搀菩,這世上最難降的妖魔是什么呕臂? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮肪跋,結(jié)果婚禮上歧蒋,老公的妹妹穿的比我還像新娘。我一直安慰自己州既,他們只是感情好谜洽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吴叶,像睡著了一般褥琐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晤郑,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天敌呈,我揣著相機(jī)與錄音贸宏,去河邊找鬼。 笑死磕洪,一個胖子當(dāng)著我的面吹牛吭练,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析显,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼鲫咽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谷异?” 一聲冷哼從身側(cè)響起分尸,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歹嘹,沒想到半個月后箩绍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尺上,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年材蛛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎抛。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卑吭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出马绝,到底是詐尸還是另有隱情豆赏,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布富稻,位于F島的核電站掷邦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唉窃。R本人自食惡果不足惜耙饰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纹份。 院中可真熱鬧苟跪,春花似錦、人聲如沸蔓涧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽元暴。三九已至篷扩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茉盏,已是汗流浹背鉴未。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工枢冤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铜秆。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓淹真,卻偏偏與公主長得像,于是被迫代替她去往敵國和親连茧。 傳聞我的和親對象是個殘疾皇子核蘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容