导读部分
-------------------------------------------------------------------------------------------------------------
C#仿QQ皮肤-实现原理系列文章导航
http://www.sufeinet.com/forum.php?mod=viewthread&tid=2
其它这次的这个控件的改变并是太大,只是从选中与不选中,和图标上下了一些功夫。
大家先看一下效果吧
这个图片上没有图标,是可以直接设置的这个大家等下下载一下我的源代码,可以自己设置一下。
public
partial
class
CTabControl : System.Windows.Forms.TabControl
通过上面一行代码我们可以看到这个控件是继承Windows的TabContrl而来的,这也就是说Windows自带的控件所具有的功能在这里都会自动继承而来。
我们先来看看 DrawControl(Graphics g)方法。
internal
void
DrawControl(Graphics g)
{
if
(
!
Visible)
return
;
//
Rectangle TabControlArea = new Rectangle(2, 2, this.Width - 3, this.Height - 2);
Rectangle TabControlArea
=
this
.ClientRectangle;
Rectangle TabArea
=
new
Rectangle(
3
,
24
,
this
.ClientRectangle.Width
-
7
,
this
.ClientRectangle.Height
-
28
);
//
this.DisplayRectangle;
//
----------------------------
//
控件内部颜色
Brush br
=
new
SolidBrush(Color.Transparent);
g.FillRectangle(br, TabControlArea);
br.Dispose();
//
----------------------------
//
----------------------------
//
draw border
int
nDelta
=
SystemInformation.Border3DSize.Width;
//
默认的控件边框颜色
Pen border
=
new
Pen(SkinHelp.Defalutborder);
g.DrawRectangle(border, TabArea);
border.Dispose();
//
----------------------------
//
----------------------------
//
clip region for drawing tabs
Region rsaved
=
g.Clip;
Rectangle rreg;
int
nWidth
=
TabArea.Width
+
nMargin;
if
(bUpDown)
{
//
exclude updown control for painting
if
(Win32.IsWindowVisible(scUpDown.Handle))
{
Rectangle rupdown
=
new
Rectangle();
Win32.GetWindowRect(scUpDown.Handle,
ref
rupdown);
Rectangle rupdown2
=
this
.RectangleToClient(rupdown);
nWidth
=
rupdown2.X;
}
}
rreg
=
new
Rectangle(TabArea.Left, TabControlArea.Top, nWidth
-
nMargin, TabControlArea.Height);
g.SetClip(rreg);
//
draw tabs
for
(
int
i
=
0
; i
<
this
.TabCount; i
++
)
DrawTab(g,
this
.TabPages[i], i);
g.Clip
=
rsaved;
//
----------------------------
//
yuterz
//
----------------------------
//
draw background to cover flat border areas
if
(
this
.SelectedTab
!=
null
)
{
TabPage tabPage
=
this
.SelectedTab;
Color color
=
tabPage.BackColor;
//
border = new Pen(color);
border
=
new
Pen(Color.Green);
TabArea.Offset(
1
,
1
);
TabArea.Width
-=
2
;
TabArea.Height
-=
2
;
//
g.DrawRectangle(border, TabArea);
TabArea.Width
-=
1
;
TabArea.Height
-=
1
;
//
g.DrawRectangle(border, TabArea);
border.Dispose();
}
//
----------------------------
}
在这里我设置了默认的背景色和边框的颜色
当然大家也要吧自己设置
只要修改相应代码就行了,看注释就明白了。
这些完成了我们再来看看绘制Tab的事件
internal
void
DrawTab(Graphics g, TabPage tabPage,
int
nIndex)
{
Rectangle recBounds
=
this
.GetTabRect(nIndex);
RectangleF tabTextArea
=
(RectangleF)
this
.GetTabRect(nIndex);
bool
bSelected
=
(
this
.SelectedIndex
==
nIndex);
Point[] pt
=
new
Point[
7
];
if
(
this
.Alignment
==
TabAlignment.Top)
{
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);
}
else
{
pt[
0
]
=
new
Point(recBounds.Left, recBounds.Top);
pt[
1
]
=
new
Point(recBounds.Right, recBounds.Top);
pt[
2
]
=
new
Point(recBounds.Right, recBounds.Bottom
-
3
);
pt[
3
]
=
new
Point(recBounds.Right
-
3
, recBounds.Bottom);
pt[
4
]
=
new
Point(recBounds.Left
+
3
, recBounds.Bottom);
pt[
5
]
=
new
Point(recBounds.Left, recBounds.Bottom
-
3
);
pt[
6
]
=
new
Point(recBounds.Left, recBounds.Top);
}
//
----------------------------
//
fill this tab with background color
//
Brush br = new SolidBrush(tabPage.BackColor);
Brush br
=
new
SolidBrush(Color.White);
//
----------------------------
//
----------------------------
//
draw border
//
g.DrawRectangle(SystemPens.ControlDark, recBounds);
//
g.DrawPolygon(SystemPens.ControlDark, pt);
//
默认的左右边框没有被选中时的标题边框颜色
g.DrawPolygon(
new
Pen(SkinHelp.ControlBorderBackColor), pt);
if
(bSelected)
{
//
----------------------------
//
clear bottom lines
Pen pen
=
new
Pen(tabPage.BackColor);
switch
(
this
.Alignment)
{
case
TabAlignment.Top:
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Bottom, recBounds.Right
-
1
, recBounds.Bottom);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Bottom
+
1
, recBounds.Right
-
1
, recBounds.Bottom
+
1
);
break
;
case
TabAlignment.Bottom:
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top, recBounds.Right
-
1
, recBounds.Top);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top
-
1
, recBounds.Right
-
1
, recBounds.Top
-
1
);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top
-
2
, recBounds.Right
-
1
, recBounds.Top
-
2
);
break
;
}
g.FillPolygon(br, pt);
br.Dispose();
//
左右被选中时颜色
g.DrawPolygon(
new
Pen(Color.Red), pt);
g.DrawLine(
new
Pen(Color.White, 2f), recBounds.Left
+
1
, recBounds.Bottom
+
1
, recBounds.Right
-
1
, recBounds.Bottom
+
1
);
pen.Dispose();
//
----------------------------
}
else
{
//
没有选中时的下边框颜色
g.DrawLine(
new
Pen(SkinHelp.ControlBorderBackColor), recBounds.Left
+
1
, recBounds.Bottom, recBounds.Right
-
1
, recBounds.Bottom);
}
if
((tabPage.ImageIndex
>=
0
)
&&
(ImageList
!=
null
)
&&
(ImageList.Images[tabPage.ImageIndex]
!=
null
))
{
int
nLeftMargin
=
8
;
int
nRightMargin
=
2
;
Image img
=
ImageList.Images[tabPage.ImageIndex];
Rectangle rimage
=
new
Rectangle(recBounds.X
+
nLeftMargin, recBounds.Y
+
1
, img.Width, img.Height);
//
adjust rectangles
float
nAdj
=
(
float
)(nLeftMargin
+
img.Width
+
nRightMargin);
rimage.Y
+=
(recBounds.Height
-
img.Height)
/
2
;
tabTextArea.X
+=
nAdj;
tabTextArea.Width
-=
nAdj;
//
draw icon
g.DrawImage(img, rimage);
}
//
draw string
StringFormat stringFormat
=
new
StringFormat();
stringFormat.Alignment
=
StringAlignment.Center;
stringFormat.LineAlignment
=
StringAlignment.Center;
br
=
new
SolidBrush(SkinHelp.FontColor);
g.DrawString(tabPage.Text, Font, br, tabTextArea, stringFormat);
if
(nIndex
==
0
)
{
//
最左上角标题上的竖线
Pen pen
=
new
Pen(SkinHelp.ControlBorderBackColor);
g.DrawLine(pen,
3
,
5
,
3
, recBounds.Height
+
3
);
}
}
在这里主要是给左右没有选中,和选中时的标题加颜色。还有就是最左上角地那条线的颜色。大家可以根据我们代码进行修改,
找到适应自己软件或者是自己喜欢的颜色进行配置。我这里是用一个红色来代替,这样主要是为了色差大,容易区分。
接下来我们还要对上面的ICON进行处理处理访求 如下
internal
void
DrawIcons(Graphics g)
{
if
((leftRightImages
==
null
)
||
(leftRightImages.Images.Count
!=
4
))
return
;
//
calc positions
Rectangle TabControlArea
=
this
.ClientRectangle;
Rectangle r0
=
new
Rectangle();
Win32.GetClientRect(scUpDown.Handle,
ref
r0);
//
当Tab多时背景颜色
Brush br
=
new
SolidBrush(Color.Transparent);
g.FillRectangle(br, r0);
br.Dispose();
//
当Tab多时边框颜色
Pen border
=
new
Pen(SkinHelp.ControlBorderBackColor);
Rectangle rborder
=
new
Rectangle(
1
,
1
,
36
,
19
);
rborder.Inflate(
-
1
,
-
1
);
g.DrawRectangle(border, rborder);
border.Dispose();
int
nMiddle
=
(r0.Width
/
2
);
int
nTop
=
(r0.Height
-
16
)
/
2
;
int
nLeft
=
(nMiddle
-
16
)
/
2
;
Rectangle r1
=
new
Rectangle(nLeft, nTop,
16
,
16
);
Rectangle r2
=
new
Rectangle(nMiddle
+
nLeft, nTop,
16
,
16
);
//
draw buttons
Image img
=
leftRightImages.Images[
1
];
if
(img
!=
null
)
{
if
(
this
.TabCount
>
0
)
{
Rectangle r3
=
this
.GetTabRect(
0
);
if
(r3.Left
<
TabControlArea.Left)
g.DrawImage(img, r1);
else
{
img
=
leftRightImages.Images[
3
];
if
(img
!=
null
)
g.DrawImage(img, r1);
}
}
}
img
=
leftRightImages.Images[
0
];
if
(img
!=
null
)
{
if
(
this
.TabCount
>
0
)
{
Rectangle r3
=
this
.GetTabRect(
this
.TabCount
-
1
);
if
(r3.Right
>
(TabControlArea.Width
-
r0.Width))
g.DrawImage(img, r2);
else
{
img
=
leftRightImages.Images[
2
];
if
(img
!=
null
)
g.DrawImage(img, r2);
}
}
}
方法很简单主要是处理一下不同图标放上去的效果。会根据图标的不同而适应不同的效果。
感觉这个控件的语言可表达性不强主要是看代码,我把这个类的相关代码放上来大家看看,多多交流,多提保定意见。
感谢大家的支持。
using
System;
using
System.Collections;
using
System.ComponentModel;
using
System.Drawing;
using
System.Drawing.Drawing2D;
using
System.Data;
using
System.Windows.Forms;
using
System.Drawing.Design;
using
System.ComponentModel.Design;
using
System.Runtime.InteropServices;
using
System.Diagnostics;
using
System.IO;
using
bxyztSkin.Properties;
namespace
bxyztSkin.CControls
{
public
partial
class
CTabControl : System.Windows.Forms.TabControl
{
private
System.ComponentModel.Container components
=
null
;
private
SubClass scUpDown
=
null
;
private
bool
bUpDown;
private
ImageList leftRightImages
=
null
;
private
const
int
nMargin
=
5
;
private
Color mBackColor
=
SystemColors.Control;
public
CTabControl()
{
//
This call is required by the Windows.Forms Form Designer.
InitializeComponent();
//
double buffering
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
);
//
this.BackColor = Color.Transparent;
bUpDown
=
false
;
this
.ControlAdded
+=
new
ControlEventHandler(FlatTabControl_ControlAdded);
this
.ControlRemoved
+=
new
ControlEventHandler(FlatTabControl_ControlRemoved);
this
.SelectedIndexChanged
+=
new
EventHandler(FlatTabControl_SelectedIndexChanged);
leftRightImages
=
new
ImageList();
//
leftRightImages.ImageSize = new Size(16, 16);
//
default
Bitmap updownImage
=
new
Bitmap(Resources.TabIcons);
if
(updownImage
!=
null
)
{
updownImage.MakeTransparent(Color.White);
leftRightImages.Images.AddStrip(updownImage);
}
}
public
void
ChangeSkinColor()
{
IntPtr hDC
=
Win32.GetWindowDC(
this
.Handle);
Graphics gdc
=
Graphics.FromHdc(hDC);
for
(
int
i
=
0
; i
<
this
.TabCount; i
++
)
DrawTab(gdc,
this
.TabPages[i], i);
Win32.ReleaseDC(
this
.Handle, hDC);
gdc.Dispose();
}
protected
override
void
Dispose(
bool
disposing)
{
if
(disposing)
{
if
(components
!=
null
)
{
components.Dispose();
}
leftRightImages.Dispose();
}
base
.Dispose(disposing);
}
protected
override
void
OnPaint(PaintEventArgs e)
{
base
.OnPaint(e);
DrawControl(e.Graphics);
}
protected
override
void
OnResize(EventArgs e)
{
base
.OnResize(e);
GraphicsPath g
=
new
GraphicsPath();
g.AddRectangle(
new
Rectangle(
3
,
2
,
this
.Width
-
6
,
this
.Height
-
5
));
this
.Region
=
new
Region(g);
}
internal
void
DrawControl(Graphics g)
{
if
(
!
Visible)
return
;
//
Rectangle TabControlArea = new Rectangle(2, 2, this.Width - 3, this.Height - 2);
Rectangle TabControlArea
=
this
.ClientRectangle;
Rectangle TabArea
=
new
Rectangle(
3
,
24
,
this
.ClientRectangle.Width
-
7
,
this
.ClientRectangle.Height
-
28
);
//
this.DisplayRectangle;
//
----------------------------
//
控件内部颜色
Brush br
=
new
SolidBrush(Color.Transparent);
g.FillRectangle(br, TabControlArea);
br.Dispose();
//
----------------------------
//
----------------------------
//
draw border
int
nDelta
=
SystemInformation.Border3DSize.Width;
//
默认的控件边框颜色
Pen border
=
new
Pen(SkinHelp.Defalutborder);
g.DrawRectangle(border, TabArea);
border.Dispose();
//
----------------------------
//
----------------------------
//
clip region for drawing tabs
Region rsaved
=
g.Clip;
Rectangle rreg;
int
nWidth
=
TabArea.Width
+
nMargin;
if
(bUpDown)
{
//
exclude updown control for painting
if
(Win32.IsWindowVisible(scUpDown.Handle))
{
Rectangle rupdown
=
new
Rectangle();
Win32.GetWindowRect(scUpDown.Handle,
ref
rupdown);
Rectangle rupdown2
=
this
.RectangleToClient(rupdown);
nWidth
=
rupdown2.X;
}
}
rreg
=
new
Rectangle(TabArea.Left, TabControlArea.Top, nWidth
-
nMargin, TabControlArea.Height);
g.SetClip(rreg);
//
draw tabs
for
(
int
i
=
0
; i
<
this
.TabCount; i
++
)
DrawTab(g,
this
.TabPages[i], i);
g.Clip
=
rsaved;
//
----------------------------
//
yuterz
//
----------------------------
//
draw background to cover flat border areas
if
(
this
.SelectedTab
!=
null
)
{
TabPage tabPage
=
this
.SelectedTab;
Color color
=
tabPage.BackColor;
//
border = new Pen(color);
border
=
new
Pen(Color.Green);
TabArea.Offset(
1
,
1
);
TabArea.Width
-=
2
;
TabArea.Height
-=
2
;
//
g.DrawRectangle(border, TabArea);
TabArea.Width
-=
1
;
TabArea.Height
-=
1
;
//
g.DrawRectangle(border, TabArea);
border.Dispose();
}
//
----------------------------
}
internal
void
DrawTab(Graphics g, TabPage tabPage,
int
nIndex)
{
Rectangle recBounds
=
this
.GetTabRect(nIndex);
RectangleF tabTextArea
=
(RectangleF)
this
.GetTabRect(nIndex);
bool
bSelected
=
(
this
.SelectedIndex
==
nIndex);
Point[] pt
=
new
Point[
7
];
if
(
this
.Alignment
==
TabAlignment.Top)
{
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);
}
else
{
pt[
0
]
=
new
Point(recBounds.Left, recBounds.Top);
pt[
1
]
=
new
Point(recBounds.Right, recBounds.Top);
pt[
2
]
=
new
Point(recBounds.Right, recBounds.Bottom
-
3
);
pt[
3
]
=
new
Point(recBounds.Right
-
3
, recBounds.Bottom);
pt[
4
]
=
new
Point(recBounds.Left
+
3
, recBounds.Bottom);
pt[
5
]
=
new
Point(recBounds.Left, recBounds.Bottom
-
3
);
pt[
6
]
=
new
Point(recBounds.Left, recBounds.Top);
}
//
----------------------------
//
fill this tab with background color
//
Brush br = new SolidBrush(tabPage.BackColor);
Brush br
=
new
SolidBrush(Color.White);
//
----------------------------
//
----------------------------
//
draw border
//
g.DrawRectangle(SystemPens.ControlDark, recBounds);
//
g.DrawPolygon(SystemPens.ControlDark, pt);
//
默认的左右边框没有被选中时的标题边框颜色
g.DrawPolygon(
new
Pen(SkinHelp.ControlBorderBackColor), pt);
if
(bSelected)
{
//
----------------------------
//
clear bottom lines
Pen pen
=
new
Pen(tabPage.BackColor);
switch
(
this
.Alignment)
{
case
TabAlignment.Top:
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Bottom, recBounds.Right
-
1
, recBounds.Bottom);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Bottom
+
1
, recBounds.Right
-
1
, recBounds.Bottom
+
1
);
break
;
case
TabAlignment.Bottom:
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top, recBounds.Right
-
1
, recBounds.Top);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top
-
1
, recBounds.Right
-
1
, recBounds.Top
-
1
);
g.DrawLine(pen, recBounds.Left
+
1
, recBounds.Top
-
2
, recBounds.Right
-
1
, recBounds.Top
-
2
);
break
;
}
g.FillPolygon(br, pt);
br.Dispose();
//
左右被选中时颜色
g.DrawPolygon(
new
Pen(Color.Red), pt);
g.DrawLine(
new
Pen(Color.White, 2f), recBounds.Left
+
1
, recBounds.Bottom
+
1
, recBounds.Right
-
1
, recBounds.Bottom
+
1
);
pen.Dispose();
//
----------------------------
}
else
{
//
没有选中时的下边框颜色
g.DrawLine(
new
Pen(SkinHelp.ControlBorderBackColor), recBounds.Left
+
1
, recBounds.Bottom, recBounds.Right
-
1
, recBounds.Bottom);
}
if
((tabPage.ImageIndex
>=
0
)
&&
(ImageList
!=
null
)
&&
(ImageList.Images[tabPage.ImageIndex]
!=
null
))
{
int
nLeftMargin
=
8
;
int
nRightMargin
=
2
;
Image img
=
ImageList.Images[tabPage.ImageIndex];
Rectangle rimage
=
new
Rectangle(recBounds.X
+
nLeftMargin, recBounds.Y
+
1
, img.Width, img.Height);
//
adjust rectangles
float
nAdj
=
(
float
)(nLeftMargin
+
img.Width
+
nRightMargin);
rimage.Y
+=
(recBounds.Height
-
img.Height)
/
2
;
tabTextArea.X
+=
nAdj;
tabTextArea.Width
-=
nAdj;
//
draw icon
g.DrawImage(img, rimage);
}
//
draw string
StringFormat stringFormat
=
new
StringFormat();
stringFormat.Alignment
=
StringAlignment.Center;
stringFormat.LineAlignment
=
StringAlignment.Center;
br
=
new
SolidBrush(SkinHelp.FontColor);
g.DrawString(tabPage.Text, Font, br, tabTextArea, stringFormat);
if
(nIndex
==
0
)
{
//
最左上角标题上的竖线
Pen pen
=
new
Pen(SkinHelp.ControlBorderBackColor);
g.DrawLine(pen,
3
,
5
,
3
, recBounds.Height
+
3
);
}
}
internal
void
DrawIcons(Graphics g)
{
if
((leftRightImages
==
null
)
||
(leftRightImages.Images.Count
!=
4
))
return
;
//
calc positions
Rectangle TabControlArea
=
this
.ClientRectangle;
Rectangle r0
=
new
Rectangle();
Win32.GetClientRect(scUpDown.Handle,
ref
r0);
//
当Tab多时背景颜色
Brush br
=
new
SolidBrush(Color.Transparent);
g.FillRectangle(br, r0);
br.Dispose();
//
当Tab多时边框颜色
Pen border
=
new
Pen(SkinHelp.ControlBorderBackColor);
Rectangle rborder
=
new
Rectangle(
1
,
1
,
36
,
19
);
rborder.Inflate(
-
1
,
-
1
);
g.DrawRectangle(border, rborder);
border.Dispose();
int
nMiddle
=
(r0.Width
/
2
);
int
nTop
=
(r0.Height
-
16
)
/
2
;
int
nLeft
=
(nMiddle
-
16
)
/
2
;
Rectangle r1
=
new
Rectangle(nLeft, nTop,
16
,
16
);
Rectangle r2
=
new
Rectangle(nMiddle
+
nLeft, nTop,
16
,
16
);
//
draw buttons
Image img
=
leftRightImages.Images[
1
];
if
(img
!=
null
)
{
if
(
this
.TabCount
>
0
)
{
Rectangle r3
=
this
.GetTabRect(
0
);
if
(r3.Left
<
TabControlArea.Left)
g.DrawImage(img, r1);
else
{
img
=
leftRightImages.Images[
3
];
if
(img
!=
null
)
g.DrawImage(img, r1);
}
}
}
img
=
leftRightImages.Images[
0
];
if
(img
!=
null
)
{
if
(
this
.TabCount
>
0
)
{
Rectangle r3
=
this
.GetTabRect(
this
.TabCount
-
1
);
if
(r3.Right
>
(TabControlArea.Width
-
r0.Width))
g.DrawImage(img, r2);
else
{
img
=
leftRightImages.Images[
2
];
if
(img
!=
null
)
g.DrawImage(img, r2);
}
}
}
}
protected
override
void
OnCreateControl()
{
base
.OnCreateControl();
foreach
(TabPage page
in
this
.TabPages)
{
page.BackColor
=
Color.White;
}
FindUpDown();
}
private
void
FlatTabControl_ControlAdded(
object
sender, ControlEventArgs e)
{
FindUpDown();
UpdateUpDown();
}
private
void
FlatTabControl_ControlRemoved(
object
sender, ControlEventArgs e)
{
FindUpDown();
UpdateUpDown();
}
private
void
FlatTabControl_SelectedIndexChanged(
object
sender, EventArgs e)
{
UpdateUpDown();
Invalidate();
//
we need to update border and background colors
}
private
void
FindUpDown()
{
bool
bFound
=
false
;
//
find the UpDown control
IntPtr pWnd
=
Win32.GetWindow(
this
.Handle, Win32.GW_CHILD);
while
(pWnd
!=
IntPtr.Zero)
{
//
Get the window class name
char
[] className
=
new
char
[
33
];
int
length
=
Win32.GetClassName(pWnd, className,
32
);
string
s
=
new
string
(className,
0
, length);
if
(s
==
"
msctls_updown32
"
)
{
bFound
=
true
;
if
(
!
bUpDown)
{
//
Subclass it
this
.scUpDown
=
new
SubClass(pWnd,
true
);
this
.scUpDown.SubClassedWndProc
+=
new
SubClass.SubClassWndProcEventHandler(scUpDown_SubClassedWndProc);
bUpDown
=
true
;
}
break
;
}
pWnd
=
Win32.GetWindow(pWnd, Win32.GW_HWNDNEXT);
}
if
((
!
bFound)
&&
(bUpDown))
bUpDown
=
false
;
}
private
void
UpdateUpDown()
{
if
(bUpDown)
{
if
(Win32.IsWindowVisible(scUpDown.Handle))
{
Rectangle rect
=
new
Rectangle();
Win32.GetClientRect(scUpDown.Handle,
ref
rect);
Win32.InvalidateRect(scUpDown.Handle,
ref
rect,
true
);
}
}
}
#region
scUpDown_SubClassedWndProc Event Handler
private
int
scUpDown_SubClassedWndProc(
ref
Message m)
{
switch
(m.Msg)
{
case
Win32.WM_PAINT:
{
//
redraw
IntPtr hDC
=
Win32.GetWindowDC(scUpDown.Handle);
Graphics g
=
Graphics.FromHdc(hDC);
DrawIcons(g);
g.Dispose();
Win32.ReleaseDC(scUpDown.Handle, hDC);
//
return 0 (processed)
m.Result
=
IntPtr.Zero;
//
validate current rect
Rectangle rect
=
new
Rectangle();
Win32.GetClientRect(scUpDown.Handle,
ref
rect);
Win32.ValidateRect(scUpDown.Handle,
ref
rect);
}
return
1
;
}
return
0
;
}
#endregion
///
<summary>
///
重新设置边框
///
</summary>
///
<param name="m">
当前的Windows消息
</param>
protected
override
void
WndProc(
ref
Message m)
{
base
.WndProc(
ref
m);
if
(m.Msg
==
0xf
||
m.Msg
==
0x133
)
{
SkinHelp.ResetBorderColor(m,
this
,
1
, SkinHelp.Defalutborder);
}
}
#region
Component Designer generated code
///
<summary>
///
Required method for Designer support - do not modify
///
the contents of this method with the code editor.
///
</summary>
private
void
InitializeComponent()
{
components
=
new
System.ComponentModel.Container();
}
#endregion
#region
Properties
[Editor(
typeof
(TabpageExCollectionEditor),
typeof
(UITypeEditor))]
public
new
TabPageCollection TabPages
{
get
{
return
base
.TabPages;
}
}
new
public
TabAlignment Alignment
{
get
{
return
base
.Alignment; }
set
{
TabAlignment ta
=
value;
if
((ta
!=
TabAlignment.Top)
&&
(ta
!=
TabAlignment.Bottom))
ta
=
TabAlignment.Top;
base
.Alignment
=
ta;
}
}
[Browsable(
false
)]
new
public
bool
Multiline
{
get
{
return
base
.Multiline; }
set
{
base
.Multiline
=
false
; }
}
[Browsable(
true
)]
new
public
Color myBackColor
{
get
{
return
mBackColor; }
set
{ mBackColor
=
value;
this
.Invalidate(); }
}
#endregion
#region
TabpageExCollectionEditor
internal
class
TabpageExCollectionEditor : CollectionEditor
{
public
TabpageExCollectionEditor(System.Type type)
:
base
(type)
{
}
protected
override
Type CreateCollectionItemType()
{
return
typeof
(TabPage);
}
}
#endregion
}
}