313 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace DevComponents.DotNetBar.Design
{
internal static class WinApi
{
#region API
[DllImport("user32.dll")]
public static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetFocus();
[DllImport("user32")]
public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
[DllImport("gdi32")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern bool GetTextMetrics(HandleRef hdc, TEXTMETRIC tm);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class TEXTMETRIC
{
public int tmHeight;
public int tmAscent;
public int tmDescent;
public int tmInternalLeading;
public int tmExternalLeading;
public int tmAveCharWidth;
public int tmMaxCharWidth;
public int tmWeight;
public int tmOverhang;
public int tmDigitizedAspectX;
public int tmDigitizedAspectY;
public char tmFirstChar;
public char tmLastChar;
public char tmDefaultChar;
public char tmBreakChar;
public byte tmItalic;
public byte tmUnderlined;
public byte tmStruckOut;
public byte tmPitchAndFamily;
public byte tmCharSet;
}
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
public const int WM_RBUTTONDOWN = 0x0204;
public const int WM_RBUTTONUP = 0x0205;
public const int WM_MOUSEMOVE = 0x0200;
public const int WM_MOUSELEAVE = 0x02A3;
public const int WM_HSCROLL = 0x0114;
public const int WM_VSCROLL = 0x0115;
public const int WM_LBUTTONDBLCLK = 0x0203;
[DllImport("user32")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
public static int MAKELPARAM(int low, int high)
{
return ((high << 0x10) | (low & 0xffff));
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public RECT(int left, int top, int right, int bottom)
{
this.Left = left;
this.Top = top;
this.Right = right;
this.Bottom = bottom;
}
public int Left;
public int Top;
public int Right;
public int Bottom;
public static RECT FromRectangle(Rectangle rectangle)
{
return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom);
}
}
[DllImport("user32")]
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT r);
#endregion
#region Windows Messages
public enum WindowsMessages
{
WM_NCPAINT = 0x0085,
WM_NCCALCSIZE = 0x0083,
WM_NCACTIVATE = 0x0086,
WM_SETTEXT = 0x000C,
WM_INITMENUPOPUP = 0x0117,
WM_WINDOWPOSCHANGED = 0x0047,
WM_NCHITTEST = 0x0084,
WM_ERASEBKGND = 0x0014,
WM_NCMOUSEMOVE = 0xA0,
WM_NCLBUTTONDOWN = 0xA1,
WM_NCMOUSELEAVE = 0x2A2,
WM_NCLBUTTONUP = 0xA2,
WM_NCMOUSEHOVER = 0x2A0,
WM_SETCURSOR = 0x20,
WM_SETICON = 0x0080,
WM_HSCROLL = 0x0114,
WM_VSCROLL = 0x115,
WM_MOUSEWHEEL = 0x020A,
WM_STYLECHANGED = 0x7D,
WM_NCLBUTTONDBLCLK = 0xA3,
WM_MOUSEACTIVATE = 0x21,
WM_MOUSEMOVE = 0x0200,
WM_MDISETMENU = 0x230,
WM_MDIREFRESHMENU = 0x234,
WM_KEYDOWN = 0x0100,
WM_SIZE = 0x5,
WM_DWMCOMPOSITIONCHANGED = 0x031E,
WM_DRAWITEM = 0x002B,
SBM_SETPOS = 0x00E0,
SBM_SETSCROLLINFO = 0x00E9,
EM_GETMODIFY = 0x00B8,
EM_SETMODIFY = 0x00B9,
WM_LBUTTONUP = 0x0202,
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONDBLCLK = 0x0203,
WM_SYSTIMER = 0x0118,
WM_SETFOCUS = 0x0007,
WM_KILLFOCUS = 0x0008,
WM_PAINT = 0x000F,
WM_COMMAND = 0x0111,
WM_CTLCOLORBTN = 0x0135,
WM_CTLCOLORSCROLLBAR = 0x0137,
WM_MDIACTIVATE = 0x222,
WM_CAPTURECHANGED = 0x0215,
CB_GETDROPPEDSTATE = 0x0157,
WVR_VALIDRECTS = 0x400
}
public enum ComboNotificationCodes : int
{
CBN_DROPDOWN = 7,
CBN_CLOSEUP = 8
}
public enum MouseKeyState : int
{
MK_LBUTTON = 0x0001,
MK_RBUTTON = 0x0002,
MK_SHIFT = 0x0004,
MK_CONTROL = 0x0008,
MK_MBUTTON = 0x0010,
MK_XBUTTON1 = 0x0020,
MK_XBUTTON2 = 0x0040
}
/// <summary>Options available when a form is tested for mose positions.</summary>
public enum WindowHitTestRegions
{
/// <summary>HTERROR: On the screen background or on a dividing line between windows
/// (same as HTNOWHERE, except that the DefWindowProc function produces a system
/// beep to indicate an error).</summary>
Error = -2,
/// <summary>HTTRANSPARENT: In a window currently covered by another window in the
/// same thread (the message will be sent to underlying windows in the same thread
/// until one of them returns a code that is not HTTRANSPARENT).</summary>
TransparentOrCovered = -1,
/// <summary>HTNOWHERE: On the screen background or on a dividing line between
/// windows.</summary>
NoWhere = 0,
/// <summary>HTCLIENT: In a client area.</summary>
ClientArea = 1,
/// <summary>HTCAPTION: In a title bar.</summary>
TitleBar = 2,
/// <summary>HTSYSMENU: In a window menu or in a Close button in a child window.</summary>
SystemMenu = 3,
/// <summary>HTGROWBOX: In a size box (same as HTSIZE).</summary>
GrowBox = 4,
/// <summary>HTMENU: In a menu.</summary>
Menu = 5,
/// <summary>HTHSCROLL: In a horizontal scroll bar.</summary>
HorizontalScrollBar = 6,
/// <summary>HTVSCROLL: In the vertical scroll bar.</summary>
VerticalScrollBar = 7,
/// <summary>HTMINBUTTON: In a Minimize button. </summary>
MinimizeButton = 8,
/// <summary>HTMAXBUTTON: In a Maximize button.</summary>
MaximizeButton = 9,
/// <summary>HTLEFT: In the left border of a resizable window (the user can click
/// the mouse to resize the window horizontally).</summary>
LeftSizeableBorder = 10,
/// <summary>HTRIGHT: In the right border of a resizable window (the user can click
/// the mouse to resize the window horizontally).</summary>
RightSizeableBorder = 11,
/// <summary>HTTOP: In the upper-horizontal border of a window.</summary>
TopSizeableBorder = 12,
/// <summary>HTTOPLEFT: In the upper-left corner of a window border.</summary>
TopLeftSizeableCorner = 13,
/// <summary>HTTOPRIGHT: In the upper-right corner of a window border.</summary>
TopRightSizeableCorner = 14,
/// <summary>HTBOTTOM: In the lower-horizontal border of a resizable window (the
/// user can click the mouse to resize the window vertically).</summary>
BottomSizeableBorder = 15,
/// <summary>HTBOTTOMLEFT: In the lower-left corner of a border of a resizable
/// window (the user can click the mouse to resize the window diagonally).</summary>
BottomLeftSizeableCorner = 16,
/// <summary>HTBOTTOMRIGHT: In the lower-right corner of a border of a resizable
/// window (the user can click the mouse to resize the window diagonally).</summary>
BottomRightSizeableCorner = 17,
/// <summary>HTBORDER: In the border of a window that does not have a sizing
/// border.</summary>
NonSizableBorder = 18,
/// <summary>HTOBJECT: Unknown...No Documentation Found</summary>
Object = 19,
/// <summary>HTCLOSE: In a Close button.</summary>
CloseButton = 20,
/// <summary>HTHELP: In a Help button.</summary>
HelpButton = 21,
/// <summary>HTSIZE: In a size box (same as HTGROWBOX). (Same as GrowBox).</summary>
SizeBox = GrowBox,
/// <summary>HTREDUCE: In a Minimize button. (Same as MinimizeButton).</summary>
ReduceButton = MaximizeButton,
/// <summary>HTZOOM: In a Maximize button. (Same as MaximizeButton).</summary>
ZoomButton = MaximizeButton,
}
public enum GWL
{
GWL_WNDPROC = (-4),
GWL_HINSTANCE = (-6),
GWL_HWNDPARENT = (-8),
GWL_STYLE = (-16),
GWL_EXSTYLE = (-20),
GWL_USERDATA = (-21),
GWL_ID = (-12)
}
public enum RedrawWindowFlags : uint
{
RDW_INVALIDATE = 0x0001,
RDW_INTERNALPAINT = 0x0002,
RDW_ERASE = 0x0004,
RDW_VALIDATE = 0x0008,
RDW_NOINTERNALPAINT = 0x0010,
RDW_NOERASE = 0x0020,
RDW_NOCHILDREN = 0x0040,
RDW_ALLCHILDREN = 0x0080,
RDW_UPDATENOW = 0x0100,
RDW_ERASENOW = 0x0200,
RDW_FRAME = 0x0400,
RDW_NOFRAME = 0x0800
}
[Flags()]
public enum WindowStyles
{
WS_VISIBLE = 0x10000000,
WS_CAPTION = 0x00C00000
}
public const int HWND_TOP = 0;
public const int HWND_BOTTOM = 1;
public const int HWND_TOPMOST = -1;
public const int HWND_NOTOPMOST = -2;
public const int SWP_NOMOVE = 0x0002;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOACTIVATE = 0x0010;
public const int SWP_NOZORDER = 0x0004;
public const int SWP_SHOWWINDOW = 0x0040;
public const int SWP_HIDEWINDOW = 0x0080;
public const int SWP_FRAMECHANGED = 0x0020;
public const int SWP_NOOWNERZORDER = 0x0200; /* Don't do owner Z ordering */
public const int SWP_NOSENDCHANGING = 0x0400;
public const int WM_USER = 0x0400;
#endregion
#region Functions
[DllImport("user32")]
public static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, uint flags);
public static int LOWORD(int n)
{
return (short)(n & 0xffff);
}
public static int HIWORD(int n)
{
return (short)((n >> 0x10) & 0xffff);
}
public static int LOWORD(IntPtr n)
{
return LOWORD((int)((long)n));
}
public static int HIWORD(IntPtr n)
{
return HIWORD((int)((long)n));
}
public static IntPtr CreateLParam(int loWord, int hiWord)
{
byte[] bx = BitConverter.GetBytes(loWord);
byte[] by = BitConverter.GetBytes(hiWord);
byte[] blp = new byte[] { bx[0], bx[1], by[0], by[1] };
return new IntPtr(BitConverter.ToInt32(blp, 0));
}
#endregion
}
}