Form running after closed

Asked

Viewed 51 times

2

I have an app with a Form1, where is my pictureBox. I added another Form2 to the project that when executing it it becomes a magnifying lens, thus, you can use on top of the first Form1.

My problem is: after pressing ESC which is the key that gives the Close() in the Form2 (lens), the lens actually disappears, but the application continues consuming memory and processor referring to the Form2 (lens) as if it were only hidden.

The Form2 has an error that generates a Exception when moving the mouse a lot to the corner of the screen when the lens is on. And this error still occurs even with it closed after pressing ESC.

The problem is what I’m calling the Form2?

private void button1_Click(object sender, EventArgs e)
{
   new Form2().Show(); 
}

Or how it’s being closed with Close() ?

Follows the code of Form2 (lens):

PictureBox pictureBox1 = new PictureBox(); // Have a picture box
int zoom = 1; // Variable for zoom value
public Form2()
{
    pictureBox1.Dock = DockStyle.Fill; // Occupy the full area of the form
    pictureBox1.BorderStyle = BorderStyle.FixedSingle; // Have a single border of clear representation
    Controls.Add(pictureBox1); // Add the control to the form
    FormBorderStyle = FormBorderStyle.None; // Make the form borderless to make it as lens look

    Timer timer = new Timer(); // Have a timer for frequent update
    timer.Interval = 100; // Set the interval for the timer
    timer.Tick += timer_Tick; // Hool the event to perform desire action
    timer.Start(); //Start the timer
    printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); // Have a bitmap to store the image of the screen         
}

void timer_Tick(object sender, EventArgs e)
{
    var graphics = Graphics.FromImage(printscreen as Image); // Get the image of the captured screen
    graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); // Get the copy of screen
    var position = Cursor.Position; // Get the position of cursor
    var lensbmp = new Bitmap(50, 50); // Have a bitmap for lens
    var i = 0; // Variable for row count
    var j = 0; // Variable for column count
    for (int row = position.X - 25; row < position.X + 25; row++) // Indicates row number
    {
        j = 0; // Set column value '0' for new column
        for (int column = position.Y - 25; column < position.Y + 25; column++) // Indicate column number
        {
            lensbmp.SetPixel(i, j, printscreen.GetPixel(row, column)); // Place current region pixel to lens bitmap
            j++; // Increase row count
        }
        i++; // Increase column count
    }
    this.pictureBox1.Image = new Bitmap(lensbmp, lensbmp.Width * zoom, lensbmp.Height * zoom); // Assign lens bitmap with zoom level to the picture box
    Size = pictureBox1.Image.Size; // Assign optimal value to the form
    Left = position.X + 20; // Place form nearer to cursor X value
    Top = position.Y + 20; // Place form nearer to cursor Y value
    TopMost = true; // Keep the form top level
}

// Override OnKeyDown for zoom in and zoom out actions
protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyValue == 73) // Set "i" as the key for Zoom In.
        zoom++; // Increase zoom by 1 item greater
    else if (e.KeyValue == 79) // Set "o" as the key for Zoom Out
        zoom--; // Decrease zoom by 1 item smaller
    else if (e.KeyValue == 27) // Set "Esc" to close the magnifier
    {
        Close(); // Close the form
        Dispose(); // Dispose the form
    }
    base.OnKeyDown(e);
}
  • Try using this. Close();

  • I had already tried with this. It doesn’t change anything. Thanks for the tip, buddy.

  • Try to change these if’s to a Switch and instead of putting the entire value of the ASCII table Windows puts Keycode. The by Xenplo to catch the lead ?

  • put in more information of form2, mainly the way he "picks up" the image of Form1 to zoom in

  • I put the code of Form2 in the question.

1 answer

2


It’s probably his own Timer which is still running on some thread.

First declare your Timer as a class variable so that it can be accessed later:

PictureBox pictureBox1 = new PictureBox(); // Have a picture box
int zoom = 1; // Variable for zoom value
Timer timer;  // Have a timer for frequent update

public Form2()
{
    pictureBox1.Dock = DockStyle.Fill; // Occupy the full area of the form
    pictureBox1.BorderStyle = BorderStyle.FixedSingle; // Have a single border of clear representation
    Controls.Add(pictureBox1); // Add the control to the form
    FormBorderStyle = FormBorderStyle.None; // Make the form borderless to make it as lens look

    timer = new Timer() // Cria o timer definido anteriormente
    timer.Interval = 100; // Set the interval for the timer
    timer.Tick += timer_Tick; // Hool the event to perform desire action
    timer.Start(); //Start the timer
    printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); // Have a bitmap to store the image of the screen         
}

When closing the form, stop the Timer (timer) and give a Dispose() in the same:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyValue == 73) // Set "i" as the key for Zoom In.
        zoom++; // Increase zoom by 1 item greater
    else if (e.KeyValue == 79) // Set "o" as the key for Zoom Out
        zoom--; // Decrease zoom by 1 item smaller
    else if (e.KeyValue == 27) // Set "Esc" to close the magnifier
    {
        // Encerra a execução do timer
        timer.Stop();
        timer.Dispose();
        Close(); // Close the form
        Dispose(); // Dispose the form
    }
    base.OnKeyDown(e);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.