Событие прокрутки колесика мыши в С# winform программно выполнено

Я пытаюсь сделать слайд-шоу изображений с помощью PictureBox Control и трекбара. Трекбар получает минимальное, а максимальное значение соответствует количеству отображаемых изображений. Я использую таймер, чтобы получить период интервала для слайда вместе с изменением значения трекбара.

Теперь, вот главное для каждого изображения в окне изображения. Я рисую прямоугольную рамку поверх изображения.

Я не могу рисовать на первом изображении, когда форма загружается с первым изображением. Но я мог бы сделать, если бы я прокрутил колесико мыши.

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace test
{

  public partial class Form1 : Form
  {
    public event MouseEventHandler MouseWheel;

    //MouseEventArgs k = new MouseEventArgs(MouseButtons.Middle,0,0,-1);

    string[] pics = { "C:\\Downloads\\folder_picture_green.png", "C:\\Downloads\\Aetherpal.ico", "C:\\Downloads\\folder_picture_green.png" };

    public Form1()
    {
        InitializeComponent();
        this.trackBar1.Minimum = 0;
        this.trackBar1.Maximum = (pics.Count() - 1);
        //this.trackBar1.Maximum = 0;

        imageupdate(0);

        timer1.Start();
        timer1.Interval = 3000;
        this.MouseWheel += test;
        this.MouseWheel(null, null);
    }

    private void test(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        MessageBox.Show("Scrolled");
    }

    private void check(object sender, System.EventArgs e) 
    {
        //if (Initializing == false) { return; }
        if(this.trackBar1.Value < this.trackBar1.Maximum )
        this.trackBar1.Value += 1;
        else
            timer1.Stop();
    }

    private void Valuechange(object sender, System.EventArgs e)
    {
        imageupdate(this.trackBar1.Value);
        if(this.trackBar1.Value < this.trackBar1.Maximum)
            timer1.Start();
    }     

    private void imageupdate(int k)
    {
        this.pictureBox1.Refresh();
        this.pictureBox1.Image = new Bitmap(pics[k]);
        Pen blackPen = new Pen(Color.Blue, 5);
        this.pictureBox1.Refresh();
        using (Graphics g = this.pictureBox1.CreateGraphics())
        {
            g.DrawRectangle(blackPen, 10, 10, 100, 50);
        }
    }
  }
}

person Sun_Sparxz    schedule 16.09.2013    source источник
comment
Еще один вопрос CreateGraphics(). Сверните и восстановите окно вашего приложения, чтобы понять, почему вы не должны его использовать. Вместо этого реализуйте событие Paint для pictureBox1.   -  person Hans Passant    schedule 16.09.2013


Ответы (1)


Вы можете добавить этот код в свою форму для прокрутки формы (конечно, с помощью MouseWheel):

private void Wheel(int ticks, bool down){
  //WM_MOUSEWHEEL = 0x20a
  Message msg = Message.Create(Handle, 0x20a, new IntPtr((down ? -1 : 1)<<16), new IntPtr(MousePosition.X + MousePosition.Y << 16));
  for(int i = 0; i < ticks; i++)
      WndProc(ref msg);
}
//Use it
Wheel(120,true);//Wheel down
Wheel(120,false);//Wheel up

ПРИМЕЧАНИЕ. Насколько я вижу, вы определяете событие MouseWheel в собственной форме. Это скроет базовое событие MouseWheel, я не думаю, что у вас есть какие-либо причины для этого, ваше собственное MouseWheel не может работать как базовое, вы должны поймать win32 message и поднять его самостоятельно , вместо этого мы должны использовать базовое событие MouseWheel. (Может быть, вы думали, что в вашем классе формы нет никакого события MouseWheel?)

person King King    schedule 16.09.2013