using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DPumpHydr.WinFrmUI.WenSkin.Controls
{
public static class ControlHelper
{
///
/// 设置GDI高质量模式抗锯齿
///
/// The g.
public static Graphics SetGDIHigh(this Graphics g)
{
g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.CompositingQuality = CompositingQuality.HighQuality;
return g;
}
///
/// 根据矩形和圆得到一个圆角矩形Path
///
/// The rect.
/// The corner radius.
/// GraphicsPath.
public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int cornerRadius)
{
GraphicsPath roundedRect = new GraphicsPath();
roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
roundedRect.CloseFigure();
return roundedRect;
}
///
/// 根据矩形和圆得到一个圆角矩形Path
///
/// The rect.
/// The corner radius.
/// GraphicsPath.
public static GraphicsPath CreateRoundedRectanglePath(this RectangleF rect, float cornerRadius)
{
GraphicsPath roundedRect = new GraphicsPath();
roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
roundedRect.CloseFigure();
return roundedRect;
}
///
/// 绘制文字,垂直居中,水平靠左
///
public static StringFormat StringConters { get; set; }
= new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap)
{
LineAlignment = StringAlignment.Center,
Trimming = StringTrimming.EllipsisCharacter
};
///
/// 绘制文字,垂直居中,水平居中
///
public static StringFormat StringContersCenter { get; set; }
= new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap)
{
LineAlignment = StringAlignment.Center,
Alignment = StringAlignment.Center,
Trimming = StringTrimming.EllipsisCharacter
};
public static Color ColorReverse(Color color)
{
Color c = ColorAshen(color);
return Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B);
}
public static Color ColorAshen(Color color)
{
//转为灰白色
int v = (int)((color.R + color.G + color.B) / 3);
if (v < 0)
v = 0;
else if (v > 255)
v = 255;
return Color.FromArgb(v, v, v);
}
///
///
///
///
///
///
///
///
public static void PaintTriangle(Graphics g, System.Drawing.Brush brush, Point point, int size, GraphDirection direction)
{
Point[] array = new Point[4];
switch (direction)
{
case GraphDirection.Leftward:
array[0] = new Point(point.X, point.Y - size);
array[1] = new Point(point.X, point.Y + size);
array[2] = new Point(point.X - 2 * size, point.Y);
break;
case GraphDirection.Rightward:
array[0] = new Point(point.X, point.Y - size);
array[1] = new Point(point.X, point.Y + size);
array[2] = new Point(point.X + 2 * size, point.Y);
break;
case GraphDirection.Upward:
array[0] = new Point(point.X - size, point.Y);
array[1] = new Point(point.X + size, point.Y);
array[2] = new Point(point.X, point.Y - 2 * size);
break;
default:
array[0] = new Point(point.X - size, point.Y);
array[1] = new Point(point.X + size, point.Y);
array[2] = new Point(point.X, point.Y + 2 * size);
break;
}
array[3] = array[0];
g.FillPolygon(brush, array);
}
public enum GraphDirection
{
Upward = 1,
Downward,
Leftward,
Rightward
}
public static bool IsDesignMode()
{
bool returnFlag = false;
if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
{
returnFlag = true;
}
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
{
returnFlag = true;
}
return returnFlag;
}
public static void ScrollDown(IntPtr handle)
{
SendMessage(handle, (int)WinApi.CommonConst.WM_VSCROLL, (int)WinApi.CommonConst.SB_LINEDOWN, 0);
}
public static void ScrollLeft(IntPtr handle)
{
SendMessage(handle, (int)WinApi.CommonConst.WM_HSCROLL, (int)WinApi.CommonConst.SB_LINELEFT, 0);
}
public static void ScrollRight(IntPtr handle)
{
SendMessage(handle, (int)WinApi.CommonConst.WM_VSCROLL, (int)WinApi.CommonConst.SB_LINERIGHT, 0);
}
public static void ScrollUp(IntPtr handle)
{
SendMessage(handle, (int)WinApi.CommonConst.WM_VSCROLL, (int)WinApi.CommonConst.SB_LINEUP, 0);
}
public struct SCROLLINFO
{
public int cbSize;
public int fMask;
public int nMin;
public int nMax;
public int nPage;
public int nPos;
public int nTrackPos;
public int ScrollMax { get { return nMax + 1 - nPage; } }
}
static uint SB_VERT = 0x1;
static uint SB_HORZ = 0x0;
///
///获取水平滚动条信息
///
/// The h WND.
/// Scrollbarinfo.
public static SCROLLINFO GetHScrollBarInfo(IntPtr hWnd)
{
SCROLLINFO info = new SCROLLINFO();
info.cbSize = (int)Marshal.SizeOf(info);
info.fMask = (int)WinApi.CommonConst.SIF_DISABLENOSCROLL | (int)WinApi.CommonConst.SIF_ALL;
int intRef = GetScrollInfo(hWnd, SB_HORZ, ref info);
return info;
}
///
/// 获取垂直滚动条信息
///
/// The h WND.
/// Scrollbarinfo.
public static SCROLLINFO GetVScrollBarInfo(IntPtr hWnd)
{
SCROLLINFO info = new SCROLLINFO();
info.cbSize = (int)Marshal.SizeOf(info);
info.fMask = (int)WinApi.CommonConst.SIF_DISABLENOSCROLL | (int)WinApi.CommonConst.SIF_ALL;
int intRef = GetScrollInfo(hWnd, SB_VERT, ref info);
return info;
}
public static void SetVScrollValue(IntPtr handle, int value)
{
var info = GetVScrollBarInfo(handle);
info.nPos = value;
SetScrollInfo(handle, SB_VERT, ref info, true);
PostMessage(handle, (int)WinApi.CommonConst.WM_VSCROLL, MakeLong((short)WinApi.CommonConst.SB_THUMBTRACK, highPart: (short)info.nPos), 0);
}
public static void SetHScrollValue(IntPtr handle, int value)
{
var info = GetHScrollBarInfo(handle);
info.nPos = value;
SetScrollInfo(handle, SB_HORZ, ref info, true);
PostMessage(handle, (int)WinApi.CommonConst.WM_HSCROLL, MakeLong((short)WinApi.CommonConst.SB_THUMBTRACK, highPart: (short)info.nPos), 0);
}
private static uint MakeLong(short lowPart, short highPart)
{
return (ushort)lowPart | (uint)(highPart << 16);
}
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll ")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollInfo")]
private static extern int GetScrollInfo(IntPtr hWnd, uint fnBar, ref SCROLLINFO psbi);
[DllImport("user32.dll")]
private static extern int SetScrollInfo(IntPtr handle, uint fnBar, ref SCROLLINFO si, bool fRedraw);
[DllImport("user32.dll", EntryPoint = "PostMessage")]
private static extern bool PostMessage(IntPtr handle, int msg, uint wParam, uint lParam);
}
}