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
|
{
|
|
/// <summary>
|
/// 设置GDI高质量模式抗锯齿
|
/// </summary>
|
/// <param name="g">The g.</param>
|
public static Graphics SetGDIHigh(this Graphics g)
|
{
|
g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
g.CompositingQuality = CompositingQuality.HighQuality;
|
return g;
|
}
|
|
/// <summary>
|
/// 根据矩形和圆得到一个圆角矩形Path
|
/// </summary>
|
/// <param name="rect">The rect.</param>
|
/// <param name="cornerRadius">The corner radius.</param>
|
/// <returns>GraphicsPath.</returns>
|
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;
|
}
|
/// <summary>
|
/// 根据矩形和圆得到一个圆角矩形Path
|
/// </summary>
|
/// <param name="rect">The rect.</param>
|
/// <param name="cornerRadius">The corner radius.</param>
|
/// <returns>GraphicsPath.</returns>
|
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;
|
}
|
|
/// <summary>
|
/// 绘制文字,垂直居中,水平靠左
|
/// </summary>
|
public static StringFormat StringConters { get; set; }
|
= new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap)
|
{
|
LineAlignment = StringAlignment.Center,
|
Trimming = StringTrimming.EllipsisCharacter
|
};
|
/// <summary>
|
/// 绘制文字,垂直居中,水平居中
|
/// </summary>
|
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);
|
}
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="g"></param>
|
/// <param name="brush"></param>
|
/// <param name="point"></param>
|
/// <param name="size"></param>
|
/// <param name="direction"></param>
|
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;
|
/// <summary>
|
///获取水平滚动条信息
|
/// </summary>
|
/// <param name="hWnd">The h WND.</param>
|
/// <returns>Scrollbarinfo.</returns>
|
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;
|
}
|
/// <summary>
|
/// 获取垂直滚动条信息
|
/// </summary>
|
/// <param name="hWnd">The h WND.</param>
|
/// <returns>Scrollbarinfo.</returns>
|
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);
|
}
|
|
}
|