雖然添加了放大鏡的功能,但是在進行像素級的定位時,還是不容易精確定位,在用滑鼠操作時要改變一兩個像素的位置還是有些困難的。
處理鍵盤按下事件
/// <summary> /// 處理鍵盤按下事件 /// 用於實現以下功能: /// 當使用者按下Esc鍵時,退出過程; /// Shift + Enter 開始的功能; /// 使用鍵盤的上下左右鍵調整位置的功能; /// Shift + 上下左右鍵調整地區大小的功能; /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { ExitCutImage(true); // 如果不加這一句,熱鍵只能在視窗隱藏後使用一次,之後就不起作用了。 //RegisterHotKey(Handle, 100, 2 | 1, Keys.A); } if (e.Shift && e.KeyCode == Keys.Enter) { if (!this.lbl_CutImage.Visible) { this.isCuting = true; this.beginPoint = MousePosition; this.endPoint = MousePosition; SaveCutImageSize(MousePosition, MousePosition); UpdateCutInfoLabel(UpdateUIMode.ShowInfoBox | UpdateUIMode.ShowCutImage); } } if (e.KeyCode == Keys.Left) { if (this.lbl_CutImage.Visible) { if (e.Shift) { if (this.cutImageRect.Width > 1) { this.cutImageRect.Width -= 1; Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y); UpdateCutInfoLabel(UpdateUIMode.None); } } else { if (this.cutImageRect.Left > -1) { this.cutImageRect.X -= 1; UpdateCutInfoLabel(UpdateUIMode.None); } } } else { if (Cursor.Position.X > -1) { Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y); } } } if (e.KeyCode == Keys.Right) { if (this.lbl_CutImage.Visible) { if (e.Shift) { if (this.cutImageRect.Right < this.Width + 1) { this.cutImageRect.Width += 1; Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y); UpdateCutInfoLabel(UpdateUIMode.None); } } else { if (this.cutImageRect.Right < this.Width + 1) { this.cutImageRect.X += 1; UpdateCutInfoLabel(UpdateUIMode.None); } } } else { if (Cursor.Position.X < this.Width + 1) { Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y); } } } if (e.KeyCode == Keys.Up) { if (this.lbl_CutImage.Visible) { if (e.Shift) { if (this.cutImageRect.Height > 1) { this.cutImageRect.Height -= 1; Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - 1); UpdateCutInfoLabel(UpdateUIMode.None); } } else { if (this.cutImageRect.Top > -1) { this.cutImageRect.Y -= 1; UpdateCutInfoLabel(UpdateUIMode.None); } } } else { if (Cursor.Position.Y > -1) { Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - 1); } } } if (e.KeyCode == Keys.Down) { if (this.lbl_CutImage.Visible) { if (e.Shift) { if (this.cutImageRect.Bottom < this.Height + 1) { this.cutImageRect.Height += 1; Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 1); UpdateCutInfoLabel(UpdateUIMode.None); } } else { if (this.cutImageRect.Bottom < this.Height + 1) { this.cutImageRect.Y += 1; UpdateCutInfoLabel(UpdateUIMode.None); } } } else { if (Cursor.Position.Y < this.Height + 1) { Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 1); } } } }
處理鍵盤抬起事件
/// <summary> /// 處理鍵盤抬起事件 /// Shift + Enter 開始,當鬆開Shitf鍵後, /// 停止地區大小的設定,不然的話滑鼠移動還會改變截取地區的大小; /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.ShiftKey) { if (this.isCuting) { this.isCuting = false; this.pictureBox_zoom.Hide(); this.lastMouseMoveTime = 0; UpdateCutInfoLabel(UpdateUIMode.None); } } }
用鍵盤操作的功能說明:
按下快速鍵(通常是:Ctrl + Shift + A)後,可以移動滑鼠到大概的位置,然後就可以通過鍵盤的上下左右鍵精確移動滑鼠的位置,在精確定位的位置後,就可以按下Shift 鍵再按 Enter鍵,Shift鍵不要鬆開,這時可以按上下左右鍵改變地區的大小,鬆開Shift鍵完成地區大小設定;
這時你可以通過上下左右鍵來改變地區的位置,按下Shift鍵不要鬆開,再按上下左右鍵可以改變地區的大小。