簡體   English   中英

在Timer_Tick事件中使用KeyDown

[英]Use a KeyDown inside a Timer_Tick Event

我和我的好友一直在開發此放大鏡應用程序,但我們無法使其按預期的方式工作。

我們希望它的工作方式:

  1. 開啟應用程式。
  2. 將鼠標移到要放大的區域。
  3. 按回車。
  4. 放大窗口移至鼠標的(偏移)位置,並針對該特定位置不斷更新該窗口。
  5. 再次按Enter鍵,將窗口移至新的光標位置。

現在,一旦我按下Enter鍵,該窗口就會跟隨鼠標,因為它進入for循環,並在其中捕獲“ Cursor.Position”。 我試圖將Cursor.Position值保存在“ OnkeyDown”事件中,並在計時器循環內使用它,但是由於“在當前上下文中不存在”而無法使用。

誰能看到我該怎么做?

提前致謝!

/莫滕

/* O-button zooms out
 * I-button zooms in
 * Esc-button exits app
 * Enter moves magnifying window to new location (doesn't work)
*/
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Magnifier
{
    public partial class Form1 : Form
    {
        Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
        PictureBox pictureBox1 = new PictureBox();
        int zoom = 3; //zoom level
        public bool NewZoomLocation = false;
        public Form1()
        {


                {
                    InitializeComponent();
                    pictureBox1.Dock = DockStyle.Fill;
                    pictureBox1.BorderStyle = BorderStyle.FixedSingle;
                    Controls.Add(pictureBox1);
                    FormBorderStyle = FormBorderStyle.None;

                    Timer timer = new Timer();
                    timer.Interval = 100;
                    timer.Tick += timer_Tick;
                    timer.Start();
                }
           void timer_Tick(object sender, EventArgs e)
        {     var position = Cursor.Position;
              int xlocation = position.X;
              int ylocation = position.Y;
                {
                    try
                    {
                        var graphics = Graphics.FromImage(printscreen as Image);
                        graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
                        GC.Collect(); // Force the garbage collector (deals with memory leak)

                        if (NewZoomLocation == true)
                        {
                            var lensbmp = new Bitmap(50, 50); //Bitmap for Zoom window
                            var i = 0;
                            var j = 0;
                            for (int row = xlocation - 25; row < xlocation + 25; row++)
                            {
                                j = 0;
                                for (int column = ylocation - 25; column < ylocation + 25; column++)
                                {
                                    lensbmp.SetPixel(i, j, printscreen.GetPixel(row, column));

                                    j++;
                                }
                                i++;
                            }
                            this.pictureBox1.Image = new Bitmap(lensbmp, lensbmp.Width * zoom, lensbmp.Height * zoom);
                            Size = pictureBox1.Image.Size;
                            Left = xlocation - 45 * (zoom); //Horisontal position of final zoom window
                            Top = ylocation + 30; //Vertical position of final zoom window
                            TopMost = true;
                        }
                    }
                    catch //(Exception ex)
                    {
                        //MessageBox.Show(ex.Message);
                    }
                }
           }
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.KeyValue == 73) // I-button to zoom in
                zoom++;
            else if (e.KeyValue == 79) // O-button to zoom in
                zoom--;
            else if (e.KeyValue == 27) // Esc-button to exit
            {
                Close();
                Dispose();
            }
            else if (e.KeyValue == 13) // Enter-button to choose zoon area
            {
                NewZoomLocation = true;
            }
            base.OnKeyDown(e);

        }
    }
}

我不太確定您要在這里實現什么,但這應該可以使您處於更好的位置。

首先是第一件事。 之所以使用GC.Collect是因為您試圖堵塞內存泄漏,如果您創建了映像,請對其進行處理。

給定一些全局變量

private readonly PictureBox pictureBox1 = new PictureBox();

private Bitmap _lastBmp = new Bitmap(300, 300);

private Point _position;

public bool NewZoomLocation;

private int zoom = 3; //zoom level

構造函數

public Form1()
{
   InitializeComponent();
   pictureBox1.Dock = DockStyle.Fill;
   pictureBox1.BorderStyle = BorderStyle.FixedSingle;
   Controls.Add(pictureBox1);
   FormBorderStyle = FormBorderStyle.None;
   KeyPreview = true;
   Size = _lastBmp.Size;
   TopMost = true;
   var timer = new Timer();
   timer.Interval = 100;
   timer.Tick += timer_Tick;
   timer.Start();
}

清理

protected override void OnClosed(EventArgs e)
{
   base.OnClosed(e);

   _lastBmp.Dispose();
   _lastBmp = null;
}

KEYDOWN

protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
{
   base.OnPreviewKeyDown(e);
   switch (e.KeyCode)
   {
      case Keys.Enter:
         NewZoomLocation = true;
         _position = Cursor.Position;

         break;
      case Keys.Up:
         zoom++;
         break;
      case Keys.Down:
         zoom--;
         break;
      case Keys.Escape:
         Close();
         break;
   }
}

計時器

private void timer_Tick(object sender, EventArgs e)
{
   if (NewZoomLocation)
   {
      var w = _lastBmp.Size.Width / zoom;
      var h = _lastBmp.Size.Height / zoom;
      var x = _position.X - w / 2;
      var y = _position.Y - h / 2;
      var size = new Size(w, h);    
      using (var screen = new Bitmap(size.Width, size.Height))
      {
         using (var g = Graphics.FromImage(screen))
         {
            g.CopyFromScreen(new Point(x, y), Point.Empty, size);
         }
         // resize
         using (var g = Graphics.FromImage(_lastBmp))
         {
            g.DrawImage(screen, new Rectangle(new Point(), _lastBmp.Size), new Rectangle(0, 0, w, h), GraphicsUnit.Pixel);
         }
      }

      pictureBox1.Image = _lastBmp;
   }
}

可以做很多事情,但是它應該可以幫助您入門。 不再存在內存泄漏,它僅捕獲所需內容的屏幕快照,因此速度更快。

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM