2010-05-27 4 views
3

나는 자신 만의 즐거움을위한 이미지 편집기를 만들고 있는데, 내가했던 마지막 페인트를 취소하기 위해 실행 취소 단추를 어떻게 만들 수 있을지 궁금해하고 있었습니까? 튜토리얼이나 샘플 코드가 좋을지, 아니면 적어도 올바른 방향으로 나를 가리키고있는 뭔가를 알고 싶습니다.System.Drawing의 실행 취소 버튼?

감사합니다.

+0

은 어떻게 정의 할 '를 마지막으로'페인트? 브러시를 드래그하여 선을 그립니다. 그것은 '하나의'페인트일까요? 이 작업을 수행 할 .NET 클래스를 찾고 있다면 운이 좋지 않을 수 있습니다. –

+0

그것은 하나의 페인트 일 것입니다. 나는 수업을 정말로 찾고 있지 않습니다. – Tanner

답변

3

ㅎ 하드 정말 비에 취소 그것은 들린다. 여기서 각 작업을 목록이나 큐 f.ex에 그려진 객체로 기록해야하는 사용자는 줄을 그리기 때문에 레코드는 시작점의 x, y 및 끝점의 x, y처럼 보일 수 있습니다. 그것 자체는 Draw() 메소드를 가지고 있기 때문에, 실행 취소는 그냥 그 객체를 제거 할 것입니다. 코드에서

같은 것을 볼 수 있었다 :

interface IDrawObject 
{ 
    public void Draw(); 
} 

class Line : IDrawObject 
{ 
    private Point _startP; 
    private Point _endP; 

    public Line(Point startPoint; Poing endPoint) 
    { 
     _startP = startPoint; 
     _endP = endPoint; 
    } 

    public void Draw() 
    { 
     //* call some generic draw processor to perform the action with your given parameters. 
    } 
} 

class Rectangle : IDrawObject 
{ 
    //* your code. 
    public void Draw() 
    { 
     //* call some generic draw processor to perform the action with your given parameters. 
    } 
} 

//* then in your code, you could have something like this. 
List<IDrawObject> myObjectsINeedToDraw = new List<IDrawObject>(); 
myObjectsINeedToDraw.Add(new Line(new Point(0, 0), new Point(10, 10)); 

foreach(IDrawObject objectToDraw in myObjectsINeedToDraw) 
{ 
    //* will draw your object. 
    objectToDraw.Draw(); 
} 

//* in this way you will have unlimited history of your objects, and you will always can remove object from that list. 
1

http://en.wikipedia.org/wiki/Command_pattern

명령 객체가 구현 을 위해 유용하다 : 프로그램에서 모든 사용자 조치가 명령 개체로 구현하는 경우

멀티 레벨 을 취소, 프로그램은 스택을 유지할 수 있습니다 가장 최근에 실행 된 명령입니다. 사용자가 명령을 실행 취소하려는 경우 프로그램은 가장 최근의 명령 개체를 팝하고 해당 실행 취소() 메서드를 실행합니다.

편집 :이 기록은 각각의 "행동"입니다 내가 어떻게 할 것인지이 문제를 해결하려고 한 경우이 유용 할 수 있는지의 관점에서 말하면 사용자는 명령으로 선 등을 그리고 모든 저장 않습니다처럼 도면 컨텍스트에 적용하기 전에 해당 명령 내에서 해당 작업을 완료하는 방법에 대한 정보

그래서 모든 작업이 스택에 푸시되므로 항목을 다시 팝업 할 수 있습니다.

속도를 높이기 위해 일련의 동작에 대한 그리기 개체의 상태를 기록하는 것과 같은 것을 보게 될 것입니다. 그리기의 컨텍스트이므로 알려진 그리기 상태에서 시작하여 명령을 다시 적용하여 현재 버전을 만드는 것이 더 쉬울 것입니다.

예를 들어 실행중인 명령 스택과 실행중인 그리기 개체 스택이 있습니다. 5 개의 명령마다 그리기 객체의 상태를 스택으로 푸시합니다. 그러면 사용자가 실행 취소를 누르면 드로잉 객체의 맨 위 상태를 가져 와서 마지막 명령에 대한 객체 저장에 최신 명령을 적용합니다. 10 개의 액션을 취소하려면 오브젝트 그리기의 2 가지 상태로 돌아가고 새로운 명령을 적용 할 필요가 없습니다.

프로그램에서 수행 할 수있는 실행 취소/다시 실행 상태의 깊이를 제한하려는 경우가 많습니다. 그렇지 않으면 메모리가 무한히 커집니다.

+1

실행 취소에 관한 질문은 매번이 링크가 표시됩니다. 하지만 솔루션의 1/4입니다. 다른 3/4은 응용 프로그램의 ** 상태 **를 추적하고이를 복원하는 방법입니다. (그리고 효율적으로!) – Andrey

+0

@Andrey 작성 소프트웨어는 쉽지 않습니다. 그래서 우리 모두는 직업을 갖게됩니다. 소프트웨어 패턴은 문제를 반복적으로 해결하기 위해 만들어졌으며, 패턴을 구현할 수있는 소프트웨어 개발자의 역할입니다. 특정 비즈니스 요구 사항을 충족해야합니다. 그러나 나는 더 많은 방향을 추가하기 위해 나의 답을 고칠 것이다. –

1

기본 방법 중 하나는 스택을 유지하여 새로운 브러쉬 스트로크를 수행하는 것입니다. (배경 색상으로 다시 그리기에 의해 어쩌면 구입 앱의 특성에 따라 다릅니다?) 당신은 실행 취소 버튼을 켰을 때

, 스택에서 팝과 변화를 반전