轉帖|其它|編輯:郝浩|2008-09-22 14:28:37.000|閱讀 3714 次
概述:設計能自定義標題背景的TabControl
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
標準控件里面的TabControl是不能定義標題欄背景色的,在專業軟件開發中,使用標準控件顯然是不夠的,但是很多開發者習慣了使用現成控件或者是別人做好的控件,一提到要用GDI繪制控件就覺得麻煩。但是在.NET中,GDI+很好的封裝了原來使用不是很方便的GDI繪圖方法,似的現在用C#繪制專業效果的控件變得非常容易。希望這篇介紹能起到拋磚引玉的效果。
自定義的TabControl使用時的效果。標題欄背景和標題背景都可以用兩種顏色漸變效果,選中的標題字體和未選中的字體可以分別自定義。增加的屬性分布控制漸變的開始顏色和結束顏色,漸變的角度,以及兩種字體和字體顏色。
要自定義TabContrl中的繪制,首先要把DrawMode屬相設置為OwnerDrawFixed。接下來就是處理繪制的事件,DrawItem了
先定義要用到的變量:
Graphics g = e.Graphics;
Rectangle endPageRect = GetTabRect(TabPages.Count - 1); //最后一個標題欄的范圍
Rectangle TitleRect = GetTabRect(e.Index); //當前標題欄的范圍
Rectangle HeaderBackRect = Rectangle.Empty; //背景區域
switch (Alignment)
{
case TabAlignment.Top:
HeaderBackRect = new Rectangle(new Point(endPageRect.X + endPageRect.Width, endPageRect.Y),
new Size(Width - endPageRect.X - endPageRect.Width, endPageRect.Height));
break;
case TabAlignment.Bottom:
HeaderBackRect = new Rectangle(new Point(endPageRect.X + endPageRect.Width, endPageRect.Y),
new Size(Width - endPageRect.X - endPageRect.Width, endPageRect.Height));
break;
case TabAlignment.Left:
HeaderBackRect = new Rectangle(new Point(endPageRect.X, endPageRect.Y + endPageRect.Height),
new Size(endPageRect.Width, Height - endPageRect.Y - endPageRect.Height));
break;
case TabAlignment.Right:
HeaderBackRect = new Rectangle(new Point(endPageRect.X, endPageRect.Y + endPageRect.Height),
new Size(endPageRect.Width, Height - endPageRect.Y - endPageRect.Height));
break;
}
Brush TitleBackBrush = new LinearGradientBrush(
TitleRect, //漸變區域
titlebackcolor1, //漸變開始顏色
titlebackcolor2, //漸變結束顏色
titlebackangle); //漸變角度
Font font = headerfont;
StringFormat sf = new StringFormat();
sf.Alignment = titlealignment;
sf.LineAlignment = StringAlignment.Center;
Color fontcolor = headerfontcolor;
C#的圖形繪制工作是由Graphics類來完成的,但是這個類不能直接用new來創建,需要從繪制事件的參數或者調用要繪制的對象的CreateGraphic方法來得到。這里就直接使用的DrawItem事件的參數DrawItemEventArgs中的Graphics成員。
定義了幾個Rectangle變量,是為了下面的繪制區域做準備。
由于TabControl可能由于Alignment屬相定義不同,得到的背景區域的矩形也不同,所以要分別來定義HeaderBackRect 的區域。
Brush TitleBackBrush 是用于填充標題背景的背景色定義。這里是采用的漸變色:LinearGradientBrush來定義的。
font 是定義用于繪制標題文字的字體。好了,下面可以開始繪制了
if (SelectedIndex == e.Index) //如果繪制的標題就是選中的標題,則使用選中標題的字體,同時更新font和fontcolor
{
g.DrawRectangle(new Pen(TabPages[e.Index].BackColor), TitleRect); //消除選中標題的矩形方框
font = focusedheaderfont;
fontcolor = focusedheaderfontcolor;
}
Brush fontbrush = new SolidBrush(fontcolor);
//繪制標題文本
g.DrawString(TabPages[e.Index].Text, font, fontbrush, TitleRect, sf);
//繪制背景
if (HeaderBackRect != Rectangle.Empty)
{
Brush HeaderBackBrush = new LinearGradientBrush(
HeaderBackRect,
HeaderBackColor1,
HeaderBackColor2,
headerbackangle);
g.FillRectangle(HeaderBackBrush, HeaderBackRect);
}
最后來看下效果:

本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:DIY部落