专栏首页跟着阿笨一起玩NETTabControl控件的美化

TabControl控件的美化

文件下载:http://files.cnblogs.com/zfanlong1314/TabControlEX.rar

本文转载:http://www.cnblogs.com/lmlblog/archive/2012/03/29/TabControl.html

  最近因项目需要 所以就到网上找了一个美化过的TabControl控件   只不过这个控件没有实现TabPage的关闭功能 所以就自己添加了一个关闭功能

好了废话不多说 

直接贴代码

UpDownButtonPaintEventArgs 类的代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Windows.Forms;
 5 using System.Drawing;
 6 
 7 namespace StyleWinForm.TabControls
 8 {
 9     public delegate void UpDownButtonPaintEventHandler(
10         object sender,
11         UpDownButtonPaintEventArgs e);
12 
13     public class UpDownButtonPaintEventArgs : PaintEventArgs
14     {
15         private bool _mouseOver;
16         private bool _mousePress;
17         private bool _mouseInUpButton;
18 
19         public UpDownButtonPaintEventArgs(
20             Graphics graphics,
21             Rectangle clipRect,
22             bool mouseOver,
23             bool mousePress,
24             bool mouseInUpButton)
25             : base(graphics, clipRect)
26         {
27             _mouseOver = mouseOver;
28             _mousePress = mousePress;
29             _mouseInUpButton = mouseInUpButton;
30         }
31 
32         public bool MouseOver
33         {
34             get { return _mouseOver; }
35         }
36 
37         public bool MousePress
38         {
39             get { return _mousePress; }
40         }
41 
42         public bool MouseInUpButton
43         {
44             get { return _mouseInUpButton; }
45         }
46     }
47 }

NativeMethods 类的代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Runtime.InteropServices;
 5 using System.Drawing;
 6 
 7 namespace StyleWinForm.TabControls
 8 {
 9     internal class NativeMethods
10     {
11         public const int WM_PAINT = 0xF;
12 
13         public const int VK_LBUTTON = 0x1;
14         public const int VK_RBUTTON = 0x2;
15 
16         private const int TCM_FIRST = 0x1300;
17         public const int TCM_GETITEMRECT = (TCM_FIRST + 10);
18 
19         public static readonly IntPtr TRUE = new IntPtr(1);
20 
21         [StructLayout(LayoutKind.Sequential)]
22         public struct PAINTSTRUCT
23         {
24             internal IntPtr hdc;
25             internal int fErase;
26             internal RECT rcPaint;
27             internal int fRestore;
28             internal int fIncUpdate;
29             internal int Reserved1;
30             internal int Reserved2;
31             internal int Reserved3;
32             internal int Reserved4;
33             internal int Reserved5;
34             internal int Reserved6;
35             internal int Reserved7;
36             internal int Reserved8;
37         }
38 
39         [StructLayout(LayoutKind.Sequential)]
40         public struct RECT
41         {
42             internal RECT(int X, int Y, int Width, int Height)
43             {
44                 this.Left = X;
45                 this.Top = Y;
46                 this.Right = Width;
47                 this.Bottom = Height;
48             }
49             internal int Left;
50             internal int Top;
51             internal int Right;
52             internal int Bottom;
53         }
54 
55         [DllImport("user32.dll")]
56         public static extern IntPtr FindWindowEx(
57             IntPtr hwndParent,
58             IntPtr hwndChildAfter,
59             string lpszClass,
60             string lpszWindow);
61 
62         [DllImport("user32.dll")]
63         public static extern IntPtr BeginPaint(IntPtr hWnd, ref PAINTSTRUCT ps);
64 
65         [DllImport("user32.dll")]
66         [return: MarshalAs(UnmanagedType.Bool)]
67         public static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT ps);
68 
69         [DllImport("user32.dll")]
70         public static extern short GetKeyState(int nVirtKey);
71 
72         [DllImport("user32.dll")]
73         public static extern IntPtr SendMessage(
74             IntPtr hWnd, int Msg, int wParam, ref RECT lParam);
75 
76         [DllImport("user32.dll")]
77         [return: MarshalAs(UnmanagedType.Bool)]
78         public static extern bool GetCursorPos(ref Point lpPoint);
79 
80         [DllImport("user32.dll")]
81         public extern static int OffsetRect(ref RECT lpRect, int x, int y);
82 
83         [DllImport("user32.dll")]
84         [return: MarshalAs(UnmanagedType.Bool)]
85         public static extern bool PtInRect([In] ref RECT lprc, Point pt);
86 
87         [DllImport("user32.dll")]
88         [return: MarshalAs(UnmanagedType.Bool)]
89         public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
90 
91         [DllImport("user32.dll")]
92         [return: MarshalAs(UnmanagedType.Bool)]
93         public static extern bool GetClientRect(IntPtr hWnd, ref RECT r);
94 
95         [DllImport("User32.dll", CharSet = CharSet.Auto)]
96         public static extern bool IsWindowVisible(IntPtr hwnd);
97     }
98 }

TabControl组件的代码

+ View Code

 1  #region 为TabControl添加关闭按钮
 2         const int CLOSE_SIZE = 15;
 3         //关闭按钮功能
 4         private void MainTabControl_MouseDown(object sender, MouseEventArgs e)
 5         {
 6             if (tabContent.SelectedTab.Name != "tabPageWelcome")
 7             {
 8                 if (e.Button == MouseButtons.Left)
 9                 {
10                     int x = e.X, y = e.Y;
11                     //计算关闭区域   
12                     Rectangle myTabRect = this.tabContent.GetTabRect(this.tabContent.SelectedIndex);
13 
14                     myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
15                     myTabRect.Width = CLOSE_SIZE;
16                     myTabRect.Height = CLOSE_SIZE;
17 
18                     //如果鼠标在区域内就关闭选项卡   
19                     bool isClose = x > myTabRect.X && x < myTabRect.Right && y > myTabRect.Y && y < myTabRect.Bottom;
20                     if (isClose == true)
21                     {
22                         this.tabContent.TabPages.Remove(this.tabContent.SelectedTab);
23                     }
24                 }
25             }
26         }
27         #endregion

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • @@IDENTITY与SCOPE_IDENTITY() 及IDENT_CURRENT 的区别

    本文转载:http://www.cnblogs.com/lovemyth/archive/2007/03/14/674584.html

    跟着阿笨一起玩NET
  • T4模板语法

    T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。

    跟着阿笨一起玩NET
  • C#基础知识之方法重载总结

    方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术。

    跟着阿笨一起玩NET
  • 那些年我们用Java写过的小游戏 --- 快速击键系统

    训练技能点 面向对象设计的思想 使用类图理解类的关系 类的封装 构造方法的使用 this、static关键字的使用 需求概述 根据输入速率和正确率将玩家分为不同...

    房上的猫
  • Java基础知识笔记四(详细)

    在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

    用户7656790
  • 3085 相同的后三位

    3085 相同的后三位 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 青铜 Bronze 题目描述 Description 对...

    attack
  • C# 多态性

    多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

    landv
  • Android开发笔记(十四)圆弧进度动画CircleAnimation

    一个好看的APP,都有不少精致的动画效果。熟练运用各种动画技术,可让我们的APP灼灼生辉。Android在技术上把动画分为了...

    用户4464237
  • 基于Java swing开发的雷霆战机

    时间静止不是简史
  • [C#2] 4-可空类型、静态类

    1. 可空类型 值类型是不可以为null的[即不可为空值], 假如我们想让它为null呢[比如它对映这数据库中的某个表的某个字段,但是这个字段是null]。 自...

    blackheart

扫码关注云+社区

领取腾讯云代金券