diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-04-08 19:19:16 +0300 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-04-08 19:19:16 +0300 |
| commit | 14f6bcfe8debc163d8fe2f172c7e0555b83aeddb (patch) | |
| tree | 03cbfec93ccc3687f12fb4e747e4ef9225b0bc3b /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs | |
| parent | f1733550ed159387831568ebee4a1fc1d73a62f2 (diff) | |
| parent | 46cdc21087d55e3bc5ca1d04b183f47bcfb3924f (diff) | |
| download | Tango-14f6bcfe8debc163d8fe2f172c7e0555b83aeddb.tar.gz Tango-14f6bcfe8debc163d8fe2f172c7e0555b83aeddb.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs new file mode 100644 index 000000000..421c35c5a --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/Win32.cs @@ -0,0 +1,85 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Media; + +namespace Tango.Scripting.Editors.Utils +{ + /// <summary> + /// Wrapper around Win32 functions. + /// </summary> + static class Win32 + { + /// <summary> + /// Gets the caret blink time. + /// </summary> + public static TimeSpan CaretBlinkTime { + get { return TimeSpan.FromMilliseconds(SafeNativeMethods.GetCaretBlinkTime()); } + } + + /// <summary> + /// Creates an invisible Win32 caret for the specified Visual with the specified size (coordinates local to the owner visual). + /// </summary> + public static bool CreateCaret(Visual owner, Size size) + { + if (owner == null) + throw new ArgumentNullException("owner"); + HwndSource source = PresentationSource.FromVisual(owner) as HwndSource; + if (source != null) { + Vector r = owner.PointToScreen(new Point(size.Width, size.Height)) - owner.PointToScreen(new Point(0, 0)); + return SafeNativeMethods.CreateCaret(source.Handle, IntPtr.Zero, (int)Math.Ceiling(r.X), (int)Math.Ceiling(r.Y)); + } else { + return false; + } + } + + /// <summary> + /// Sets the position of the caret previously created using <see cref="CreateCaret"/>. position is relative to the owner visual. + /// </summary> + public static bool SetCaretPosition(Visual owner, Point position) + { + if (owner == null) + throw new ArgumentNullException("owner"); + HwndSource source = PresentationSource.FromVisual(owner) as HwndSource; + if (source != null) { + Point pointOnRootVisual = owner.TransformToAncestor(source.RootVisual).Transform(position); + Point pointOnHwnd = pointOnRootVisual.TransformToDevice(source.RootVisual); + return SafeNativeMethods.SetCaretPos((int)pointOnHwnd.X, (int)pointOnHwnd.Y); + } else { + return false; + } + } + + /// <summary> + /// Destroys the caret previously created using <see cref="CreateCaret"/>. + /// </summary> + public static bool DestroyCaret() + { + return SafeNativeMethods.DestroyCaret(); + } + + [SuppressUnmanagedCodeSecurity] + static class SafeNativeMethods + { + [DllImport("user32.dll")] + public static extern int GetCaretBlinkTime(); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetCaretPos(int x, int y); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DestroyCaret(); + } + } +} |
