SHOW:
|
|
- or go back to the newest paste.
| 1 | using System; | |
| 2 | using System.Collections.Generic; | |
| 3 | using System.ComponentModel; | |
| 4 | using System.Diagnostics; | |
| 5 | using System.Linq; | |
| 6 | using System.Text; | |
| 7 | using System.Windows.Forms; | |
| 8 | using System.Drawing; | |
| 9 | ||
| 10 | namespace Splitter | |
| 11 | {
| |
| 12 | public enum Direction | |
| 13 | {
| |
| 14 | Right = 0, | |
| 15 | Left, | |
| 16 | Up, | |
| 17 | Down | |
| 18 | } | |
| 19 | ||
| 20 | public class ACSplitter : SplitContainer | |
| 21 | {
| |
| 22 | public ACSplitter() | |
| 23 | {
| |
| 24 | //InitializeComponent(); | |
| 25 | SetStyle(ControlStyles.ResizeRedraw, true); | |
| 26 | this.KeyPress += new KeyPressEventHandler(ACSplitter_KeyPress); | |
| 27 | this.KeyUp +=new KeyEventHandler(ACSplitter_KeyUp); | |
| 28 | } | |
| 29 | ||
| 30 | #region private properties | |
| 31 | ||
| 32 | private System.Drawing.Color hotColor = CalculateColor(SystemColors.Highlight, SystemColors.Window, 70); | |
| 33 | ||
| 34 | #endregion | |
| 35 | ||
| 36 | private void ACSplitter_KeyPress(object sender, KeyPressEventArgs e) | |
| 37 | {
| |
| 38 | this.Invalidate(); | |
| 39 | e.Handled = false; | |
| 40 | } | |
| 41 | ||
| 42 | private void ACSplitter_KeyUp(object sender, KeyEventArgs e) | |
| 43 | {
| |
| 44 | this.Invalidate(); | |
| 45 | e.Handled = false; | |
| 46 | } | |
| 47 | ||
| 48 | ||
| 49 | // solid color obtained as a result of alpha-blending | |
| 50 | private static Color CalculateColor(Color front, Color back, int alpha) | |
| 51 | {
| |
| 52 | Color frontColor = Color.FromArgb(255, front); | |
| 53 | Color backColor = Color.FromArgb(255, back); | |
| 54 | ||
| 55 | float frontRed = frontColor.R; | |
| 56 | float frontGreen = frontColor.G; | |
| 57 | float frontBlue = frontColor.B; | |
| 58 | float backRed = backColor.R; | |
| 59 | float backGreen = backColor.G; | |
| 60 | float backBlue = backColor.B; | |
| 61 | ||
| 62 | float fRed = frontRed * alpha / 255 + backRed * ((float)(255 - alpha) / 255); | |
| 63 | byte newRed = (byte)fRed; | |
| 64 | float fGreen = frontGreen * alpha / 255 + backGreen * ((float)(255 - alpha) / 255); | |
| 65 | byte newGreen = (byte)fGreen; | |
| 66 | float fBlue = frontBlue * alpha / 255 + backBlue * ((float)(255 - alpha) / 255); | |
| 67 | byte newBlue = (byte)fBlue; | |
| 68 | ||
| 69 | return Color.FromArgb(255, newRed, newGreen, newBlue); | |
| 70 | } | |
| 71 | ||
| 72 | // This creates a point array to draw a arrow-like polygon | |
| 73 | private Point[] ArrowPointArray(int x, int y, Direction direction) | |
| 74 | {
| |
| 75 | Point[] point = new Point[3]; | |
| 76 | ||
| 77 | // decide which direction the arrow will point | |
| 78 | if (direction == Direction.Right) | |
| 79 | {
| |
| 80 | // right arrow | |
| 81 | point[0] = new Point(x, y); | |
| 82 | point[1] = new Point(x + 3, y + 3); | |
| 83 | point[2] = new Point(x, y + 6); | |
| 84 | } | |
| 85 | if (direction == Direction.Left) | |
| 86 | {
| |
| 87 | // left arrow | |
| 88 | point[0] = new Point(x + 3, y); | |
| 89 | point[1] = new Point(x, y + 3); | |
| 90 | point[2] = new Point(x + 3, y + 6); | |
| 91 | } | |
| 92 | if (direction == Direction.Up) | |
| 93 | {
| |
| 94 | // up arrow | |
| 95 | point[0] = new Point(x + 3, y); | |
| 96 | point[1] = new Point(x + 6, y + 4); | |
| 97 | point[2] = new Point(x, y + 4); | |
| 98 | } | |
| 99 | if (direction == Direction.Down) | |
| 100 | {
| |
| 101 | // down arrow | |
| 102 | point[0] = new Point(x, y); | |
| 103 | point[1] = new Point(x + 2, y + 3); | |
| 104 | point[2] = new Point(x + 5, y); | |
| 105 | } | |
| 106 | return point; | |
| 107 | } | |
| 108 | ||
| 109 | protected override void OnPaint(PaintEventArgs pe) | |
| 110 | {
| |
| 111 | Graphics g = pe.Graphics; | |
| 112 | ||
| 113 | Rectangle r = this.ClientRectangle; | |
| 114 | g.FillRectangle(new SolidBrush(this.BackColor), r); | |
| 115 | ||
| 116 | ||
| 117 | if (this.Orientation == System.Windows.Forms.Orientation.Horizontal) | |
| 118 | {
| |
| 119 | this.SplitterWidth = 9; | |
| 120 | int recWidth = SplitterRectangle.Width / 3; | |
| 121 | Rectangle split_rect = new Rectangle(SplitterRectangle.X + recWidth, SplitterRectangle.Y, SplitterRectangle.Width - recWidth, SplitterRectangle.Height); | |
| 122 | ||
| 123 | int x = split_rect.X; | |
| 124 | int y = split_rect.Y + 3; | |
| 125 | ||
| 126 | g.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x, y + 2); | |
| 127 | g.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x + recWidth, y); | |
| 128 | g.DrawLine(new Pen(SystemColors.ControlDark), x, y + 2, x + recWidth, y + 2); | |
| 129 | g.DrawLine(new Pen(SystemColors.ControlDark), x + recWidth, y, x + recWidth, y + 2); | |
| 130 | } | |
| 131 | else | |
| 132 | {
| |
| 133 | this.SplitterWidth = 9; | |
| 134 | int recHeight = SplitterRectangle.Height / 3; | |
| 135 | Rectangle split_rect = new Rectangle(SplitterRectangle.X, SplitterRectangle.Y + recHeight, SplitterRectangle.Width, SplitterRectangle.Height - 2 * recHeight); | |
| 136 | ||
| 137 | int x = split_rect.X + 3; | |
| 138 | int y = split_rect.Y; | |
| 139 | ||
| 140 | g.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x + 2, y); | |
| 141 | g.DrawLine(new Pen(SystemColors.ControlLightLight), x, y, x, y + recHeight); | |
| 142 | g.DrawLine(new Pen(SystemColors.ControlDark), x + 2, y, x + 2, y + recHeight); | |
| 143 | g.DrawLine(new Pen(SystemColors.ControlDark), x, y + recHeight, x + 2, y + recHeight); | |
| 144 | } | |
| 145 | // Calling the base class OnPaint | |
| 146 | base.OnPaint(pe); | |
| 147 | } | |
| 148 | } | |
| 149 | } |