잠시

2013-10-14 4 views
0
여기

내 코드입니다 동안 mouseUp 이벤트를 잡아라 :잠시

public partial class Form1 : Form 
{ 
    Graphics g; 
    bool mouseUP = false; 
    double dimensions = 4.0; 
    SolidBrush brush; 

    public Form1() 
    { 
     InitializeComponent(); 
     g = this.CreateGraphics(); 
     brush = new SolidBrush(Color.Black); 
    } 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     mouseUP = false; 
     backgroundWorker1.RunWorkerAsync(e); 
    } 

    private bool mouseIsUP() 
    { 
     return mouseUP; 
    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     mouseUP = true; 
     MessageBox.Show("UP"); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     backgroundWorker1.ReportProgress(0,e.Argument); 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     while (!mouseIsUP()) 
     { 
      g.FillEllipse(brush, ((MouseEventArgs)e.UserState).X - (int)dimensions/2, ((MouseEventArgs)e.UserState).Y - (int)dimensions/2, (int)dimensions, (int)dimensions); 
      dimensions += 0.2; 
      Thread.Sleep(10); 
     } 
    } 
} 

가 왜 이벤트와 mouseUp가 결코 발생하지 ??? 잠시 동안 MessageBox "UP"을 볼 수 있습니다 ...

마우스를 누른 상태에서 더 큰 타원을 만들려고합니다. 마우스 버튼을 놓으면 타원이 더 커지지 않아야합니다.

미리 감사드립니다.

답변

1

이벤트 처리기를 이벤트에 바인딩하지 않기 때문에 (해당 코드를 놓치지 않았다는 가정하에).

예를 들어, Form1에의 생성자 내에서, 당신은 배경 노동자 든 코드에서 이벤트 루프를 차단처럼 보이는

MouseUp += Form1_MouseUp; 
MouseDown += Form1_MouseDown; 
+0

그리고 어떻게 해결할 수 있습니까? – Gasta87

+0

이 코드를 form1 디자이너에 이미 입력했습니다. this.MouseUp + = new System.Windows.Forms.MouseEventHandler (this.Form1_MouseUp); this.MouseDown + = 새 System.Windows.Forms.MouseEventHandler (this.Form1_MouseDown); 그리고 전에 말했듯이, mouseUP 이벤트가 작동하는 동안 제거하면 이벤트가 우선 순위가 아닌 것으로 보입니다. – Gasta87

+0

아, 그 경우에는 분명히 대답이 아닙니다. 나는 당신이 백그라운드 작업자를 사용하는 방법이라고 생각합니다. backgroundWorker1_ProgressChanged를 어떻게 평가하고 있습니까? –

1

을 추가 할 수 있습니다. 근로자에게 DoWork가 어디에서 요청 되었습니까?

더 좋은 해결책은 OnPaint 메서드를 재정의하고 마우스가 아래쪽에 있는지 확인한 다음 원을 그립니다.

bool isMouseDown = false; 
private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    isMouseDown = true; 
} 
private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    isMouseDown = false; 
} 
protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    if (isMouseDown) 
    { 
     g.FillEllipse(brush, ((MouseEventArgs)e.UserState).X - (int)dimensions/2, ((MouseEventArgs)e.UserState).Y - (int)dimensions/2, (int)dimensions, (int)dimensions); 
     dimensions += 0.2; 
     Thread.Sleep(10); 

    } 
} 
+0

worker async를 실행할 때 실행되는 dowork가 호출되었습니다. 그러나 BW는 일하고 있습니다. 당신이 제안하고있는 것을 완전하게 보여줄 수 있습니까? 정말 고마워! – Gasta87