2011-05-05 4 views
0

나는 다소 똑바로 될 것이라고 생각한 것을 달성하려고하지만, 분명히 아닙니다.Mouseup시 값을 반환하려고 시도 C#

달성하고자하는 것은 다음과 같습니다. 사용자가 툴바의 버튼을 누르면 UI의 상태가 변경됩니다. 이제 사용자가 마우스를 클릭 할 때 상태가 변경되었으므로 마우스를 드래그하여 화면에 상자를 만들 수 있습니다. 마우스를 올리면 x, y 좌표를 반환하고 싶습니다. 기본적으로이

protected void MyUI_MouseDown(object inSender , MouseEventArgs inArgs) 
{ 
    switch(myState) 
    { 
    case CreateBox: 
     Rectangle rect = DrawBox(); 
    } 
} 

public Rectangle DrawBox() 
{ 
    myDrawFlag = true; 
} 

private MyUI_MouseMove(object inSender , MouseEventArgs inArgs) 
{ 
    if(myDrawFlag) 
    { 
    DrawBox(inArgs.X , inArgs.Y); 
    } 
} 

같은

그러니까 기본적으로 뭔가, 나는 C. 마우스 아래로 UI의 상태를 변경 가리 키도록 지점 A에서 얻을하는 방법을 잘 모르겠어요 나를 통해 화면에 그릴 수 있습니다 마우스 이동 -하지만 마우스 UP 값을 반환하고 싶습니다.

내가 잘못하고있는 것을 알고 있습니다. 누군가가 내게 무엇을 말할 수 있습니까?

편집 1 : 그렇습니다. DrawBox()에는 아무 것도 없습니다. 기본적으로 내 질문은 어떻게 그 방법은 UNTIL로 돌아 오지 않는가, 나는 마우스 업 이벤트를 얻을 수 있습니까?

편집 2 : 마우스 움직임 이벤트를 추적 중입니다. 마우스가 움직이면 시작 X, Y 및 새 끝점 X, Y를 업데이트합니다. 나는 아직도 내가이 질문을 정확하게하지 않는다고 생각한다.

마우스 업 이벤트가 발생할 때까지 DrawBox()를 반환하지 않으려합니다. Mouse-Down은 UI에 화면에 상자를 그릴 수 있음을 알립니다. (내가 사용하고있는) Mouse-Move는 좌표를 업데이트합니다. 그리고 나서 Mouse-Up은 더 이상 그릴 수없는 UI에 알려야하며 그 다음에는 DrawBox()가 포인트를 반환해야합니다.

+0

DrawBox() 메서드는 Rectangle을 반환하도록 정의되어 있지만 반환되지는 않습니다. 일부 코드가 누락 되었습니까? –

+0

내 질문은 어떻게 그것을 반환 할 수 있습니다. DrawBox 메서드를 입력 할 때 마우스를 드래그 할 때 플래그를 설정하므로 화면에 그릴 수 있습니다. 기본적으로 마우스 업까지 DrawBox를 종료하고 싶지 않습니다. 하지만 어떻게해야할지 모르겠다. ... 그것은 내가 생각하기에 스레딩 문제이다.하지만 나는 몰라. –

+0

이벤트 중심의 시스템에서는 그런 일을하지 않는다. 마우스 다운, 마우스 이동 및 마우스 업 이벤트를 추적하고 각각의 처리를 작고 효율적으로 유지합니다. –

답변

3

mouseUp 이벤트가 발생할 때까지 MouseDown 메서드를 기다리는 방법은 없습니다. 당신은 이벤트 중심으로 생각해야합니다. MouseUp 메서드로 최종 개체를 만들고 저장하는 것이 좋습니다.

protected void MyUI_MouseDown(object inSender, MouseEventArgs inArgs) 
{ 
    switch(myState) 
    { 
     case CreateBox: 
      Rectangle rect = new Rectangle(inArgs.X, inArgs.Y, 0, 0); 
      break; 
    } 
} 

protected void MyUI_MouseUp(object inSender, MouseEventArgs inArgs) 
{ 
    rect.Width = inArgs.X - rect.X; 
    rect.Height = inArgs.Y - rect.Y; 
    // now save/draw your object 
} 
+0

문제는 컨트롤 안에있는 컨트롤입니다. 툴바 아이템이 눌려졌습니다 .... 코드는 사각형이 리턴 될 것으로 예상하여 추가 처리를 할 수 있습니다. 마우스 - 이동은 그것은 기본적으로 BaseControl의 ... 몇 가지 기본적인 GDI가 화면에 그리기하고있다 : DrawBox -> MyControl (이 가지고있는 마우스 다운/마우스 이동/마우스 업) 그래서 그 BaseControl 그 상자가 그려지는 방법에 신경 쓰지 않는다. 그냥 그 사각형을 원한다. –

+2

내부 컨트롤에 StartDrawing 메서드와 이벤트 DrawingFinished를 준다. 바깥 쪽 컨트롤 (도구 모음 포함)은이 이벤트를 등록합니다. 툴 버튼이 클릭되면 이벤트에 대해 등록 된 메소드에서 StartDrawing을 호출하고 도면의 결과를 처리합니다. – Hinek

0

구조체에 점을 저장 한 다음 구조체를 MouseUp 이벤트로 채우고 원하는 위치에 다시 사용할 수 있습니다.

struct coords 
{ 
    int x; 
    int y; 
} 

coords my_coords; 
protected void MyGui_MouseUp(object sender, MouseEventArgs args) 
{ 

    my_coords.x = args.x; 
    my_coords.y = args.y; 
} 

//here you can use my_coords to what you need... 
+0

Mouse-UP에서 poitns를 얻는 것은 문제가되지 않습니다. 어쩌면 나는 올바른 방법으로 질문하지 않을 수도 있습니다. 해당 지점을 가져올 때까지 DrawBox를 반환하지 않으려합니다. –

0

MouseUp 이벤트를 처리해야합니다. 처리중인 MouseMove 이벤트는 마우스가 움직이는 거리의 모든 픽셀 변경을 실행하므로 실제로 DrawBox (int, int) 메서드를 수백 번 호출합니다. 대신 MouseUp 이벤트를 처리하면 마우스 단추를 놓을 때 좌표가 표시됩니다.

정상, 어떤 설명이 필요 아무튼 :

0

는 지금까지 내가 그것을보고, 당신은 3 개 상태를 가지고있다.

디자인 모드, 해당 도구 모음의 버튼을 클릭하면.

DrawingBox, 실제로

지금 다음 전환하려는 상자 그리는 :

일반 -> DesigMode -> OnDrawingBox -> AfterDrawingBox에게.

상태 기계 또는 열거 형을 사용하여 구현할 수 있습니다.

 enum DrawBoxState { Normal, DesignMode, DrawingBox } 

    DrawBoxState _currentState = DrawBoxState.Normal; 
    Point _startPoint; 
    Point _endPoint; 

    void OnToolbarButtonClicked(object sender, EventArgs e) 
    { 
     switch (_currentState) 
     { 
      case DrawBoxState.Normal: 
       _currentState = DrawBoxState.DesignMode; 
       break; 
      default: 
       _currentState = DrawBoxState.Normal; 
       break; 
     } 
    } 

    void OnMouseDown(object sender, MouseEventArgs e) 
    { 
     switch (_currentState) 
     { 
      case DrawBoxState.DesignMode: 
       { 
        _currentState = DrawBoxState.OnDrawingBox; 
        _startPoint = e.Location; // not sure if this is right 
       } 
       break; 
     } 
    } 

    void OnMouseUp(object sender, MouseEventArgs e) 
    { 
     switch (_currentState) 
     { 
      case DrawBoxState.DrawingBox: 
       { 
        _currentState = DrawBoxState.Normal; 
        _endPoint = e.Location; 
       } 
       break; 
     } 
    } 

는 이제 단순히 때마다 이벤트를 해당 이벤트의 상태 변경 및 숙달 변경을 올릴 수 있습니다 : 열거 형으로, 당신의 코드는 다음과 같이 될 것입니다. 예 : 상태가 정상으로 변경되면 startPoint 및 endPoint가 설정되었는지 확인하고 값이있는 항목을 수행하십시오.

관련 문제