Используйте KeyDown внутри события Timer_Tick - PullRequest
0 голосов
/ 15 сентября 2018

Я и мой приятель работали над этим приложением, и мы не можем заставить его работать так, как нам хочется.

То, как мы хотели бы, чтобы это работало:

  1. Открыть приложение.
  2. Переместите мышь в область, которую вы хотите увеличить.
  3. Нажмите Enter.
  4. Увеличительное окно перемещается в (смещение) местоположение мыши и продолжает обновлять это окно для этого конкретного местоположения.
  5. Нажмите Enter еще раз, чтобы переместить окно в новое положение курсора.

Прямо сейчас, когда я нажимаю Enter, окно следует за мышью, потому что оно входит в цикл for, где оно захватывает «Cursor.Position». Я попытался сохранить значение Cursor.Position в событии «OnkeyDown» и использовать его внутри цикла таймера, но это не сработает, поскольку «не существует в текущем контексте».

Может кто-нибудь увидеть, как я могу это сделать?

Заранее спасибо!

/ Morten * * тысячу двадцать-один

/* 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);

        }
    }
}

1 Ответ

0 голосов
/ 16 сентября 2018

Я не совсем уверен, чего вы хотите достичь здесь, однако это поможет вам стать лучше.

Первым делом первым делом.Использование 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;
   }
}

С этим можно сделать гораздо больше, но это поможет вам начать.Больше нет утечки памяти, он только делает снимок экрана с тем, что ему нужно, поэтому будет быстрее.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...