2013-09-16 7 views
0

Picturebox 컨트롤 및 트랙볼을 사용하여 이미지 슬라이드 쇼를 수행하려고합니다. 트랙 바는 최소 및 최대 값을 가져 오며 표시 할 이미지 수에 해당합니다. 나는 트랙바 값 변경과 함께 슬라이드를위한 간격 시간을 얻기 위해 타이머를 사용한다.Mousewheel 스크롤 C#에서 winform 이벤트를 프로그래밍 방식으로 수행했습니다.

이제 그림 상자의 각 이미지에 대한 주요 내용은 이미지 위에 사각형 상자를 그립니다.

첫 번째 이미지가 양식에로드 될 때 첫 번째 이미지에서 그릴 수 없습니다. 그러나 마우스 휠을 스크롤하면 할 수 있습니다.

첫 번째 이미지가로드 된 후 마우스 휠 스크롤 이벤트를 트리거하는 데 도움이 필요합니다.

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); 
     } 
    } 
    } 
} 
+0

또 다른 CreateGraphics() 질문입니다. 앱의 창을 최소화하고 복원하면 사용하지 않아야하는 이유를 알 수 있습니다. 대신 pictureBox1의 Paint 이벤트를 구현하십시오. –

답변

0

당신은 (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 이벤트가 없다고 생각했을 것입니까?)