ShareX/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs

703 lines
30 KiB
C#
Raw Normal View History

2013-11-03 23:53:49 +13:00
#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
2016-01-04 04:16:01 +13:00
Copyright (c) 2007-2016 ShareX Team
2013-11-03 23:53:49 +13:00
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
2014-12-11 09:25:20 +13:00
using ShareX.HelpersLib;
using ShareX.ScreenCaptureLib.Properties;
using System;
using System.Collections.Generic;
2013-11-03 23:53:49 +13:00
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
2013-11-03 23:53:49 +13:00
using System.Windows.Forms;
2014-12-11 09:25:20 +13:00
namespace ShareX.ScreenCaptureLib
2013-11-03 23:53:49 +13:00
{
public class RectangleRegionForm : BaseRegionForm
2013-11-03 23:53:49 +13:00
{
2016-05-14 20:58:24 +12:00
public RectangleRegionMode Mode { get; private set; }
2016-05-14 20:58:24 +12:00
public ShapeManager ShapeManager { get; private set; }
2013-11-03 23:53:49 +13:00
public Point CurrentPosition { get; private set; }
public Color CurrentColor
{
get
{
if (bmpBackgroundImage != null && !CurrentPosition.IsEmpty)
{
Point position = CaptureHelpers.ScreenToClient(CurrentPosition);
return bmpBackgroundImage.GetPixel(position.X, position.Y);
}
return Color.Empty;
}
}
public SimpleWindowInfo SelectedWindow { get; private set; }
2015-08-10 03:11:54 +12:00
private ColorBlinkAnimation colorBlinkAnimation = new ColorBlinkAnimation();
private Bitmap bmpBackgroundImage;
2016-05-14 20:58:24 +12:00
public RectangleRegionForm(RectangleRegionMode mode)
2013-11-03 23:53:49 +13:00
{
2016-05-14 20:58:24 +12:00
Mode = mode;
2013-11-03 23:53:49 +13:00
KeyDown += RectangleRegion_KeyDown;
MouseDown += RectangleRegion_MouseDown;
2013-11-03 23:53:49 +13:00
}
private void RectangleRegion_MouseDown(object sender, MouseEventArgs e)
2013-11-03 23:53:49 +13:00
{
2016-05-14 20:58:24 +12:00
if ((Mode == RectangleRegionMode.OneClick || Mode == RectangleRegionMode.ScreenColorPicker) && e.Button == MouseButtons.Left)
2013-11-03 23:53:49 +13:00
{
2015-07-11 21:47:38 +12:00
CurrentPosition = InputManager.MousePosition;
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.OneClick)
{
SelectedWindow = ShapeManager.FindSelectedWindow();
}
Close(RegionResult.Region);
2013-11-03 23:53:49 +13:00
}
}
private void RectangleRegion_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.F1:
Config.ShowTips = !Config.ShowTips;
break;
case Keys.Control | Keys.C:
CopyAreaInfo();
break;
}
}
private void CopyAreaInfo()
{
string clipboardText;
if (ShapeManager.IsCurrentRegionValid)
{
clipboardText = GetAreaText(ShapeManager.CurrentRectangle);
2013-11-03 23:53:49 +13:00
}
else
{
CurrentPosition = InputManager.MousePosition;
clipboardText = GetInfoText();
}
ClipboardHelpers.CopyText(clipboardText);
2013-11-03 23:53:49 +13:00
}
public override void Prepare()
{
base.Prepare();
if (Config != null)
{
ShapeManager = new ShapeManager(this);
ShapeManager.WindowCaptureMode = Config.DetectWindows;
ShapeManager.IncludeControls = Config.DetectControls;
2013-11-03 23:53:49 +13:00
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.OneClick || ShapeManager.WindowCaptureMode)
2013-11-03 23:53:49 +13:00
{
IntPtr handle = Handle;
TaskEx.Run(() =>
{
WindowsRectangleList wla = new WindowsRectangleList();
wla.IgnoreHandle = handle;
wla.IncludeChildWindows = ShapeManager.IncludeControls;
ShapeManager.Windows = wla.GetWindowInfoListAsync(5000);
});
2013-11-03 23:53:49 +13:00
}
2016-05-14 20:58:24 +12:00
if (Config.UseCustomInfoText || Mode == RectangleRegionMode.ScreenColorPicker)
{
bmpBackgroundImage = new Bitmap(backgroundImage);
}
}
2013-11-03 23:53:49 +13:00
}
public override WindowInfo GetWindowInfo()
{
return ShapeManager.FindSelectedWindowInfo(CurrentPosition);
}
2013-11-03 23:53:49 +13:00
protected override void Update()
{
base.Update();
ShapeManager.Update();
2013-11-03 23:53:49 +13:00
}
protected override void Draw(Graphics g)
{
// Draw snap rectangles
if (ShapeManager.IsCreating && ShapeManager.IsSnapResizing)
{
foreach (Size size in Config.SnapSizes)
{
Rectangle snapRect = CaptureHelpers.CalculateNewRectangle(ShapeManager.PositionOnClick, ShapeManager.CurrentPosition, size);
g.DrawRectangleProper(markerPen, snapRect);
}
}
List<BaseShape> areas = ShapeManager.ValidRegions.ToList();
2013-11-03 23:53:49 +13:00
if (areas.Count > 0)
2013-11-03 23:53:49 +13:00
{
// Create graphics path from all regions
2013-11-03 23:53:49 +13:00
UpdateRegionPath();
// If background is dimmed then draw non dimmed background to region selections
if (Config.UseDimming)
2013-11-03 23:53:49 +13:00
{
using (Region region = new Region(regionDrawPath))
{
g.Clip = region;
g.FillRectangle(lightBackgroundBrush, ScreenRectangle0Based);
g.ResetClip();
}
}
2013-11-03 23:53:49 +13:00
// Blink borders of all regions slightly to make non active regions to be visible in both dark and light backgrounds
using (Pen blinkBorderPen = new Pen(colorBlinkAnimation.GetColor()))
{
g.DrawPath(blinkBorderPen, regionDrawPath);
2013-11-03 23:53:49 +13:00
}
2016-05-03 22:06:58 +12:00
}
2013-11-03 23:53:49 +13:00
2016-05-11 10:17:51 +12:00
// Draw effect shapes
foreach (BaseEffectShape effectShape in ShapeManager.EffectShapes)
2016-05-11 10:17:51 +12:00
{
effectShape.Draw(g);
}
// Draw drawing shapes
foreach (BaseDrawingShape drawingShape in ShapeManager.DrawingShapes)
2016-05-03 22:06:58 +12:00
{
drawingShape.Draw(g);
}
// Draw animated rectangle on hover area
if (ShapeManager.IsCurrentHoverAreaValid)
2016-05-03 22:06:58 +12:00
{
using (GraphicsPath hoverDrawPath = new GraphicsPath { FillMode = FillMode.Winding })
2013-11-03 23:53:49 +13:00
{
ShapeManager.CreateRegionShape(ShapeManager.CurrentHoverRectangle).AddShapePath(hoverDrawPath, -1);
2013-11-03 23:53:49 +13:00
g.DrawPath(borderPen, hoverDrawPath);
g.DrawPath(borderDotPen, hoverDrawPath);
2013-11-03 23:53:49 +13:00
}
}
2013-11-03 23:53:49 +13:00
// Draw animated rectangle on selection area
if (ShapeManager.IsCurrentShapeTypeRegion && ShapeManager.IsCurrentRegionValid)
{
g.DrawRectangleProper(borderPen, ShapeManager.CurrentRectangle);
g.DrawRectangleProper(borderDotPen, ShapeManager.CurrentRectangle);
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.Ruler)
2013-11-03 23:53:49 +13:00
{
DrawRuler(g, ShapeManager.CurrentRectangle, borderPen, 5, 10);
DrawRuler(g, ShapeManager.CurrentRectangle, borderPen, 15, 100);
2014-04-12 04:29:19 +12:00
Point centerPos = new Point(ShapeManager.CurrentRectangle.X + ShapeManager.CurrentRectangle.Width / 2, ShapeManager.CurrentRectangle.Y + ShapeManager.CurrentRectangle.Height / 2);
int markSize = 10;
g.DrawLine(borderPen, centerPos.X, centerPos.Y - markSize, centerPos.X, centerPos.Y + markSize);
g.DrawLine(borderPen, centerPos.X - markSize, centerPos.Y, centerPos.X + markSize, centerPos.Y);
}
}
2014-04-12 05:12:13 +12:00
// Draw all regions rectangle info
if (Config.ShowInfo)
{
// Add hover area to list so rectangle info can be shown
if (ShapeManager.IsCurrentShapeTypeRegion && ShapeManager.IsCurrentHoverAreaValid && areas.All(area => area.Rectangle != ShapeManager.CurrentHoverRectangle))
{
BaseShape shape = ShapeManager.CreateRegionShape(ShapeManager.CurrentHoverRectangle);
areas.Add(shape);
2013-11-03 23:53:49 +13:00
}
foreach (BaseShape regionInfo in areas)
2013-11-03 23:53:49 +13:00
{
if (regionInfo.Rectangle.IsValid())
2013-11-03 23:53:49 +13:00
{
string areaText = GetAreaText(regionInfo.Rectangle);
DrawAreaText(g, areaText, regionInfo.Rectangle);
2013-11-03 23:53:49 +13:00
}
}
}
// Draw resize nodes
DrawObjects(g);
// Draw F1 tips
if (Config.ShowTips)
{
DrawTips(g);
}
// Draw right click menu tip
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.Annotation && Config.ShowMenuTip)
{
DrawMenuTip(g);
}
// Draw magnifier
2013-11-03 23:53:49 +13:00
if (Config.ShowMagnifier)
{
DrawMagnifier(g);
}
// Draw screen wide crosshair
2013-11-03 23:53:49 +13:00
if (Config.ShowCrosshair)
{
DrawCrosshair(g);
}
}
private void DrawInfoText(Graphics g, string text, Rectangle rect, Font font, int padding)
2015-05-13 04:27:21 +12:00
{
g.FillRectangle(textBackgroundBrush, rect.Offset(-2));
g.DrawRectangleProper(textBackgroundPenBlack, rect.Offset(-1));
g.DrawRectangleProper(textBackgroundPenWhite, rect);
ImageHelpers.DrawTextWithShadow(g, text, rect.Offset(-padding).Location, font, Brushes.White, Brushes.Black);
2015-05-13 04:27:21 +12:00
}
2015-05-10 04:59:19 +12:00
private void DrawAreaText(Graphics g, string text, Rectangle area)
2015-05-08 11:31:08 +12:00
{
int offset = 5;
2015-05-13 04:27:21 +12:00
int backgroundPadding = 3;
2015-05-10 04:59:19 +12:00
Size textSize = g.MeasureString(text, infoFont).ToSize();
2015-05-08 11:31:08 +12:00
Point textPos;
2015-05-13 04:27:21 +12:00
if (area.Y - offset - textSize.Height - backgroundPadding * 2 < ScreenRectangle0Based.Y)
2015-05-08 11:31:08 +12:00
{
2015-05-13 04:27:21 +12:00
textPos = new Point(area.X + offset + backgroundPadding, area.Y + offset + backgroundPadding);
2015-05-08 11:31:08 +12:00
}
else
{
2015-05-13 04:27:21 +12:00
textPos = new Point(area.X + backgroundPadding, area.Y - offset - backgroundPadding - textSize.Height);
2015-05-08 11:31:08 +12:00
}
2015-06-04 00:49:29 +12:00
if (textPos.X + textSize.Width + backgroundPadding >= ScreenRectangle0Based.Width)
{
textPos.X = ScreenRectangle0Based.Width - textSize.Width - backgroundPadding;
}
2015-05-13 04:27:21 +12:00
Rectangle backgroundRect = new Rectangle(textPos.X - backgroundPadding, textPos.Y - backgroundPadding, textSize.Width + backgroundPadding * 2, textSize.Height + backgroundPadding * 2);
2015-05-08 11:31:08 +12:00
DrawInfoText(g, text, backgroundRect, infoFont, backgroundPadding);
2015-05-08 11:31:08 +12:00
}
private void DrawTips(Graphics g)
{
StringBuilder sb = new StringBuilder();
WriteTips(sb);
string tipText = sb.ToString().Trim();
2015-05-08 11:31:08 +12:00
Size textSize = g.MeasureString(tipText, infoFont).ToSize();
int offset = 10;
int padding = 10;
int rectWidth = textSize.Width + padding * 2 + 2;
int rectHeight = textSize.Height + padding * 2;
2016-05-10 08:22:28 +12:00
Rectangle screenBounds = CaptureHelpers.GetActiveScreenBounds0Based();
Rectangle textRectangle = new Rectangle(screenBounds.X + screenBounds.Width - rectWidth - offset, screenBounds.Y + offset, rectWidth, rectHeight);
if (textRectangle.Offset(10).Contains(InputManager.MousePosition0Based))
{
2016-05-10 08:22:28 +12:00
textRectangle.Y = screenBounds.Height - rectHeight - offset;
}
DrawInfoText(g, tipText, textRectangle, infoFont, padding);
}
private void DrawMenuTip(Graphics g)
{
// TODO: Translate
2016-05-09 04:48:15 +12:00
string tipText = "Tip: Right click to open options menu";
2016-05-09 07:23:47 +12:00
Size textSize = g.MeasureString(tipText, infoFontMedium).ToSize();
int offset = 10;
int padding = 3;
int rectWidth = textSize.Width + padding * 2;
int rectHeight = textSize.Height + padding * 2;
2016-05-10 08:22:28 +12:00
Rectangle screenBounds = CaptureHelpers.GetActiveScreenBounds0Based();
Rectangle textRectangle = new Rectangle(screenBounds.X + (screenBounds.Width / 2) - (rectWidth / 2), screenBounds.Y + offset, rectWidth, rectHeight);
2016-05-09 07:23:47 +12:00
DrawInfoText(g, tipText, textRectangle, infoFontMedium, padding);
}
protected virtual void WriteTips(StringBuilder sb)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__F1__Hide_tips);
sb.AppendLine();
if (ShapeManager.IsCreating)
{
2015-08-21 04:29:10 +12:00
sb.AppendLine(Resources.RectangleRegion_WriteTips__Insert__Stop_region_selection);
sb.AppendLine(Resources.RectangleRegion_WriteTips__Right_click__Cancel_region_selection);
sb.AppendLine(Resources.RectangleRegion_WriteTips__Esc__Cancel_capture);
}
else
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Left_click__Start_region_selection);
2016-05-05 02:01:03 +12:00
// TODO: Translate
sb.AppendLine("[Right click] Open options menu");
sb.AppendLine(Resources.RectangleRegion_WriteTips__Right_click___Esc__Cancel_capture);
}
if (!Config.QuickCrop && ShapeManager.Regions.Length > 0)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Double_Left_click___Enter__Capture_regions);
}
sb.AppendLine();
if ((!Config.QuickCrop || !ShapeManager.IsCurrentShapeTypeRegion) && ShapeManager.CurrentShape != null && !ShapeManager.IsCreating)
{
2016-05-09 04:08:35 +12:00
sb.AppendLine(Resources.RectangleRegion_WriteTips__Right_click_on_selection___Delete__Remove_region);
sb.AppendLine(string.Format(Resources.RectangleRegion_WriteTips__Arrow_keys__Resize_selected_region_from__0_, ShapeManager.ResizeManager.IsBottomRightResizing ?
Resources.RectangleRegion_WriteTips_bottom_right : Resources.RectangleRegion_WriteTips_top_left));
sb.AppendLine(string.Format(Resources.RectangleRegion_WriteTips__Tab__Swap_resize_anchor_to__0_, ShapeManager.ResizeManager.IsBottomRightResizing ?
Resources.RectangleRegion_WriteTips_top_left : Resources.RectangleRegion_WriteTips_bottom_right));
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Shift__Move_selected_region_instead_of_resizing);
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Ctrl__Resize___Move_faster);
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Left_click_on_selection__Move_region);
}
else
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Arrow_keys__Move_cursor_position);
sb.AppendLine(Resources.RectangleRegion_WriteTips__Ctrl___Arrow_keys__Move_cursor_position_faster);
}
if (ShapeManager.IsCreating)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Shift__Proportional_resizing);
2015-08-23 03:15:41 +12:00
sb.AppendLine(Resources.RectangleRegion_WriteTips__Hold_Alt__Snap_resizing_to_preset_sizes);
}
if (ShapeManager.IsCurrentRegionValid)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Ctrl___C__Copy_position_and_size);
}
else if (Config.UseCustomInfoText)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Ctrl___C__Copy_info);
}
else
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__Ctrl___C__Copy_position);
}
2016-05-16 21:48:53 +12:00
// TODO: CTRL + Mouse wheel magnifier pixel size
sb.AppendLine();
sb.AppendLine(Resources.RectangleRegion_WriteTips__Space__Fullscreen_capture);
sb.AppendLine(Resources.RectangleRegion_WriteTips__1__2__3_____0__Monitor_capture);
sb.AppendLine(Resources.RectangleRegion_WriteTips_____Active_monitor_capture);
sb.AppendLine();
// TODO: Translate
sb.AppendLine("[Mouse wheel] Change current tool");
if (ShapeManager.CurrentShapeType == ShapeType.RegionRectangle) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 0", ShapeType.RegionRectangle.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.RegionRoundedRectangle) sb.Append("-> ");
sb.AppendLine(ShapeType.RegionRoundedRectangle.GetLocalizedDescription());
if (ShapeManager.CurrentShapeType == ShapeType.RegionEllipse) sb.Append("-> ");
sb.AppendLine(ShapeType.RegionEllipse.GetLocalizedDescription());
if (ShapeManager.CurrentShapeType == ShapeType.DrawingRectangle) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 1", ShapeType.DrawingRectangle.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingRoundedRectangle) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 2", ShapeType.DrawingRoundedRectangle.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingEllipse) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 3", ShapeType.DrawingEllipse.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingLine) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 4", ShapeType.DrawingLine.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingArrow) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 5", ShapeType.DrawingArrow.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingBlur) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 6", ShapeType.DrawingBlur.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingPixelate) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 7", ShapeType.DrawingPixelate.GetLocalizedDescription()));
if (ShapeManager.CurrentShapeType == ShapeType.DrawingHighlight) sb.Append("-> ");
sb.AppendLine(string.Format("[{0}] {1}", "Numpad 8", ShapeType.DrawingHighlight.GetLocalizedDescription()));
}
private string GetAreaText(Rectangle area)
{
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.Ruler)
2015-05-10 04:59:19 +12:00
{
Point endPos = new Point(area.Right - 1, area.Bottom - 1);
return string.Format(Resources.RectangleRegion_GetRulerText_Ruler_info, area.X, area.Y, endPos.X, endPos.Y,
area.Width, area.Height, MathHelpers.Distance(area.Location, endPos), MathHelpers.LookAtDegree(area.Location, endPos));
}
return string.Format(Resources.RectangleRegion_GetAreaText_Area, area.X, area.Y, area.Width, area.Height);
}
private string GetInfoText()
{
2016-05-14 20:58:24 +12:00
if (Mode == RectangleRegionMode.ScreenColorPicker || Config.UseCustomInfoText)
{
Color color = CurrentColor;
2016-05-14 20:58:24 +12:00
if (Mode != RectangleRegionMode.ScreenColorPicker && !string.IsNullOrEmpty(Config.CustomInfoText))
{
return Config.CustomInfoText.Replace("$r", color.R.ToString(), StringComparison.InvariantCultureIgnoreCase).
Replace("$g", color.G.ToString(), StringComparison.InvariantCultureIgnoreCase).
Replace("$b", color.B.ToString(), StringComparison.InvariantCultureIgnoreCase).
Replace("$hex", ColorHelpers.ColorToHex(color), StringComparison.InvariantCultureIgnoreCase).
Replace("$x", CurrentPosition.X.ToString(), StringComparison.InvariantCultureIgnoreCase).
Replace("$y", CurrentPosition.Y.ToString(), StringComparison.InvariantCultureIgnoreCase);
}
return string.Format(Resources.RectangleRegion_GetColorPickerText, color.R, color.G, color.B, ColorHelpers.ColorToHex(color), CurrentPosition.X, CurrentPosition.Y);
}
return string.Format("X: {0} Y: {1}", CurrentPosition.X, CurrentPosition.Y);
}
2013-11-03 23:53:49 +13:00
private void DrawCrosshair(Graphics g)
{
2014-07-25 17:54:24 +12:00
int offset = 5;
2013-11-03 23:53:49 +13:00
Point mousePos = InputManager.MousePosition0Based;
Point left = new Point(mousePos.X - offset, mousePos.Y), left2 = new Point(0, mousePos.Y);
Point right = new Point(mousePos.X + offset, mousePos.Y), right2 = new Point(ScreenRectangle0Based.Width - 1, mousePos.Y);
Point top = new Point(mousePos.X, mousePos.Y - offset), top2 = new Point(mousePos.X, 0);
Point bottom = new Point(mousePos.X, mousePos.Y + offset), bottom2 = new Point(mousePos.X, ScreenRectangle0Based.Height - 1);
if (left.X - left2.X > 10)
{
2014-07-25 17:54:24 +12:00
g.DrawLine(borderPen, left, left2);
2013-11-03 23:53:49 +13:00
g.DrawLine(borderDotPen, left, left2);
}
if (right2.X - right.X > 10)
{
2014-07-25 17:54:24 +12:00
g.DrawLine(borderPen, right, right2);
2013-11-03 23:53:49 +13:00
g.DrawLine(borderDotPen, right, right2);
}
if (top.Y - top2.Y > 10)
{
2014-07-25 17:54:24 +12:00
g.DrawLine(borderPen, top, top2);
2013-11-03 23:53:49 +13:00
g.DrawLine(borderDotPen, top, top2);
}
if (bottom2.Y - bottom.Y > 10)
{
2014-07-25 17:54:24 +12:00
g.DrawLine(borderPen, bottom, bottom2);
2013-11-03 23:53:49 +13:00
g.DrawLine(borderDotPen, bottom, bottom2);
}
}
private void DrawMagnifier(Graphics g)
{
Point mousePos = InputManager.MousePosition0Based;
Rectangle currentScreenRect0Based = CaptureHelpers.ScreenToClient(Screen.FromPoint(InputManager.MousePosition).Bounds);
2015-05-13 04:27:21 +12:00
int offsetX = 10, offsetY = 10, infoTextOffset = 0, infoTextPadding = 3;
Rectangle infoTextRect = Rectangle.Empty;
string infoText = string.Empty;
if (Config.ShowInfo)
{
infoTextOffset = 10;
2015-05-13 05:02:51 +12:00
CurrentPosition = InputManager.MousePosition;
infoText = GetInfoText();
2015-05-13 04:27:21 +12:00
Size textSize = g.MeasureString(infoText, infoFont).ToSize();
infoTextRect.Size = new Size(textSize.Width + infoTextPadding * 2, textSize.Height + infoTextPadding * 2);
}
2013-11-03 23:53:49 +13:00
using (Bitmap magnifier = Magnifier(backgroundImage, mousePos, Config.MagnifierPixelCount, Config.MagnifierPixelCount, Config.MagnifierPixelSize))
2013-11-03 23:53:49 +13:00
{
int x = mousePos.X + offsetX;
if (x + magnifier.Width > currentScreenRect0Based.Right)
2013-11-03 23:53:49 +13:00
{
x = mousePos.X - offsetX - magnifier.Width;
}
int y = mousePos.Y + offsetY;
2015-05-13 04:27:21 +12:00
if (y + magnifier.Height + infoTextOffset + infoTextRect.Height > currentScreenRect0Based.Bottom)
{
y = mousePos.Y - offsetY - magnifier.Height - infoTextOffset - infoTextRect.Height;
}
if (Config.ShowInfo)
2013-11-03 23:53:49 +13:00
{
2015-05-13 04:27:21 +12:00
infoTextRect.Location = new Point(x + (magnifier.Width / 2) - (infoTextRect.Width / 2), y + magnifier.Height + infoTextOffset);
DrawInfoText(g, infoText, infoTextRect, infoFont, infoTextPadding);
2013-11-03 23:53:49 +13:00
}
2014-07-25 13:14:48 +12:00
g.SetHighQuality();
using (TextureBrush brush = new TextureBrush(magnifier))
{
brush.TranslateTransform(x, y);
2015-08-08 01:36:18 +12:00
if (Config.UseSquareMagnifier)
{
g.FillRectangle(brush, x, y, magnifier.Width, magnifier.Height);
g.DrawRectangleProper(Pens.White, x - 1, y - 1, magnifier.Width + 2, magnifier.Height + 2);
g.DrawRectangleProper(Pens.Black, x, y, magnifier.Width, magnifier.Height);
}
else
{
g.FillEllipse(brush, x, y, magnifier.Width, magnifier.Height);
g.DrawEllipse(Pens.White, x - 1, y - 1, magnifier.Width + 2, magnifier.Height + 2);
g.DrawEllipse(Pens.Black, x, y, magnifier.Width, magnifier.Height);
}
2014-07-25 13:14:48 +12:00
}
2013-11-03 23:53:49 +13:00
}
}
private Bitmap Magnifier(Image img, Point position, int horizontalPixelCount, int verticalPixelCount, int pixelSize)
{
horizontalPixelCount = (horizontalPixelCount | 1).Between(1, 101);
verticalPixelCount = (verticalPixelCount | 1).Between(1, 101);
pixelSize = pixelSize.Between(1, 1000);
2014-07-25 13:14:48 +12:00
if (horizontalPixelCount * pixelSize > ScreenRectangle0Based.Width || verticalPixelCount * pixelSize > ScreenRectangle0Based.Height)
2013-11-03 23:53:49 +13:00
{
horizontalPixelCount = verticalPixelCount = 15;
pixelSize = 10;
}
int width = horizontalPixelCount * pixelSize;
int height = verticalPixelCount * pixelSize;
2014-07-25 13:14:48 +12:00
Bitmap bmp = new Bitmap(width - 1, height - 1);
2013-11-03 23:53:49 +13:00
using (Graphics g = Graphics.FromImage(bmp))
{
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.PixelOffsetMode = PixelOffsetMode.Half;
2014-07-25 13:14:48 +12:00
g.DrawImage(img, new Rectangle(0, 0, width, height), new Rectangle(position.X - horizontalPixelCount / 2, position.Y - verticalPixelCount / 2,
horizontalPixelCount, verticalPixelCount), GraphicsUnit.Pixel);
2013-11-03 23:53:49 +13:00
g.PixelOffsetMode = PixelOffsetMode.None;
2014-07-25 13:14:48 +12:00
using (SolidBrush crosshairBrush = new SolidBrush(Color.FromArgb(125, Color.LightBlue)))
2013-11-03 23:53:49 +13:00
{
g.FillRectangle(crosshairBrush, new Rectangle(0, (height - pixelSize) / 2, (width - pixelSize) / 2, pixelSize)); // Left
g.FillRectangle(crosshairBrush, new Rectangle((width + pixelSize) / 2, (height - pixelSize) / 2, (width - pixelSize) / 2, pixelSize)); // Right
g.FillRectangle(crosshairBrush, new Rectangle((width - pixelSize) / 2, 0, pixelSize, (height - pixelSize) / 2)); // Top
g.FillRectangle(crosshairBrush, new Rectangle((width - pixelSize) / 2, (height + pixelSize) / 2, pixelSize, (height - pixelSize) / 2)); // Bottom
}
using (Pen pen = new Pen(Color.FromArgb(75, Color.Black)))
{
for (int x = 1; x < horizontalPixelCount; x++)
{
2014-07-25 13:14:48 +12:00
g.DrawLine(pen, new Point(x * pixelSize - 1, 0), new Point(x * pixelSize - 1, height - 1));
2013-11-03 23:53:49 +13:00
}
for (int y = 1; y < verticalPixelCount; y++)
{
2014-07-25 13:14:48 +12:00
g.DrawLine(pen, new Point(0, y * pixelSize - 1), new Point(width - 1, y * pixelSize - 1));
2013-11-03 23:53:49 +13:00
}
}
2014-07-25 13:14:48 +12:00
g.DrawRectangle(Pens.Black, (width - pixelSize) / 2 - 1, (height - pixelSize) / 2 - 1, pixelSize, pixelSize);
g.DrawRectangle(Pens.White, (width - pixelSize) / 2, (height - pixelSize) / 2, pixelSize - 2, pixelSize - 2);
2013-11-03 23:53:49 +13:00
}
return bmp;
}
2014-04-12 04:29:19 +12:00
private void DrawRuler(Graphics g, Rectangle rect, Pen pen, int rulerSize, int rulerWidth)
{
if (rect.Width >= rulerSize && rect.Height >= rulerSize)
{
for (int x = 1; x <= rect.Width / rulerWidth; x++)
{
g.DrawLine(pen, new Point(rect.X + x * rulerWidth, rect.Y), new Point(rect.X + x * rulerWidth, rect.Y + rulerSize));
g.DrawLine(pen, new Point(rect.X + x * rulerWidth, rect.Bottom), new Point(rect.X + x * rulerWidth, rect.Bottom - rulerSize));
}
for (int y = 1; y <= rect.Height / rulerWidth; y++)
{
g.DrawLine(pen, new Point(rect.X, rect.Y + y * rulerWidth), new Point(rect.X + rulerSize, rect.Y + y * rulerWidth));
g.DrawLine(pen, new Point(rect.Right, rect.Y + y * rulerWidth), new Point(rect.Right - rulerSize, rect.Y + y * rulerWidth));
}
}
}
2013-11-03 23:53:49 +13:00
public void UpdateRegionPath()
{
if (regionFillPath != null)
{
regionFillPath.Dispose();
regionFillPath = null;
}
if (regionDrawPath != null)
{
regionDrawPath.Dispose();
regionDrawPath = null;
}
BaseShape[] areas = ShapeManager.ValidRegions;
2013-11-03 23:53:49 +13:00
if (areas != null && areas.Length > 0)
2013-11-03 23:53:49 +13:00
{
regionFillPath = new GraphicsPath { FillMode = FillMode.Winding };
regionDrawPath = new GraphicsPath { FillMode = FillMode.Winding };
foreach (BaseShape regionShape in ShapeManager.ValidRegions)
{
regionShape.AddShapePath(regionFillPath);
regionShape.AddShapePath(regionDrawPath, -1);
}
2013-11-03 23:53:49 +13:00
}
}
protected override Image GetOutputImage()
2016-05-03 23:54:02 +12:00
{
return ShapeManager.RenderOutputImage(backgroundImage);
2016-05-03 23:54:02 +12:00
}
protected override void Dispose(bool disposing)
{
if (bmpBackgroundImage != null)
{
bmpBackgroundImage.Dispose();
}
base.Dispose(disposing);
}
2013-11-03 23:53:49 +13:00
}
2014-10-21 08:37:51 +13:00
}