add ColorDropper

This commit is contained in:
NaBian committed 2019-05-14 23:03:14 +08:00
1 parent d920bf678e
commit a8aa1a4525
7 files changed
+180 -25

No files matched your search

@@ -1,9 +1,69 @@
using System.Windows.Controls;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using HandyControl.Data;
using HandyControl.Tools;
using HandyControl.Tools.Interop;
namespace HandyControl.Controls
{
public class ColorDropper : Control
internal class ColorDropper : Control
{
private Cursor _dropperCursor;
private readonly ColorPicker _colorPicker;
public ColorDropper(ColorPicker colorPicker)
{
_colorPicker = colorPicker;
}
public void Update(bool isShow)
{
if (isShow)
{
if (_dropperCursor == null)
{
var info = Application.GetResourceStream(
new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur"));
if (info != null)
{
_dropperCursor = new Cursor(info.Stream);
}
}
if (_dropperCursor == null) return;
Mouse.OverrideCursor = _dropperCursor;
MouseHook.Start();
MouseHook.StatusChanged += MouseHook_StatusChanged;
}
else
{
Mouse.OverrideCursor = Cursors.Arrow;
}
}
private void MouseHook_StatusChanged(object sender, MouseHookEventArgs e)
{
if (!_colorPicker.IsMouseOver && e.Message == MouseHookMessageType.LeftButtonDown)
{
var brush = new SolidColorBrush(GetColorAt(e.Point.X, e.Point.Y));
_colorPicker.SelectedBrush = brush;
//MouseHook.Stop();
//MouseHook.StatusChanged -= MouseHook_StatusChanged;
}
}
public static Color GetColorAt(int x, int y)
{
var desk = UnsafeNativeMethods.GetDesktopWindow();
var dc = UnsafeNativeMethods.GetWindowDC(desk);
var a = (int)UnsafeNativeMethods.GetPixel(dc, x, y);
UnsafeNativeMethods.ReleaseDC(desk, dc);
return Color.FromArgb(255, (byte) ((a >> 0) & 0xff), (byte) ((a >> 8) & 0xff), (byte) ((a >> 16) & 0xff));
}
}
}
@@ -41,7 +41,7 @@ namespace HandyControl.Controls
#region Data
private Cursor _dropperCursor;
private ColorDropper _colorDropper;
private ToggleButton _toggleButtonDropper;
@@ -696,25 +696,12 @@ namespace HandyControl.Controls
private void ToggleButtonDropper_Click(object sender, RoutedEventArgs e)
{
if (_toggleButtonDropper.IsChecked == true)
if (_colorDropper == null)
{
if (_dropperCursor == null)
{
var info = Application.GetResourceStream(new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur"));
if (info != null)
{
_dropperCursor = new Cursor(info.Stream);
}
}
if (_dropperCursor == null) return;
Mouse.OverrideCursor = _dropperCursor;
}
else
{
Mouse.OverrideCursor = Cursors.Arrow;
_colorDropper = new ColorDropper(this);
}
// ReSharper disable once PossibleInvalidOperationException
_colorDropper.Update(_toggleButtonDropper.IsChecked.Value);
}
public void Dispose() => System.Windows.Window.GetWindow(this)?.Close();