public Surface() { ScreenRectangle = CaptureHelpers.GetScreenBounds(); ScreenRectangle0Based = CaptureHelpers.ScreenToClient(ScreenRectangle); InitializeComponent(); Icon = ShareXResources.Icon; using (MemoryStream cursorStream = new MemoryStream(Resources.Crosshair)) { Cursor = new Cursor(cursorStream); } DrawableObjects = new List <DrawableObject>(); Config = new SurfaceOptions(); timerStart = new Stopwatch(); timerFPS = new Stopwatch(); borderPen = new Pen(Color.Black); borderDotPen = new Pen(Color.White); borderDotPen.DashPattern = new float[] { 5, 5 }; nodeBackgroundBrush = new SolidBrush(Color.White); textFont = new Font("Verdana", 16, FontStyle.Bold); infoFont = new Font("Verdana", 9); textBackgroundBrush = new SolidBrush(Color.FromArgb(75, Color.Black)); textBackgroundPenWhite = new Pen(Color.FromArgb(50, Color.White)); textBackgroundPenBlack = new Pen(Color.FromArgb(150, Color.Black)); markerPen = new Pen(Color.FromArgb(200, Color.Red)) { DashStyle = DashStyle.Dash }; }
public Surface(Image backgroundImage = null) { ScreenRectangle = CaptureHelpers.GetScreenBounds(); ScreenRectangle0Based = CaptureHelpers.ScreenToClient(ScreenRectangle); InitializeComponent(); using (MemoryStream cursorStream = new MemoryStream(Resources.Crosshair)) { Cursor = new Cursor(cursorStream); } if (backgroundImage != null) { SurfaceImage = backgroundImage; Prepare(); } DrawableObjects = new List <DrawableObject>(); Config = new SurfaceOptions(); timer = new Stopwatch(); borderPen = new Pen(Color.Black); borderDotPen = new Pen(Color.White); borderDotPen.DashPattern = new float[] { 5, 5 }; nodeBackgroundBrush = new SolidBrush(Color.White); textFont = new Font("Arial", 17, FontStyle.Bold); }
public BaseRegionForm() { ScreenRectangle = CaptureHelpers.GetScreenBounds(); ScreenRectangle0Based = CaptureHelpers.ScreenToClient(ScreenRectangle); InitializeComponent(); Icon = ShareXResources.Icon; Cursor = Helpers.CreateCursor(Resources.Crosshair); DrawableObjects = new List <DrawableObject>(); Config = new RegionCaptureOptions(); timerStart = new Stopwatch(); timerFPS = new Stopwatch(); borderPen = new Pen(Color.Black); borderDotPen = new Pen(Color.White); borderDotPen.DashPattern = new float[] { 5, 5 }; nodeBackgroundBrush = new SolidBrush(Color.White); infoFont = new Font("Verdana", 9); infoFontMedium = new Font("Verdana", 12); infoFontBig = new Font("Verdana", 16, FontStyle.Bold); textBackgroundBrush = new SolidBrush(Color.FromArgb(75, Color.Black)); textBackgroundPenWhite = new Pen(Color.FromArgb(50, Color.White)); textBackgroundPenBlack = new Pen(Color.FromArgb(150, Color.Black)); markerPen = new Pen(Color.FromArgb(200, Color.Red)); }
public RegionCaptureForm(RegionCaptureMode mode) { Mode = mode; ScreenRectangle = CaptureHelpers.GetScreenBounds(); ScreenRectangle0Based = CaptureHelpers.ScreenToClient(ScreenRectangle); ImageRectangle = ScreenRectangle0Based; InitializeComponent(); Config = new RegionCaptureOptions(); DrawableObjects = new List <DrawableObject>(); timerStart = new Stopwatch(); timerFPS = new Stopwatch(); colorBlinkAnimation = new ColorBlinkAnimation(); borderPen = new Pen(Color.Black); borderDotPen = new Pen(Color.White) { DashPattern = new float[] { 5, 5 } }; nodeBackgroundBrush = new SolidBrush(Color.White); infoFont = new Font("Verdana", 9); infoFontMedium = new Font("Verdana", 12); infoFontBig = new Font("Verdana", 16, FontStyle.Bold); textBackgroundBrush = new SolidBrush(Color.FromArgb(150, Color.FromArgb(42, 131, 199))); textOuterBorderPen = new Pen(Color.FromArgb(150, Color.White)); textInnerBorderPen = new Pen(Color.FromArgb(150, Color.FromArgb(0, 81, 145))); markerPen = new Pen(Color.FromArgb(200, Color.Red)); }
protected ImageInfo ExecuteRegionCapture(TaskSettings taskSettings) { ImageInfo imageInfo = new ImageInfo(); RegionCaptureMode mode; if (taskSettings.AdvancedSettings.RegionCaptureDisableAnnotation) { mode = RegionCaptureMode.Default; } else { mode = RegionCaptureMode.Annotation; } Screenshot screenshot = TaskHelpers.GetScreenshot(taskSettings); screenshot.CaptureCursor = false; screenshot.UseWinRTCaptureAPI = taskSettings.CaptureSettings.UseWinRTGraphicsCaptureAPI; Bitmap bmp = screenshot.CaptureFullscreen(); CursorData cursorData = null; if (taskSettings.CaptureSettings.ShowCursor) { cursorData = new CursorData(); } using (RegionCaptureForm form = new RegionCaptureForm(mode, taskSettings.CaptureSettingsReference.SurfaceOptions, bmp)) { if (cursorData != null && cursorData.IsVisible) { form.AddCursor(cursorData.Handle, CaptureHelpers.ScreenToClient(cursorData.Position)); } form.ShowDialog(); imageInfo.Image = form.GetResultImage(); if (imageInfo.Image != null) { if (form.IsModified) { AllowAnnotation = false; } if (form.Result == RegionResult.Region && taskSettings.UploadSettings.RegionCaptureUseWindowPattern) { WindowInfo windowInfo = form.GetWindowInfo(); imageInfo.UpdateInfo(windowInfo); } lastRegionCaptureType = RegionCaptureType.Default; } } return(imageInfo); }
public Image GetResultImage() { if (Mode == RegionCaptureMode.Editor) { foreach (BaseShape shape in ShapeManager.Shapes) { shape.Move(-ImageRectangle.X, -ImageRectangle.Y); } Image img = GetOutputImage(); foreach (BaseShape shape in ShapeManager.Shapes) { shape.Move(ImageRectangle.X, ImageRectangle.Y); } return(img); } else if (Result == RegionResult.Region) { using (Image img = GetOutputImage()) { return(RegionCaptureTasks.ApplyRegionPathToImage(img, regionFillPath)); } } else if (Result == RegionResult.Fullscreen) { return(GetOutputImage()); } else if (Result == RegionResult.Monitor) { Screen[] screens = Screen.AllScreens; if (MonitorIndex < screens.Length) { Screen screen = screens[MonitorIndex]; Rectangle screenRect = CaptureHelpers.ScreenToClient(screen.Bounds); using (Image img = GetOutputImage()) { return(ImageHelpers.CropImage(img, screenRect)); } } } else if (Result == RegionResult.ActiveMonitor) { Rectangle activeScreenRect = CaptureHelpers.GetActiveScreenBounds0Based(); using (Image img = GetOutputImage()) { return(ImageHelpers.CropImage(img, activeScreenRect)); } } return(null); }
private BaseShape CheckHover() { if (!IsCursorOnNode && !IsCreating && !IsMoving && !IsResizing) { BaseShape shape = GetIntersectShape(); if (shape != null && shape.IsValidShape) { return(shape); } else { switch (CurrentTool) { case ShapeType.RegionFreehand: case ShapeType.DrawingFreehand: case ShapeType.DrawingLine: case ShapeType.DrawingArrow: case ShapeType.DrawingTextOutline: case ShapeType.DrawingTextBackground: case ShapeType.DrawingSpeechBalloon: case ShapeType.DrawingStep: case ShapeType.DrawingImage: case ShapeType.DrawingCursor: return(null); } if (Options.IsFixedSize && IsCurrentShapeTypeRegion) { Point location = InputManager.ClientMousePosition; return(new RectangleRegionShape() { Rectangle = new Rectangle(new Point(location.X - Options.FixedSize.Width / 2, location.Y - Options.FixedSize.Height / 2), Options.FixedSize) }); } else { SimpleWindowInfo window = FindSelectedWindow(); if (window != null && !window.Rectangle.IsEmpty) { Rectangle hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); return(new RectangleRegionShape() { Rectangle = Rectangle.Intersect(Form.ClientArea, hoverArea) }); } } } } return(null); }
private void CheckHover() { CurrentHoverShape = null; if (!IsCursorOnNode && !IsCreating && !IsMoving && !IsResizing) { BaseShape shape = GetIntersectShape(); if (shape != null && shape.IsValidShape) { CurrentHoverShape = shape; } else { switch (CurrentShapeType) { case ShapeType.RegionFreehand: case ShapeType.DrawingFreehand: case ShapeType.DrawingLine: case ShapeType.DrawingArrow: case ShapeType.DrawingTextOutline: case ShapeType.DrawingTextBackground: case ShapeType.DrawingSpeechBalloon: case ShapeType.DrawingStep: case ShapeType.DrawingImage: return; } if (Config.IsFixedSize && IsCurrentShapeTypeRegion) { Point location = InputManager.MousePosition0Based; CurrentHoverShape = new RectangleRegionShape() { Rectangle = new Rectangle(new Point(location.X - Config.FixedSize.Width / 2, location.Y - Config.FixedSize.Height / 2), Config.FixedSize) }; } else { SimpleWindowInfo window = FindSelectedWindow(); if (window != null && !window.Rectangle.IsEmpty) { Rectangle hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); CurrentHoverShape = new RectangleRegionShape() { Rectangle = Rectangle.Intersect(form.ScreenRectangle0Based, hoverArea) }; } } } } }
private void DrawMagnifier(Graphics g) { Point mousePos = InputManager.MousePosition0Based; Rectangle currentScreenRect0Based = CaptureHelpers.ScreenToClient(Screen.FromPoint(InputManager.MousePosition).Bounds); int offsetX = 10, offsetY = 10, infoTextOffset = 0, infoTextPadding = 3; Rectangle infoTextRect = Rectangle.Empty; string infoText = string.Empty; if (Config.ShowInfo) { infoTextOffset = 10; CurrentPosition = InputManager.MousePosition; infoText = GetInfoText(); Size textSize = g.MeasureString(infoText, infoFont).ToSize(); infoTextRect.Size = new Size(textSize.Width + infoTextPadding * 2, textSize.Height + infoTextPadding * 2); } using (Bitmap magnifier = Magnifier(SurfaceImage, mousePos, Config.MagnifierPixelCount, Config.MagnifierPixelCount, Config.MagnifierPixelSize)) { int x = mousePos.X + offsetX; if (x + magnifier.Width > currentScreenRect0Based.Right) { x = mousePos.X - offsetX - magnifier.Width; } int y = mousePos.Y + offsetY; if (y + magnifier.Height + infoTextOffset + infoTextRect.Height > currentScreenRect0Based.Bottom) { y = mousePos.Y - offsetY - magnifier.Height - infoTextOffset - infoTextRect.Height; } if (Config.ShowInfo) { infoTextRect.Location = new Point(x + (magnifier.Width / 2) - (infoTextRect.Width / 2), y + magnifier.Height + infoTextOffset); DrawInfoText(g, infoText, infoTextRect, 3); } g.SetHighQuality(); using (TextureBrush brush = new TextureBrush(magnifier)) { brush.TranslateTransform(x, y); 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); } } }
private void MenuForm_Shown(object sender, EventArgs e) { form.toolbarAnimationRectangle = CaptureHelpers.ScreenToClient(menuForm.Bounds); form.toolbarAnimation = new OpacityAnimation() { FadeInDuration = TimeSpan.FromMilliseconds(500), Duration = TimeSpan.FromMilliseconds(500), FadeOutDuration = TimeSpan.FromMilliseconds(500) }; form.toolbarAnimation.Start(); }
public void Update(Control control) { Buttons = Control.MouseButtons; Position = Control.MousePosition; if (control != null) { ClientPosition = control.PointToClient(Position); } else { ClientPosition = CaptureHelpers.ScreenToClient(Position); } }
public Image CropImage(Rectangle rect, bool onlyIfSizeDifferent = false) { rect.X -= form.ImageRectangle.X; rect.Y -= form.ImageRectangle.Y; rect = CaptureHelpers.ScreenToClient(rect); rect.Intersect(new Rectangle(0, 0, form.Image.Width, form.Image.Height)); if (rect.IsValid() && (!onlyIfSizeDifferent || rect.Size != form.Image.Size)) { return(ImageHelpers.CropImage(form.Image, rect)); } return(null); }
public Image CropImage(Rectangle rect, bool onlyIfSizeDifferent = false) { rect = CaptureHelpers.ScreenToClient(rect); Point offset = CaptureHelpers.ScreenToClient(Form.CanvasRectangle.Location); rect.X -= offset.X; rect.Y -= offset.Y; rect.Intersect(new Rectangle(0, 0, Form.Canvas.Width, Form.Canvas.Height)); if (rect.IsValid() && (!onlyIfSizeDifferent || rect.Size != Form.Canvas.Size)) { return(ImageHelpers.CropBitmap((Bitmap)Form.Canvas, rect)); } return(null); }
public void CropArea(Rectangle rect) { rect.X -= form.ImageRectangle.X; rect.Y -= form.ImageRectangle.Y; rect = CaptureHelpers.ScreenToClient(rect); rect.Intersect(new Rectangle(0, 0, form.Image.Width, form.Image.Height)); if (rect.IsValid() && rect.Size != form.Image.Size) { Image img = ImageHelpers.CropImage(form.Image, rect); if (img != null) { form.InitBackground(img); } } }
private void DrawInfo(Graphics g) { string text = "FPS: " + FPS; SizeF textSize = g.MeasureString(text, textFont); int offset = 30; Rectangle primaryScreen = Screen.PrimaryScreen.Bounds; Point position = CaptureHelpers.ScreenToClient(new Point(primaryScreen.X + offset, primaryScreen.Y + offset)); Rectangle rect = new Rectangle(position, new Size((int)textSize.Width, (int)textSize.Height)); if (rect.Contains(InputManager.MousePosition0Based)) { position = CaptureHelpers.ScreenToClient(new Point(primaryScreen.X + offset, primaryScreen.Y + primaryScreen.Height - (int)textSize.Height - offset)); } ImageHelpers.DrawTextWithOutline(g, text, position, textFont, Color.White, Color.Black); }
public virtual Image GetResultImage() { if (Result == RegionResult.Region) { using (Image img = GetOutputImage()) { return(RegionCaptureHelpers.ApplyRegionPathToImage(img, regionFillPath)); } } else if (Result == RegionResult.Fullscreen) { return(GetOutputImage()); } else if (Result == RegionResult.Monitor) { Screen[] screens = Screen.AllScreens; if (MonitorIndex < screens.Length) { Screen screen = screens[MonitorIndex]; Rectangle screenRect = CaptureHelpers.ScreenToClient(screen.Bounds); using (Image img = GetOutputImage()) { return(ImageHelpers.CropImage(img, screenRect)); } } } else if (Result == RegionResult.ActiveMonitor) { Rectangle activeScreenRect = CaptureHelpers.GetActiveScreenBounds0Based(); using (Image img = GetOutputImage()) { return(ImageHelpers.CropImage(img, activeScreenRect)); } } return(null); }
public static Image CaptureRectangleNative(IntPtr handle, Rectangle rect, bool captureCursor = false) { if (rect.Width == 0 || rect.Height == 0) { return(null); } IntPtr hdcSrc = NativeMethods.GetWindowDC(handle); IntPtr hdcDest = NativeMethods.CreateCompatibleDC(hdcSrc); IntPtr hBitmap = NativeMethods.CreateCompatibleBitmap(hdcSrc, rect.Width, rect.Height); IntPtr hOld = NativeMethods.SelectObject(hdcDest, hBitmap); NativeMethods.BitBlt(hdcDest, 0, 0, rect.Width, rect.Height, hdcSrc, rect.X, rect.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); if (captureCursor) { Point cursorOffset = CaptureHelpers.ScreenToClient(rect.Location); try { using (CursorData cursorData = new CursorData()) { cursorData.DrawCursorToHandle(hdcDest, cursorOffset); } } catch (Exception e) { DebugHelper.WriteException(e, "Cursor capture failed."); } } NativeMethods.SelectObject(hdcDest, hOld); NativeMethods.DeleteDC(hdcDest); NativeMethods.ReleaseDC(handle, hdcSrc); Image img = Image.FromHbitmap(hBitmap); NativeMethods.DeleteObject(hBitmap); return(img); }
private void CheckHover() { CurrentHoverRectangle = Rectangle.Empty; if (!ResizeManager.IsCursorOnNode() && !IsCreating && !IsMoving && !IsResizing) { BaseShape shape = GetShapeIntersect(); if (shape != null && !shape.Rectangle.IsEmpty) { CurrentHoverRectangle = shape.Rectangle; } else { switch (CurrentShapeType) { case ShapeType.DrawingLine: case ShapeType.DrawingArrow: case ShapeType.DrawingStep: return; } if (Config.IsFixedSize && IsCurrentShapeTypeRegion) { Point location = InputManager.MousePosition0Based; CurrentHoverRectangle = new Rectangle(new Point(location.X - Config.FixedSize.Width / 2, location.Y - Config.FixedSize.Height / 2), Config.FixedSize); } else { SimpleWindowInfo window = FindSelectedWindow(); if (window != null && !window.Rectangle.IsEmpty) { Rectangle hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); CurrentHoverRectangle = Rectangle.Intersect(form.ScreenRectangle0Based, hoverArea); } } } } }
private void MenuForm_Shown(object sender, EventArgs e) { Point clientLocation = CaptureHelpers.ScreenToClient(menuForm.Location); form.toolbarAnimation = new PointAnimation() { FromPosition = new Point(clientLocation.X + menuForm.Width / 2, clientLocation.Y + menuForm.Height + 1), ToPosition = new Point(clientLocation.X, clientLocation.Y + menuForm.Height + 1), Duration = TimeSpan.FromMilliseconds(500) }; form.toolbarAnimation.Start(); form.toolbarAnimation2 = new PointAnimation() { FromPosition = new Point(clientLocation.X + menuForm.Width / 2, clientLocation.Y + menuForm.Height + 1), ToPosition = new Point(clientLocation.X + menuForm.Width, clientLocation.Y + menuForm.Height + 1), Duration = TimeSpan.FromMilliseconds(500) }; form.toolbarAnimation2.Start(); }
private void DrawMagnifier(Graphics g) { Point mousePos = InputManager.MousePosition0Based; Rectangle currentScreenRect0Based = CaptureHelpers.ScreenToClient(Screen.FromPoint(InputManager.MousePosition).Bounds); int offsetX = RulerMode ? 20 : 10, offsetY = RulerMode ? 20 : 10; if (Config.ShowInfo && AreaManager.IsCurrentAreaValid && AreaManager.CurrentArea.Location == mousePos) { offsetY = RulerMode ? 85 : 50; } using (Bitmap magnifier = Magnifier(SurfaceImage, mousePos, Config.MagnifierPixelCount, Config.MagnifierPixelCount, Config.MagnifierPixelSize)) { int x = mousePos.X + offsetX; if (x + magnifier.Width > currentScreenRect0Based.Right) { x = mousePos.X - offsetX - magnifier.Width; } int y = mousePos.Y + offsetY; if (y + magnifier.Height > currentScreenRect0Based.Bottom) { y = mousePos.Y - offsetY - magnifier.Height; } g.SetHighQuality(); using (TextureBrush brush = new TextureBrush(magnifier)) { brush.TranslateTransform(x, y); g.FillEllipse(brush, x, y, magnifier.Width, magnifier.Height); g.DrawEllipse(Pens.Black, x, y, magnifier.Width, magnifier.Height); } } }
private void CheckHover() { CurrentHoverArea = Rectangle.Empty; if (!ResizeManager.IsCursorOnNode() && !IsCreating && !IsMoving && !IsResizing) { Rectangle hoverArea = GetAreaIntersectWithMouse(); if (!hoverArea.IsEmpty) { CurrentHoverArea = hoverArea; } else if (WindowCaptureMode && Windows != null) { hoverArea = Windows.FirstOrDefault(x => x.Contains(InputManager.MousePosition)); if (!hoverArea.IsEmpty) { hoverArea = CaptureHelpers.ScreenToClient(hoverArea); CurrentHoverArea = Rectangle.Intersect(surface.ScreenRectangle0Based, hoverArea); } } } }
private void CheckHover() { CurrentHoverArea = Rectangle.Empty; if (!ResizeManager.IsCursorOnNode() && !IsCreating && !IsMoving && !IsResizing) { Rectangle hoverArea = GetAreaIntersectWithMouse(); if (!hoverArea.IsEmpty) { CurrentHoverArea = hoverArea; } else { SimpleWindowInfo window = FindSelectedWindow(); if (window != null && !window.Rectangle.IsEmpty) { hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); CurrentHoverArea = Rectangle.Intersect(surface.ScreenRectangle0Based, hoverArea); } } } }
public void Update() { Buttons = Control.MouseButtons; Position = Control.MousePosition; ZeroBasedPosition = CaptureHelpers.ScreenToClient(Position); }
private void CreateToolbar() { menuForm = new Form() { AutoScaleDimensions = new SizeF(6F, 13F), AutoScaleMode = AutoScaleMode.Font, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, ClientSize = new Size(759, 509), FormBorderStyle = FormBorderStyle.None, Location = new Point(200, 200), ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, Text = "ShareX - Region capture menu", TopMost = true }; menuForm.Shown += MenuForm_Shown; menuForm.KeyDown += MenuForm_KeyDown; menuForm.KeyUp += MenuForm_KeyUp; menuForm.LocationChanged += MenuForm_LocationChanged; menuForm.SuspendLayout(); tsMain = new ToolStripEx() { AutoSize = true, CanOverflow = false, ClickThrough = true, Dock = DockStyle.None, GripStyle = ToolStripGripStyle.Hidden, Location = new Point(0, 0), MinimumSize = new Size(10, 30), Padding = new Padding(0, 1, 0, 0), Renderer = new CustomToolStripProfessionalRenderer(), TabIndex = 0, ShowItemToolTips = false }; tsMain.MouseLeave += TsMain_MouseLeave; tsMain.SuspendLayout(); // https://www.medo64.com/2014/01/scaling-toolstrip-with-dpi/ using (Graphics g = menuForm.CreateGraphics()) { double scale = Math.Max(g.DpiX, g.DpiY) / 96.0; double newScale = ((int)Math.Floor(scale * 100) / 25 * 25) / 100.0; if (newScale > 1) { int newWidth = (int)(tsMain.ImageScalingSize.Width * newScale); int newHeight = (int)(tsMain.ImageScalingSize.Height * newScale); tsMain.ImageScalingSize = new Size(newWidth, newHeight); } } menuForm.Controls.Add(tsMain); tslDragLeft = new ToolStripLabel() { DisplayStyle = ToolStripItemDisplayStyle.Image, Image = Resources.ui_radio_button_uncheck, Margin = new Padding(2, 0, 2, 0), Padding = new Padding(2) }; tsMain.Items.Add(tslDragLeft); if (form.IsEditorMode) { #region Editor mode ToolStripButton tsbCompleteEdit = new ToolStripButton(); if (form.Mode == RegionCaptureMode.Editor) { tsbCompleteEdit.Text = Resources.ShapeManager_CreateToolbar_RunAfterCaptureTasks; } else { tsbCompleteEdit.Text = Resources.ShapeManager_CreateToolbar_ApplyChangesContinueTaskEnter; } tsbCompleteEdit.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbCompleteEdit.Image = Resources.tick; tsbCompleteEdit.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateRunAfterCaptureTasks); tsMain.Items.Add(tsbCompleteEdit); if (form.Mode == RegionCaptureMode.TaskEditor) { ToolStripButton tsbClose = new ToolStripButton(Resources.ShapeManager_CreateToolbar_ContinueTaskSpaceOrRightClick); tsbClose.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbClose.Image = Resources.control; tsbClose.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateContinueTask); tsMain.Items.Add(tsbClose); ToolStripButton tsbCloseCancel = new ToolStripButton(Resources.ShapeManager_CreateToolbar_CancelTaskEsc); tsbCloseCancel.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbCloseCancel.Image = Resources.cross; tsbCloseCancel.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateCancelTask); tsMain.Items.Add(tsbCloseCancel); } if (form.Mode == RegionCaptureMode.TaskEditor) { tsMain.Items.Add(new ToolStripSeparator()); } ToolStripButton tsbSaveImage = new ToolStripButton(Resources.ShapeManager_CreateToolbar_SaveImage); tsbSaveImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbSaveImage.Enabled = File.Exists(form.ImageFilePath); tsbSaveImage.Image = Resources.disk_black; tsbSaveImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateSaveImage); tsMain.Items.Add(tsbSaveImage); ToolStripButton tsbSaveImageAs = new ToolStripButton(Resources.ShapeManager_CreateToolbar_SaveImageAs); tsbSaveImageAs.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbSaveImageAs.Image = Resources.disks_black; tsbSaveImageAs.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateSaveImageAs); tsMain.Items.Add(tsbSaveImageAs); ToolStripButton tsbCopyImage = new ToolStripButton(Resources.ShapeManager_CreateToolbar_CopyImageToClipboard); tsbCopyImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbCopyImage.Image = Resources.clipboard; tsbCopyImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateCopyImage); tsMain.Items.Add(tsbCopyImage); ToolStripButton tsbUploadImage = new ToolStripButton(Resources.ShapeManager_CreateToolbar_UploadImage); tsbUploadImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbUploadImage.Image = Resources.drive_globe; tsbUploadImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateUploadImage); tsMain.Items.Add(tsbUploadImage); ToolStripButton tsbPrintImage = new ToolStripButton(Resources.ShapeManager_CreateToolbar_PrintImage); tsbPrintImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbPrintImage.Image = Resources.printer; tsbPrintImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotatePrintImage); tsMain.Items.Add(tsbPrintImage); tsMain.Items.Add(new ToolStripSeparator()); #endregion Editor mode } #region Tools foreach (ShapeType shapeType in Helpers.GetEnums <ShapeType>()) { if (form.IsEditorMode) { if (IsShapeTypeRegion(shapeType)) { continue; } } else if (shapeType == ShapeType.DrawingRectangle) { tsMain.Items.Add(new ToolStripSeparator()); } else if (shapeType == ShapeType.DrawingCrop) { continue; } ToolStripButton tsbShapeType = new ToolStripButton(shapeType.GetLocalizedDescription()); tsbShapeType.DisplayStyle = ToolStripItemDisplayStyle.Image; Image img = null; switch (shapeType) { case ShapeType.RegionRectangle: img = Resources.layer_shape_region; break; case ShapeType.RegionEllipse: img = Resources.layer_shape_ellipse_region; break; case ShapeType.RegionFreehand: img = Resources.layer_shape_polygon; break; case ShapeType.DrawingRectangle: img = Resources.layer_shape; break; case ShapeType.DrawingEllipse: img = Resources.layer_shape_ellipse; break; case ShapeType.DrawingFreehand: img = Resources.pencil; break; case ShapeType.DrawingLine: img = Resources.layer_shape_line; break; case ShapeType.DrawingArrow: img = Resources.layer_shape_arrow; break; case ShapeType.DrawingTextOutline: img = Resources.edit_outline; break; case ShapeType.DrawingTextBackground: img = Resources.edit_shade; break; case ShapeType.DrawingSpeechBalloon: img = Resources.balloon_box_left; break; case ShapeType.DrawingStep: img = Resources.counter_reset; break; case ShapeType.DrawingImage: img = Resources.folder_open_image; break; case ShapeType.DrawingImageScreen: img = Resources.monitor_image; break; case ShapeType.DrawingCursor: img = Resources.cursor; break; case ShapeType.EffectBlur: img = Resources.layer_shade; break; case ShapeType.EffectPixelate: img = Resources.grid; break; case ShapeType.EffectHighlight: img = Resources.highlighter_text; break; case ShapeType.DrawingCrop: img = Resources.image_crop; break; } tsbShapeType.Image = img; tsbShapeType.Checked = shapeType == CurrentShapeType; tsbShapeType.Tag = shapeType; tsbShapeType.MouseDown += (sender, e) => { tsbShapeType.RadioCheck(); CurrentShapeType = shapeType; }; tsMain.Items.Add(tsbShapeType); } #endregion Tools #region Shape options tsMain.Items.Add(new ToolStripSeparator()); tsbBorderColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Border_color___); tsbBorderColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbBorderColor.Click += (sender, e) => { PauseForm(); ShapeType shapeType = CurrentShapeType; Color borderColor; if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon) { borderColor = AnnotationOptions.TextBorderColor; } else if (shapeType == ShapeType.DrawingTextOutline) { borderColor = AnnotationOptions.TextOutlineBorderColor; } else if (shapeType == ShapeType.DrawingStep) { borderColor = AnnotationOptions.StepBorderColor; } else { borderColor = AnnotationOptions.BorderColor; } if (ColorPickerForm.PickColor(borderColor, out Color newColor)) { if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextBorderColor = newColor; } else if (shapeType == ShapeType.DrawingTextOutline) { AnnotationOptions.TextOutlineBorderColor = newColor; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepBorderColor = newColor; } else { AnnotationOptions.BorderColor = newColor; } UpdateMenu(); UpdateCurrentShape(); } ResumeForm(); }; tsMain.Items.Add(tsbBorderColor); tsbFillColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Fill_color___); tsbFillColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbFillColor.Click += (sender, e) => { PauseForm(); ShapeType shapeType = CurrentShapeType; Color fillColor; if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon) { fillColor = AnnotationOptions.TextFillColor; } else if (shapeType == ShapeType.DrawingStep) { fillColor = AnnotationOptions.StepFillColor; } else { fillColor = AnnotationOptions.FillColor; } if (ColorPickerForm.PickColor(fillColor, out Color newColor)) { if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextFillColor = newColor; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepFillColor = newColor; } else { AnnotationOptions.FillColor = newColor; } UpdateMenu(); UpdateCurrentShape(); } ResumeForm(); }; tsMain.Items.Add(tsbFillColor); tsbHighlightColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Highlight_color___); tsbHighlightColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbHighlightColor.Click += (sender, e) => { PauseForm(); if (ColorPickerForm.PickColor(AnnotationOptions.HighlightColor, out Color newColor)) { AnnotationOptions.HighlightColor = newColor; UpdateMenu(); UpdateCurrentShape(); } ResumeForm(); }; tsMain.Items.Add(tsbHighlightColor); tsddbShapeOptions = new ToolStripDropDownButton(Resources.ShapeManager_CreateToolbar_ShapeOptions); tsddbShapeOptions.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbShapeOptions.Image = Resources.layer__pencil; tsMain.Items.Add(tsddbShapeOptions); tslnudBorderSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Border_size_); tslnudBorderSize.Content.Minimum = 0; tslnudBorderSize.Content.Maximum = 20; tslnudBorderSize.Content.ValueChanged = (sender, e) => { ShapeType shapeType = CurrentShapeType; int borderSize = (int)tslnudBorderSize.Content.Value; if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextBorderSize = borderSize; } else if (shapeType == ShapeType.DrawingTextOutline) { AnnotationOptions.TextOutlineBorderSize = borderSize; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepBorderSize = borderSize; } else { AnnotationOptions.BorderSize = borderSize; } UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudBorderSize); tslnudCornerRadius = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Corner_radius_); tslnudCornerRadius.Content.Minimum = 0; tslnudCornerRadius.Content.Maximum = 150; tslnudCornerRadius.Content.ValueChanged = (sender, e) => { ShapeType shapeType = CurrentShapeType; if (shapeType == ShapeType.RegionRectangle) { AnnotationOptions.RegionCornerRadius = (int)tslnudCornerRadius.Content.Value; } else if (shapeType == ShapeType.DrawingRectangle || shapeType == ShapeType.DrawingTextBackground) { AnnotationOptions.DrawingCornerRadius = (int)tslnudCornerRadius.Content.Value; } UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudCornerRadius); tslnudBlurRadius = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Blur_radius_); tslnudBlurRadius.Content.Minimum = 3; tslnudBlurRadius.Content.Maximum = 199; tslnudBlurRadius.Content.Increment = 2; tslnudBlurRadius.Content.ValueChanged = (sender, e) => { AnnotationOptions.BlurRadius = (int)tslnudBlurRadius.Content.Value; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudBlurRadius); tslnudPixelateSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Pixel_size_); tslnudPixelateSize.Content.Minimum = 2; tslnudPixelateSize.Content.Maximum = 10000; tslnudPixelateSize.Content.ValueChanged = (sender, e) => { AnnotationOptions.PixelateSize = (int)tslnudPixelateSize.Content.Value; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudPixelateSize); tslnudCenterPoints = new ToolStripLabeledNumericUpDown("Center points:"); tslnudCenterPoints.Content.Minimum = 0; tslnudCenterPoints.Content.Maximum = LineDrawingShape.MaximumCenterPointCount; tslnudCenterPoints.Content.ValueChanged = (sender, e) => { AnnotationOptions.LineCenterPointCount = (int)tslnudCenterPoints.Content.Value; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudCenterPoints); tsmiArrowHeadsBothSide = new ToolStripMenuItem("Arrow heads in both side"); tsmiArrowHeadsBothSide.CheckOnClick = true; tsmiArrowHeadsBothSide.Click += (sender, e) => { AnnotationOptions.ArrowHeadsBothSide = tsmiArrowHeadsBothSide.Checked; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tsmiArrowHeadsBothSide); tsmiShadow = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_DropShadow); tsmiShadow.Checked = true; tsmiShadow.CheckOnClick = true; tsmiShadow.Click += (sender, e) => { AnnotationOptions.Shadow = tsmiShadow.Checked; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tsmiShadow); // In dropdown menu if only last item is visible then menu opens at 0, 0 position on first open, so need to add dummy item to solve this weird bug... tsddbShapeOptions.DropDownItems.Add(new ToolStripSeparator() { Visible = false }); #endregion Shape options #region Edit ToolStripDropDownButton tsddbEdit = new ToolStripDropDownButton(Resources.ShapeManager_CreateToolbar_Edit); tsddbEdit.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbEdit.Image = Resources.wrench_screwdriver; tsMain.Items.Add(tsddbEdit); tsmiUndo = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_Undo); tsmiUndo.Image = Resources.arrow_circle_225_left; tsmiUndo.ShortcutKeyDisplayString = "Ctrl+Z"; tsmiUndo.MouseDown += (sender, e) => UndoShape(); tsddbEdit.DropDownItems.Add(tsmiUndo); tsddbEdit.DropDownItems.Add(new ToolStripSeparator()); tsmiDelete = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_Delete); tsmiDelete.Image = Resources.layer__minus; tsmiDelete.ShortcutKeyDisplayString = "Del"; tsmiDelete.MouseDown += (sender, e) => DeleteCurrentShape(); tsddbEdit.DropDownItems.Add(tsmiDelete); tsmiDeleteAll = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_DeleteAll); tsmiDeleteAll.Image = Resources.eraser; tsmiDeleteAll.ShortcutKeyDisplayString = "Shift+Del"; tsmiDeleteAll.MouseDown += (sender, e) => DeleteAllShapes(); tsddbEdit.DropDownItems.Add(tsmiDeleteAll); tsddbEdit.DropDownItems.Add(new ToolStripSeparator()); tsmiMoveTop = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_BringToFront); tsmiMoveTop.Image = Resources.layers_stack_arrange; tsmiMoveTop.ShortcutKeyDisplayString = "Home"; tsmiMoveTop.MouseDown += (sender, e) => MoveCurrentShapeTop(); tsddbEdit.DropDownItems.Add(tsmiMoveTop); tsmiMoveUp = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_BringForward); tsmiMoveUp.Image = Resources.layers_arrange; tsmiMoveUp.ShortcutKeyDisplayString = "Page up"; tsmiMoveUp.MouseDown += (sender, e) => MoveCurrentShapeUp(); tsddbEdit.DropDownItems.Add(tsmiMoveUp); tsmiMoveDown = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_SendBackward); tsmiMoveDown.Image = Resources.layers_arrange_back; tsmiMoveDown.ShortcutKeyDisplayString = "Page down"; tsmiMoveDown.MouseDown += (sender, e) => MoveCurrentShapeDown(); tsddbEdit.DropDownItems.Add(tsmiMoveDown); tsmiMoveBottom = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_SendToBack); tsmiMoveBottom.Image = Resources.layers_stack_arrange_back; tsmiMoveBottom.ShortcutKeyDisplayString = "End"; tsmiMoveBottom.MouseDown += (sender, e) => MoveCurrentShapeBottom(); tsddbEdit.DropDownItems.Add(tsmiMoveBottom); #endregion Edit if (!form.IsEditorMode) { tsMain.Items.Add(new ToolStripSeparator()); #region Capture ToolStripDropDownButton tsddbCapture = new ToolStripDropDownButton(Resources.ShapeManager_CreateContextMenu_Capture); tsddbCapture.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbCapture.Image = Resources.camera; tsMain.Items.Add(tsddbCapture); tsmiRegionCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_CaptureRegions); tsmiRegionCapture.Image = Resources.layer; tsmiRegionCapture.ShortcutKeyDisplayString = "Enter"; tsmiRegionCapture.MouseDown += (sender, e) => { form.UpdateRegionPath(); form.Close(RegionResult.Region); }; tsddbCapture.DropDownItems.Add(tsmiRegionCapture); if (RegionCaptureForm.LastRegionFillPath != null) { ToolStripMenuItem tsmiLastRegionCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateToolbar_LastRegion); tsmiLastRegionCapture.Image = Resources.layers; tsmiLastRegionCapture.MouseDown += (sender, e) => form.Close(RegionResult.LastRegion); tsddbCapture.DropDownItems.Add(tsmiLastRegionCapture); } ToolStripMenuItem tsmiFullscreenCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_fullscreen); tsmiFullscreenCapture.Image = Resources.layer_fullscreen; tsmiFullscreenCapture.ShortcutKeyDisplayString = "Space"; tsmiFullscreenCapture.MouseDown += (sender, e) => form.Close(RegionResult.Fullscreen); tsddbCapture.DropDownItems.Add(tsmiFullscreenCapture); ToolStripMenuItem tsmiActiveMonitorCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_active_monitor); tsmiActiveMonitorCapture.Image = Resources.monitor; tsmiActiveMonitorCapture.ShortcutKeyDisplayString = "~"; tsmiActiveMonitorCapture.MouseDown += (sender, e) => form.Close(RegionResult.ActiveMonitor); tsddbCapture.DropDownItems.Add(tsmiActiveMonitorCapture); ToolStripMenuItem tsmiMonitorCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_monitor); tsmiMonitorCapture.HideImageMargin(); tsmiMonitorCapture.Image = Resources.monitor_window; tsddbCapture.DropDownItems.Add(tsmiMonitorCapture); Screen[] screens = Screen.AllScreens; for (int i = 0; i < screens.Length; i++) { Screen screen = screens[i]; ToolStripMenuItem tsmi = new ToolStripMenuItem($"{screen.Bounds.Width}x{screen.Bounds.Height}"); tsmi.ShortcutKeyDisplayString = (i + 1).ToString(); int index = i; tsmi.MouseDown += (sender, e) => { form.MonitorIndex = index; form.Close(RegionResult.Monitor); }; tsmiMonitorCapture.DropDownItems.Add(tsmi); } #endregion Capture #region Options ToolStripDropDownButton tsddbOptions = new ToolStripDropDownButton(Resources.ShapeManager_CreateContextMenu_Options); tsddbOptions.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbOptions.Image = Resources.gear; tsMain.Items.Add(tsddbOptions); tsmiQuickCrop = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Multi_region_mode); tsmiQuickCrop.Checked = !Config.QuickCrop; tsmiQuickCrop.CheckOnClick = true; tsmiQuickCrop.ShortcutKeyDisplayString = "Q"; tsmiQuickCrop.Click += (sender, e) => Config.QuickCrop = !tsmiQuickCrop.Checked; tsddbOptions.DropDownItems.Add(tsmiQuickCrop); tsmiTips = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_tips); tsmiTips.Checked = Config.ShowHotkeys; tsmiTips.CheckOnClick = true; tsmiTips.ShortcutKeyDisplayString = "F1"; tsmiTips.Click += (sender, e) => Config.ShowHotkeys = tsmiTips.Checked; tsddbOptions.DropDownItems.Add(tsmiTips); ToolStripMenuItem tsmiShowInfo = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_position_and_size_info); tsmiShowInfo.Checked = Config.ShowInfo; tsmiShowInfo.CheckOnClick = true; tsmiShowInfo.Click += (sender, e) => Config.ShowInfo = tsmiShowInfo.Checked; tsddbOptions.DropDownItems.Add(tsmiShowInfo); ToolStripMenuItem tsmiShowMagnifier = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_magnifier); tsmiShowMagnifier.Checked = Config.ShowMagnifier; tsmiShowMagnifier.CheckOnClick = true; tsmiShowMagnifier.Click += (sender, e) => Config.ShowMagnifier = tsmiShowMagnifier.Checked; tsddbOptions.DropDownItems.Add(tsmiShowMagnifier); ToolStripMenuItem tsmiUseSquareMagnifier = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Square_shape_magnifier); tsmiUseSquareMagnifier.Checked = Config.UseSquareMagnifier; tsmiUseSquareMagnifier.CheckOnClick = true; tsmiUseSquareMagnifier.Click += (sender, e) => Config.UseSquareMagnifier = tsmiUseSquareMagnifier.Checked; tsddbOptions.DropDownItems.Add(tsmiUseSquareMagnifier); ToolStripLabeledNumericUpDown tslnudMagnifierPixelCount = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Magnifier_pixel_count_); tslnudMagnifierPixelCount.Content.Minimum = RegionCaptureOptions.MagnifierPixelCountMinimum; tslnudMagnifierPixelCount.Content.Maximum = RegionCaptureOptions.MagnifierPixelCountMaximum; tslnudMagnifierPixelCount.Content.Increment = 2; tslnudMagnifierPixelCount.Content.Value = Config.MagnifierPixelCount; tslnudMagnifierPixelCount.Content.ValueChanged = (sender, e) => Config.MagnifierPixelCount = (int)tslnudMagnifierPixelCount.Content.Value; tsddbOptions.DropDownItems.Add(tslnudMagnifierPixelCount); ToolStripLabeledNumericUpDown tslnudMagnifierPixelSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Magnifier_pixel_size_); tslnudMagnifierPixelSize.Content.Minimum = RegionCaptureOptions.MagnifierPixelSizeMinimum; tslnudMagnifierPixelSize.Content.Maximum = RegionCaptureOptions.MagnifierPixelSizeMaximum; tslnudMagnifierPixelSize.Content.Value = Config.MagnifierPixelSize; tslnudMagnifierPixelSize.Content.ValueChanged = (sender, e) => Config.MagnifierPixelSize = (int)tslnudMagnifierPixelSize.Content.Value; tsddbOptions.DropDownItems.Add(tslnudMagnifierPixelSize); ToolStripMenuItem tsmiShowCrosshair = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_screen_wide_crosshair); tsmiShowCrosshair.Checked = Config.ShowCrosshair; tsmiShowCrosshair.CheckOnClick = true; tsmiShowCrosshair.Click += (sender, e) => Config.ShowCrosshair = tsmiShowCrosshair.Checked; tsddbOptions.DropDownItems.Add(tsmiShowCrosshair); ToolStripMenuItem tsmiEnableAnimations = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_EnableAnimations); tsmiEnableAnimations.Checked = Config.EnableAnimations; tsmiEnableAnimations.CheckOnClick = true; tsmiEnableAnimations.Click += (sender, e) => Config.EnableAnimations = tsmiEnableAnimations.Checked; tsddbOptions.DropDownItems.Add(tsmiEnableAnimations); ToolStripMenuItem tsmiFixedSize = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Fixed_size_region_mode); tsmiFixedSize.Checked = Config.IsFixedSize; tsmiFixedSize.CheckOnClick = true; tsmiFixedSize.Click += (sender, e) => Config.IsFixedSize = tsmiFixedSize.Checked; tsddbOptions.DropDownItems.Add(tsmiFixedSize); ToolStripDoubleLabeledNumericUpDown tslnudFixedSize = new ToolStripDoubleLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Width_, Resources.ShapeManager_CreateContextMenu_Height_); tslnudFixedSize.Content.Minimum = 10; tslnudFixedSize.Content.Maximum = 10000; tslnudFixedSize.Content.Increment = 10; tslnudFixedSize.Content.Value = Config.FixedSize.Width; tslnudFixedSize.Content.Value2 = Config.FixedSize.Height; tslnudFixedSize.Content.ValueChanged = (sender, e) => Config.FixedSize = new Size((int)tslnudFixedSize.Content.Value, (int)tslnudFixedSize.Content.Value2); tsddbOptions.DropDownItems.Add(tslnudFixedSize); ToolStripMenuItem tsmiShowFPS = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_FPS); tsmiShowFPS.Checked = Config.ShowFPS; tsmiShowFPS.CheckOnClick = true; tsmiShowFPS.Click += (sender, e) => Config.ShowFPS = tsmiShowFPS.Checked; tsddbOptions.DropDownItems.Add(tsmiShowFPS); ToolStripMenuItem tsmiRememberMenuState = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_RememberMenuState); tsmiRememberMenuState.Checked = Config.RememberMenuState; tsmiRememberMenuState.CheckOnClick = true; tsmiRememberMenuState.Click += (sender, e) => Config.RememberMenuState = tsmiRememberMenuState.Checked; tsddbOptions.DropDownItems.Add(tsmiRememberMenuState); #endregion Options } ToolStripLabel tslDragRight = new ToolStripLabel() { Alignment = ToolStripItemAlignment.Right, DisplayStyle = ToolStripItemDisplayStyle.Image, Image = Resources.ui_radio_button_uncheck, Margin = new Padding(0, 0, 2, 0), Padding = new Padding(2) }; tsMain.Items.Add(tslDragRight); tslDragLeft.MouseDown += TslDrag_MouseDown; tslDragRight.MouseDown += TslDrag_MouseDown; tslDragLeft.MouseEnter += TslDrag_MouseEnter; tslDragRight.MouseEnter += TslDrag_MouseEnter; tslDragLeft.MouseLeave += TslDrag_MouseLeave; tslDragRight.MouseLeave += TslDrag_MouseLeave; foreach (ToolStripItem tsi in tsMain.Items.OfType <ToolStripItem>()) { if (!string.IsNullOrEmpty(tsi.Text)) { tsi.MouseEnter += (sender, e) => { Point pos = CaptureHelpers.ScreenToClient(menuForm.PointToScreen(tsi.Bounds.Location)); pos.Y += tsi.Height + 8; MenuTextAnimation.Text = tsi.Text; MenuTextAnimation.Position = pos; MenuTextAnimation.Start(); }; tsi.MouseLeave += TsMain_MouseLeave; } } tsMain.ResumeLayout(false); tsMain.PerformLayout(); menuForm.ResumeLayout(false); menuForm.Show(form); UpdateMenu(); CurrentShapeChanged += shape => UpdateMenu(); CurrentShapeTypeChanged += shapeType => UpdateMenu(); ShapeCreated += shape => UpdateMenu(); ConfigureMenuState(); form.Activate(); }
private void CreateToolbar() { menuForm = new Form() { AutoScaleDimensions = new SizeF(6F, 13F), AutoScaleMode = AutoScaleMode.Font, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, ClientSize = new Size(759, 509), FormBorderStyle = FormBorderStyle.None, Location = new Point(200, 200), ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, Text = "ShareX - Region capture menu", TopMost = true }; menuForm.KeyUp += MenuForm_KeyUp; menuForm.LocationChanged += MenuForm_LocationChanged; menuForm.SuspendLayout(); tsMain = new ToolStripEx() { AutoSize = true, CanOverflow = false, ClickThrough = true, Dock = DockStyle.None, GripStyle = ToolStripGripStyle.Hidden, Location = new Point(0, 0), MinimumSize = new Size(10, 30), Padding = new Padding(0, 0, 0, 0), Renderer = new CustomToolStripProfessionalRenderer(), TabIndex = 0, ShowItemToolTips = false }; tsMain.MouseLeave += TsMain_MouseLeave; tsMain.SuspendLayout(); // https://www.medo64.com/2014/01/scaling-toolstrip-with-dpi/ using (Graphics g = menuForm.CreateGraphics()) { double scale = Math.Max(g.DpiX, g.DpiY) / 96.0; double newScale = ((int)Math.Floor(scale * 100) / 25 * 25) / 100.0; if (newScale > 1) { int newWidth = (int)(tsMain.ImageScalingSize.Width * newScale); int newHeight = (int)(tsMain.ImageScalingSize.Height * newScale); tsMain.ImageScalingSize = new Size(newWidth, newHeight); } } menuForm.Controls.Add(tsMain); tslDragLeft = new ToolStripLabel() { DisplayStyle = ToolStripItemDisplayStyle.Image, Image = Resources.ui_radio_button_uncheck, Margin = new Padding(2, 0, 2, 0), Padding = new Padding(2) }; tsMain.Items.Add(tslDragLeft); #region Editor mode if (form.Mode == RegionCaptureMode.Editor) { ToolStripButton tsbCompleteEdit = new ToolStripButton("Run after capture tasks"); tsbCompleteEdit.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbCompleteEdit.Image = Resources.tick; tsbCompleteEdit.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateRunAfterCaptureTasks); tsMain.Items.Add(tsbCompleteEdit); ToolStripButton tsbSaveImage = new ToolStripButton("Save image"); tsbSaveImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbSaveImage.Enabled = !string.IsNullOrEmpty(form.ImageFilePath); tsbSaveImage.Image = Resources.disk_black; tsbSaveImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateSaveImage); tsMain.Items.Add(tsbSaveImage); ToolStripButton tsbSaveImageAs = new ToolStripButton("Save image as..."); tsbSaveImageAs.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbSaveImageAs.Image = Resources.disks_black; tsbSaveImageAs.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateSaveImageAs); tsMain.Items.Add(tsbSaveImageAs); ToolStripButton tsbCopyImage = new ToolStripButton("Copy image to clipboard"); tsbCopyImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbCopyImage.Image = Resources.clipboard; tsbCopyImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateCopyImage); tsMain.Items.Add(tsbCopyImage); ToolStripButton tsbUploadImage = new ToolStripButton("Upload image"); tsbUploadImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbUploadImage.Image = Resources.drive_globe; tsbUploadImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotateUploadImage); tsMain.Items.Add(tsbUploadImage); ToolStripButton tsbPrintImage = new ToolStripButton("Print image..."); tsbPrintImage.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbPrintImage.Image = Resources.printer; tsbPrintImage.MouseDown += (sender, e) => form.Close(RegionResult.AnnotatePrintImage); tsMain.Items.Add(tsbPrintImage); tsMain.Items.Add(new ToolStripSeparator()); } #endregion Editor mode #region Tools foreach (ShapeType shapeType in Helpers.GetEnums <ShapeType>()) { if (form.Mode == RegionCaptureMode.Editor) { if (IsShapeTypeRegion(shapeType)) { continue; } } else if (shapeType == ShapeType.DrawingRectangle) { tsMain.Items.Add(new ToolStripSeparator()); } ToolStripButton tsbShapeType = new ToolStripButton(shapeType.GetLocalizedDescription()); tsbShapeType.DisplayStyle = ToolStripItemDisplayStyle.Image; Image img = null; switch (shapeType) { case ShapeType.RegionRectangle: img = Resources.layer_shape_region; break; case ShapeType.RegionRoundedRectangle: img = Resources.layer_shape_round_region; break; case ShapeType.RegionEllipse: img = Resources.layer_shape_ellipse_region; break; case ShapeType.RegionFreehand: img = Resources.layer_shape_polygon; break; case ShapeType.DrawingRectangle: img = Resources.layer_shape; break; case ShapeType.DrawingRoundedRectangle: img = Resources.layer_shape_round; break; case ShapeType.DrawingEllipse: img = Resources.layer_shape_ellipse; break; case ShapeType.DrawingFreehand: img = Resources.layer_shape_curve; break; case ShapeType.DrawingLine: img = Resources.layer_shape_line; break; case ShapeType.DrawingArrow: img = Resources.layer_shape_arrow; break; case ShapeType.DrawingText: img = Resources.layer_shape_text; break; case ShapeType.DrawingSpeechBalloon: img = Resources.balloon_box_left; break; case ShapeType.DrawingStep: img = Resources.counter_reset; break; case ShapeType.DrawingImage: img = Resources.image; break; case ShapeType.EffectBlur: img = Resources.layer_shade; break; case ShapeType.EffectPixelate: img = Resources.grid; break; case ShapeType.EffectHighlight: img = Resources.highlighter_text; break; } tsbShapeType.Image = img; tsbShapeType.Checked = shapeType == CurrentShapeType; tsbShapeType.Tag = shapeType; tsbShapeType.MouseDown += (sender, e) => { tsbShapeType.RadioCheck(); CurrentShapeType = shapeType; }; tsMain.Items.Add(tsbShapeType); } #endregion Tools #region Selected object tsMain.Items.Add(new ToolStripSeparator()); tsbBorderColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Border_color___); tsbBorderColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbBorderColor.Click += (sender, e) => { PauseForm(); ShapeType shapeType = CurrentShapeType; Color borderColor; if (shapeType == ShapeType.DrawingText || shapeType == ShapeType.DrawingSpeechBalloon) { borderColor = AnnotationOptions.TextBorderColor; } else if (shapeType == ShapeType.DrawingStep) { borderColor = AnnotationOptions.StepBorderColor; } else { borderColor = AnnotationOptions.BorderColor; } using (ColorPickerForm dialogColor = new ColorPickerForm(borderColor)) { if (dialogColor.ShowDialog() == DialogResult.OK) { if (shapeType == ShapeType.DrawingText || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextBorderColor = dialogColor.NewColor; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepBorderColor = dialogColor.NewColor; } else { AnnotationOptions.BorderColor = dialogColor.NewColor; } UpdateMenu(); UpdateCurrentShape(); } } ResumeForm(); }; tsMain.Items.Add(tsbBorderColor); tsbFillColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Fill_color___); tsbFillColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbFillColor.Click += (sender, e) => { PauseForm(); ShapeType shapeType = CurrentShapeType; Color fillColor; if (shapeType == ShapeType.DrawingText || shapeType == ShapeType.DrawingSpeechBalloon) { fillColor = AnnotationOptions.TextFillColor; } else if (shapeType == ShapeType.DrawingStep) { fillColor = AnnotationOptions.StepFillColor; } else { fillColor = AnnotationOptions.FillColor; } using (ColorPickerForm dialogColor = new ColorPickerForm(fillColor)) { if (dialogColor.ShowDialog() == DialogResult.OK) { if (shapeType == ShapeType.DrawingText || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextFillColor = dialogColor.NewColor; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepFillColor = dialogColor.NewColor; } else { AnnotationOptions.FillColor = dialogColor.NewColor; } UpdateMenu(); UpdateCurrentShape(); } } ResumeForm(); }; tsMain.Items.Add(tsbFillColor); tsbHighlightColor = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Highlight_color___); tsbHighlightColor.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbHighlightColor.Click += (sender, e) => { PauseForm(); using (ColorPickerForm dialogColor = new ColorPickerForm(AnnotationOptions.HighlightColor)) { if (dialogColor.ShowDialog() == DialogResult.OK) { AnnotationOptions.HighlightColor = dialogColor.NewColor; UpdateMenu(); UpdateCurrentShape(); } } ResumeForm(); }; tsMain.Items.Add(tsbHighlightColor); tsddbShapeOptions = new ToolStripDropDownButton("Shape options"); tsddbShapeOptions.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbShapeOptions.HideImageMargin(); tsddbShapeOptions.Image = Resources.layer__pencil; tsMain.Items.Add(tsddbShapeOptions); tslnudBorderSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Border_size_); tslnudBorderSize.Content.Minimum = 0; tslnudBorderSize.Content.Maximum = 20; tslnudBorderSize.Content.ValueChanged = (sender, e) => { ShapeType shapeType = CurrentShapeType; int borderSize = (int)tslnudBorderSize.Content.Value; if (shapeType == ShapeType.DrawingText || shapeType == ShapeType.DrawingSpeechBalloon) { AnnotationOptions.TextBorderSize = borderSize; } else if (shapeType == ShapeType.DrawingStep) { AnnotationOptions.StepBorderSize = borderSize; } else { AnnotationOptions.BorderSize = borderSize; } UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudBorderSize); tslnudCornerRadius = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Corner_radius_); tslnudCornerRadius.Content.Minimum = 0; tslnudCornerRadius.Content.Maximum = 150; tslnudCornerRadius.Content.Increment = 3; tslnudCornerRadius.Content.ValueChanged = (sender, e) => { ShapeType shapeType = CurrentShapeType; if (shapeType == ShapeType.RegionRoundedRectangle || shapeType == ShapeType.DrawingRoundedRectangle) { AnnotationOptions.RoundedRectangleRadius = (int)tslnudCornerRadius.Content.Value; } else if (shapeType == ShapeType.DrawingText) { AnnotationOptions.TextCornerRadius = (int)tslnudCornerRadius.Content.Value; } UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudCornerRadius); tslnudBlurRadius = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Blur_radius_); tslnudBlurRadius.Content.Minimum = 2; tslnudBlurRadius.Content.Maximum = 100; tslnudBlurRadius.Content.ValueChanged = (sender, e) => { AnnotationOptions.BlurRadius = (int)tslnudBlurRadius.Content.Value; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudBlurRadius); tslnudPixelateSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Pixel_size_); tslnudPixelateSize.Content.Minimum = 2; tslnudPixelateSize.Content.Maximum = 100; tslnudPixelateSize.Content.ValueChanged = (sender, e) => { AnnotationOptions.PixelateSize = (int)tslnudPixelateSize.Content.Value; UpdateCurrentShape(); }; tsddbShapeOptions.DropDownItems.Add(tslnudPixelateSize); // In dropdown menu if only last item is visible then menu opens at 0, 0 position on first open, so need to add dummy item to solve this weird bug... tsddbShapeOptions.DropDownItems.Add(new ToolStripSeparator() { Visible = false }); tsbUndoObject = new ToolStripButton("Undo object"); tsbUndoObject.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbUndoObject.Image = Resources.arrow_circle_225_left; tsbUndoObject.MouseDown += (sender, e) => UndoShape(); tsMain.Items.Add(tsbUndoObject); tsbDeleteAll = new ToolStripButton(Resources.ShapeManager_CreateContextMenu_Delete_all_objects); tsbDeleteAll.DisplayStyle = ToolStripItemDisplayStyle.Image; tsbDeleteAll.Image = Resources.eraser; tsbDeleteAll.MouseDown += (sender, e) => DeleteAllShapes(); tsMain.Items.Add(tsbDeleteAll); #endregion Selected object #region Capture if (form.Mode != RegionCaptureMode.Editor) { tsMain.Items.Add(new ToolStripSeparator()); ToolStripDropDownButton tsddbCapture = new ToolStripDropDownButton("Capture"); tsddbCapture.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbCapture.Image = Resources.camera; tsMain.Items.Add(tsddbCapture); tsmiRegionCapture = new ToolStripMenuItem("Capture regions"); tsmiRegionCapture.Image = Resources.layers; tsmiRegionCapture.MouseDown += (sender, e) => { form.UpdateRegionPath(); form.Close(RegionResult.Region); }; tsddbCapture.DropDownItems.Add(tsmiRegionCapture); ToolStripMenuItem tsmiFullscreenCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_fullscreen); tsmiFullscreenCapture.Image = Resources.layer_fullscreen; tsmiFullscreenCapture.MouseDown += (sender, e) => form.Close(RegionResult.Fullscreen); tsddbCapture.DropDownItems.Add(tsmiFullscreenCapture); ToolStripMenuItem tsmiActiveMonitorCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_active_monitor); tsmiActiveMonitorCapture.Image = Resources.monitor; tsmiActiveMonitorCapture.MouseDown += (sender, e) => form.Close(RegionResult.ActiveMonitor); tsddbCapture.DropDownItems.Add(tsmiActiveMonitorCapture); ToolStripMenuItem tsmiMonitorCapture = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Capture_monitor); tsmiMonitorCapture.HideImageMargin(); tsmiMonitorCapture.Image = Resources.monitor_window; tsddbCapture.DropDownItems.Add(tsmiMonitorCapture); Screen[] screens = Screen.AllScreens; for (int i = 0; i < screens.Length; i++) { Screen screen = screens[i]; ToolStripMenuItem tsmi = new ToolStripMenuItem(string.Format("{0}. {1}x{2}", i + 1, screen.Bounds.Width, screen.Bounds.Height)); int index = i; tsmi.MouseDown += (sender, e) => { form.MonitorIndex = index; form.Close(RegionResult.Monitor); }; tsmiMonitorCapture.DropDownItems.Add(tsmi); } } #endregion Capture #region Options if (form.Mode != RegionCaptureMode.Editor) { tsMain.Items.Add(new ToolStripSeparator()); ToolStripDropDownButton tsddbOptions = new ToolStripDropDownButton(Resources.ShapeManager_CreateContextMenu_Options); tsddbOptions.DisplayStyle = ToolStripItemDisplayStyle.Image; tsddbOptions.Image = Resources.gear; tsMain.Items.Add(tsddbOptions); tsmiQuickCrop = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Multi_region_mode); tsmiQuickCrop.Checked = !Config.QuickCrop; tsmiQuickCrop.CheckOnClick = true; tsmiQuickCrop.Click += (sender, e) => Config.QuickCrop = !tsmiQuickCrop.Checked; tsddbOptions.DropDownItems.Add(tsmiQuickCrop); ToolStripMenuItem tsmiTips = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_tips); tsmiTips.Checked = Config.ShowHotkeys; tsmiTips.CheckOnClick = true; tsmiTips.Click += (sender, e) => Config.ShowHotkeys = tsmiTips.Checked; tsddbOptions.DropDownItems.Add(tsmiTips); ToolStripMenuItem tsmiShowInfo = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_position_and_size_info); tsmiShowInfo.Checked = Config.ShowInfo; tsmiShowInfo.CheckOnClick = true; tsmiShowInfo.Click += (sender, e) => Config.ShowInfo = tsmiShowInfo.Checked; tsddbOptions.DropDownItems.Add(tsmiShowInfo); ToolStripMenuItem tsmiShowMagnifier = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_magnifier); tsmiShowMagnifier.Checked = Config.ShowMagnifier; tsmiShowMagnifier.CheckOnClick = true; tsmiShowMagnifier.Click += (sender, e) => Config.ShowMagnifier = tsmiShowMagnifier.Checked; tsddbOptions.DropDownItems.Add(tsmiShowMagnifier); ToolStripMenuItem tsmiUseSquareMagnifier = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Square_shape_magnifier); tsmiUseSquareMagnifier.Checked = Config.UseSquareMagnifier; tsmiUseSquareMagnifier.CheckOnClick = true; tsmiUseSquareMagnifier.Click += (sender, e) => Config.UseSquareMagnifier = tsmiUseSquareMagnifier.Checked; tsddbOptions.DropDownItems.Add(tsmiUseSquareMagnifier); ToolStripLabeledNumericUpDown tslnudMagnifierPixelCount = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Magnifier_pixel_count_); tslnudMagnifierPixelCount.Content.Minimum = RegionCaptureOptions.MagnifierPixelCountMinimum; tslnudMagnifierPixelCount.Content.Maximum = RegionCaptureOptions.MagnifierPixelCountMaximum; tslnudMagnifierPixelCount.Content.Increment = 2; tslnudMagnifierPixelCount.Content.Value = Config.MagnifierPixelCount; tslnudMagnifierPixelCount.Content.ValueChanged = (sender, e) => Config.MagnifierPixelCount = (int)tslnudMagnifierPixelCount.Content.Value; tsddbOptions.DropDownItems.Add(tslnudMagnifierPixelCount); ToolStripLabeledNumericUpDown tslnudMagnifierPixelSize = new ToolStripLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Magnifier_pixel_size_); tslnudMagnifierPixelSize.Content.Minimum = RegionCaptureOptions.MagnifierPixelSizeMinimum; tslnudMagnifierPixelSize.Content.Maximum = RegionCaptureOptions.MagnifierPixelSizeMaximum; tslnudMagnifierPixelSize.Content.Value = Config.MagnifierPixelSize; tslnudMagnifierPixelSize.Content.ValueChanged = (sender, e) => Config.MagnifierPixelSize = (int)tslnudMagnifierPixelSize.Content.Value; tsddbOptions.DropDownItems.Add(tslnudMagnifierPixelSize); ToolStripMenuItem tsmiShowCrosshair = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_screen_wide_crosshair); tsmiShowCrosshair.Checked = Config.ShowCrosshair; tsmiShowCrosshair.CheckOnClick = true; tsmiShowCrosshair.Click += (sender, e) => Config.ShowCrosshair = tsmiShowCrosshair.Checked; tsddbOptions.DropDownItems.Add(tsmiShowCrosshair); ToolStripMenuItem tsmiFixedSize = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Fixed_size_region_mode); tsmiFixedSize.Checked = Config.IsFixedSize; tsmiFixedSize.CheckOnClick = true; tsmiFixedSize.Click += (sender, e) => Config.IsFixedSize = tsmiFixedSize.Checked; tsddbOptions.DropDownItems.Add(tsmiFixedSize); ToolStripDoubleLabeledNumericUpDown tslnudFixedSize = new ToolStripDoubleLabeledNumericUpDown(Resources.ShapeManager_CreateContextMenu_Width_, Resources.ShapeManager_CreateContextMenu_Height_); tslnudFixedSize.Content.Minimum = 10; tslnudFixedSize.Content.Maximum = 10000; tslnudFixedSize.Content.Increment = 10; tslnudFixedSize.Content.Value = Config.FixedSize.Width; tslnudFixedSize.Content.Value2 = Config.FixedSize.Height; tslnudFixedSize.Content.ValueChanged = (sender, e) => Config.FixedSize = new Size((int)tslnudFixedSize.Content.Value, (int)tslnudFixedSize.Content.Value2); tsddbOptions.DropDownItems.Add(tslnudFixedSize); ToolStripMenuItem tsmiShowFPS = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_Show_FPS); tsmiShowFPS.Checked = Config.ShowFPS; tsmiShowFPS.CheckOnClick = true; tsmiShowFPS.Click += (sender, e) => Config.ShowFPS = tsmiShowFPS.Checked; tsddbOptions.DropDownItems.Add(tsmiShowFPS); ToolStripMenuItem tsmiRememberMenuState = new ToolStripMenuItem("Remember menu state"); tsmiRememberMenuState.Checked = Config.RememberMenuState; tsmiRememberMenuState.CheckOnClick = true; tsmiRememberMenuState.Click += (sender, e) => Config.RememberMenuState = tsmiRememberMenuState.Checked; tsddbOptions.DropDownItems.Add(tsmiRememberMenuState); } #endregion Options ToolStripLabel tslDragRight = new ToolStripLabel() { Alignment = ToolStripItemAlignment.Right, DisplayStyle = ToolStripItemDisplayStyle.Image, Image = Resources.ui_radio_button_uncheck, Margin = new Padding(0, 0, 2, 0), Padding = new Padding(2) }; tsMain.Items.Add(tslDragRight); tslDragLeft.MouseDown += TslDrag_MouseDown; tslDragRight.MouseDown += TslDrag_MouseDown; tslDragLeft.MouseEnter += TslDrag_MouseEnter; tslDragRight.MouseEnter += TslDrag_MouseEnter; tslDragLeft.MouseLeave += TslDrag_MouseLeave; tslDragRight.MouseLeave += TslDrag_MouseLeave; tsMain.ResumeLayout(false); tsMain.PerformLayout(); menuForm.ResumeLayout(false); menuForm.Show(form); foreach (ToolStripItem tsi in tsMain.Items.OfType <ToolStripItem>()) { if (!string.IsNullOrEmpty(tsi.Text)) { tsi.MouseEnter += (sender, e) => { Point pos = CaptureHelpers.ScreenToClient(menuForm.PointToScreen(tsi.Bounds.Location)); pos.Y += tsi.Height + 8; MenuTextAnimation.Position = pos; MenuTextAnimation.Start(tsi.Text); }; tsi.MouseLeave += TsMain_MouseLeave; } } UpdateMenu(); CurrentShapeTypeChanged += shapeType => UpdateMenu(); CurrentShapeChanged += shape => UpdateMenu(); ConfigureMenuState(); form.Activate(); }
public static Image CaptureWindowTransparent(IntPtr handle) { if (handle.ToInt32() > 0) { Rectangle rect = CaptureHelpers.GetWindowRectangle(handle); if (CaptureShadow && !NativeMethods.IsZoomed(handle) && NativeMethods.IsDWMEnabled()) { rect.Inflate(ShadowOffset, ShadowOffset); rect.Intersect(CaptureHelpers.GetScreenBounds()); } Bitmap whiteBackground = null, blackBackground = null, whiteBackground2 = null; CursorData cursor = null; bool isTransparent = false, isTaskbarHide = false; try { if (AutoHideTaskbar) { isTaskbarHide = NativeMethods.SetTaskbarVisibilityIfIntersect(false, rect); } if (CaptureCursor) { try { cursor = new CursorData(); } catch (Exception e) { DebugHelper.WriteException(e, "Cursor capture failed."); } } using (Form form = new Form()) { form.BackColor = Color.White; form.FormBorderStyle = FormBorderStyle.None; form.ShowInTaskbar = false; form.StartPosition = FormStartPosition.Manual; form.Location = new Point(rect.X, rect.Y); form.Size = new Size(rect.Width, rect.Height); NativeMethods.ShowWindow(form.Handle, (int)WindowShowStyle.ShowNoActivate); if (!NativeMethods.SetWindowPos(form.Handle, handle, 0, 0, 0, 0, SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOACTIVATE)) { form.Close(); DebugHelper.WriteLine("Transparent capture failed. Reason: SetWindowPos fail."); return(CaptureWindow(handle)); } Thread.Sleep(10); Application.DoEvents(); whiteBackground = (Bitmap)CaptureRectangleNative(rect); form.BackColor = Color.Black; Application.DoEvents(); blackBackground = (Bitmap)CaptureRectangleNative(rect); form.BackColor = Color.White; Application.DoEvents(); whiteBackground2 = (Bitmap)CaptureRectangleNative(rect); form.Close(); } Bitmap transparentImage; if (ImageHelpers.IsImagesEqual(whiteBackground, whiteBackground2)) { transparentImage = CreateTransparentImage(whiteBackground, blackBackground); isTransparent = true; } else { DebugHelper.WriteLine("Transparent capture failed. Reason: Images not equal."); transparentImage = whiteBackground2; } if (cursor != null && cursor.IsVisible) { Point cursorOffset = CaptureHelpers.ScreenToClient(rect.Location); cursor.DrawCursorToImage(transparentImage, cursorOffset); } if (isTransparent) { transparentImage = TrimTransparent(transparentImage); if (!CaptureShadow) { TrimShadow(transparentImage); } } return(transparentImage); } finally { if (isTaskbarHide) { NativeMethods.SetTaskbarVisibility(true); } if (whiteBackground != null) { whiteBackground.Dispose(); } if (blackBackground != null) { blackBackground.Dispose(); } if (isTransparent && whiteBackground2 != null) { whiteBackground2.Dispose(); } if (cursor != null) { cursor.Dispose(); } } } return(null); }