FYJ.Winform皮肤-窗体组件-仿QQ调色面板(一)-效果图
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(二)-基窗体
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(三)-主窗体
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(四)-MessageBox
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(五)-按钮1
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(六)-按钮2
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(七)-按钮3
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(八)-文本框
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(九)-有边框的PictureBox
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(十)-右键菜单
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(十一)-换颜色
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(十二)-换背景
FYJ.Winform皮肤-窗体组件-仿QQ调色面板(十三)-TabControl
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using FYJ.Winform.Util;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
namespace FYJ.Winform.Controls
{
public class TabControlEx:System.Windows.Forms.TabControl
{
private const int CLOSE_SIZE = 8;
public TabControlEx()
{
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
//清空控件
//绘制的方式OwnerDrawFixed表示由窗体绘制大小也一样
this.DrawMode = TabDrawMode.OwnerDrawFixed;
this.SizeMode = TabSizeMode.Fixed;
//this.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);
}
#region 属性
private bool _canClose = true;
public bool CanClose
{
get { return _canClose; }
set { _canClose = value; }
}
private Color _activeBorderColor =Color.FromArgb(47, 180, 240);
public Color ActiveBorderColor
{
get { return _activeBorderColor; }
set { _activeBorderColor = value; }
}
private Color _closeBorderColor = Color.FromArgb(47, 180, 240);
public Color CloseBorderColor
{
get { return _closeBorderColor; }
set { _closeBorderColor = value; }
}
public Color _normalBorderColor = Color.Gray;
public Color NormalBorderColor
{
get { return _normalBorderColor; }
set { _normalBorderColor = value; }
}
#endregion
internal void DrawTab(Graphics g, TabPage tabPage, int nIndex)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
// g.TextRenderingHint = TextRenderingHint.AntiAlias;
Rectangle recBounds = this.GetTabRect(nIndex);
bool bSelected = (this.SelectedIndex == nIndex);
Point[] pt = new Point[7];
pt[0] = new Point(recBounds.Left, recBounds.Bottom);
pt[1] = new Point(recBounds.Left, recBounds.Top + 3);
pt[2] = new Point(recBounds.Left + 3, recBounds.Top);
pt[3] = new Point(recBounds.Right - 3, recBounds.Top);
pt[4] = new Point(recBounds.Right, recBounds.Top + 3);
pt[5] = new Point(recBounds.Right, recBounds.Bottom);
pt[6] = new Point(recBounds.Left, recBounds.Bottom);
Brush br = new SolidBrush(tabPage.BackColor);
//默认的左右边框没有被选中时的标题边框颜色
g.DrawPolygon(new Pen(new SolidBrush(NormalBorderColor)), pt);
if (bSelected)
{
Pen pen = new Pen(Color.White);
//选中时背景
g.FillPolygon(new SolidBrush(Color.White), pt);
br.Dispose();
//左右被选中时颜色
g.DrawPolygon(new Pen(ActiveBorderColor), pt);
//选中时清除下边框线
g.DrawLine(new Pen(Color.White, 5f), recBounds.Left + 1, recBounds.Bottom - 2, recBounds.Right - 1, recBounds.Bottom - 2);
pen.Dispose();
if (CanClose)
{
int paddingRight = 8;
//画关闭符号
using (Pen objpen = new Pen(Color.Red, 2))
{
//"\"线
Point p1 = new Point(recBounds.X + recBounds.Width - CLOSE_SIZE - paddingRight, (recBounds.Height - CLOSE_SIZE) / 2);
Point p2 = new Point(recBounds.X + recBounds.Width - CLOSE_SIZE, ((recBounds.Height - CLOSE_SIZE) / 2) + CLOSE_SIZE);
g.DrawLine(objpen, p1, p2);
// "/"线
Point p3 = new Point(recBounds.X + recBounds.Width - paddingRight, (recBounds.Height - CLOSE_SIZE) / 2);
Point p4 = new Point(recBounds.X + recBounds.Width - CLOSE_SIZE - paddingRight, ((recBounds.Height - CLOSE_SIZE) / 2) + CLOSE_SIZE);
g.DrawLine(objpen, p3, p4);
}
if (isClose)
{
g.DrawRectangle(new Pen(new SolidBrush(CloseBorderColor)), new Rectangle(recBounds.X + recBounds.Width - CLOSE_SIZE - paddingRight - 2, (recBounds.Height - CLOSE_SIZE) / 2 - 2, 12, 12));
}
}
}
else
{
//没有选中时的下边框颜色
g.DrawLine(new Pen(NormalBorderColor), recBounds.Left + 1, recBounds.Bottom, recBounds.Right - 1, recBounds.Bottom);
}
// draw string
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
br = new SolidBrush(Color.Black);
g.DrawString(tabPage.Text, Font, br, recBounds, stringFormat);
br.Dispose();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
for (int i = 0; i < this.TabCount; i++)
DrawTab(e.Graphics, this.TabPages[i], i);
//Rectangle rect = this.ClientRectangle;
//GraphicsPath path = new GraphicsPath();
//int radius = 5;
//bool correction = true;
//int radiusCorrection = correction ? 1 : 0;
//path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
//path.AddArc(
// rect.Right - radius - radiusCorrection,
// rect.Y,
// radius,
// radius,
// 270,
// 90);
//path.AddLine(
// rect.Right - radiusCorrection, rect.Bottom - radiusCorrection,
// rect.X, rect.Bottom - radiusCorrection);
//this.Region = new Region(path);
}
private ToolTip toolTip1 = new ToolTip();
bool isClose = false;
protected override void OnCreateControl()
{
base.OnCreateControl();
toolTip1.SetToolTip(this, "关闭");
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (!CanClose)
return;
if (!isClose)
return;
if (e.Button == MouseButtons.Left && e.Clicks == 1)
{
int x = e.X, y = e.Y;
//计算关闭区域
Rectangle myTabRect = this.GetTabRect(this.SelectedIndex);
myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 8)-2, (myTabRect.Height - CLOSE_SIZE) / 2-2);
myTabRect.Width = CLOSE_SIZE+4;
myTabRect.Height = CLOSE_SIZE+4;
//如果鼠标在区域内就关闭选项卡
bool isCloseRect = x > myTabRect.X && x < myTabRect.Right
&& y > myTabRect.Y && y < myTabRect.Bottom;
if (isCloseRect == true)
{
this.TabPages.Remove(this.SelectedTab);
}
//else
// this.OnClick(e); 不要 否则会执行2次
}
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
this.Invalidate(false);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (!CanClose)
return;
int x = e.X, y = e.Y;
//计算关闭区域
Rectangle myTabRect = this.GetTabRect(this.SelectedIndex);
myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 8) - 2, (myTabRect.Height - CLOSE_SIZE) / 2 - 2);
myTabRect.Width = CLOSE_SIZE + 4;
myTabRect.Height = CLOSE_SIZE + 4;
//如果鼠标在区域内就关闭选项卡
bool isCloseRect = x > myTabRect.X && x < myTabRect.Right
&& y > myTabRect.Y && y < myTabRect.Bottom;
if (isCloseRect == true)
{
isClose = true;
}
else
{
isClose = false;
toolTip1.Hide(this);
}
this.Invalidate(new Rectangle(0,0,this.Width,this.ItemSize.Height), false);
}
/// /// 修改控件或窗体的边框,例如Textbox或是Form窗体
/// /// 消息 /// 控件对象 /// 边框像素 /// 边框颜色 internal void ResetBorderColor(Message m, Control control, int Nwidth, Color objcolor)
{
//根据颜色和边框像素取得一条线
System.Drawing.Pen pen = pen = new Pen(objcolor, Nwidth);
//得到当前的句柄
IntPtr hDC = Win32.GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
return;
}
if (pen != null)
{
//绘制边框
System.Drawing.Graphics g = Graphics.FromHdc(hDC);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//g.DrawRectangle(pen, 0, 0, control.Width-Nwidth , control.Height-Nwidth );
g.FillRectangle(new SolidBrush(Color.White),new Rectangle(0,0,5,this.Height)); //处理左边框
//g.FillRectangle(new SolidBrush(Color.White),new Rectangle(0,0,control.Width,5)); //处理上边框
g.FillRectangle(new SolidBrush(Color.White), new Rectangle(control.Width-5, 0, 5, control.Height)); //处理右边框
g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, control.Height-5, control.Width, 5)); //处理下边框
pen.Dispose();
}
//释放
Win32.ReleaseDC(m.HWnd, hDC);
}
/// /// 重新设置边框 this.SetStyle(ControlStyles.UserPaint, true); 加了可以不要这个了
/// /// 当前的Windows消息 protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
//if (m.Msg == 0xf || m.Msg == 0x133)
//{
// this.ResetBorderColor(m, this, 1, Color.Red);
//}
}
}
}
珂珂的个人博客 - 一个程序猿的个人网站
5/22/2014 6:11:13 PM 58.248.2....