나는 자신 만의 즐거움을위한 이미지 편집기를 만들고 있는데, 내가했던 마지막 페인트를 취소하기 위해 실행 취소 단추를 어떻게 만들 수 있을지 궁금해하고 있었습니까? 튜토리얼이나 샘플 코드가 좋을지, 아니면 적어도 올바른 방향으로 나를 가리키고있는 뭔가를 알고 싶습니다.System.Drawing의 실행 취소 버튼?
감사합니다.
나는 자신 만의 즐거움을위한 이미지 편집기를 만들고 있는데, 내가했던 마지막 페인트를 취소하기 위해 실행 취소 단추를 어떻게 만들 수 있을지 궁금해하고 있었습니까? 튜토리얼이나 샘플 코드가 좋을지, 아니면 적어도 올바른 방향으로 나를 가리키고있는 뭔가를 알고 싶습니다.System.Drawing의 실행 취소 버튼?
감사합니다.
ㅎ 하드 정말 비에 취소 그것은 들린다. 여기서 각 작업을 목록이나 큐 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.
http://en.wikipedia.org/wiki/Command_pattern
명령 객체가 구현 을 위해 유용하다 : 프로그램에서 모든 사용자 조치가 명령 개체로 구현하는 경우
멀티 레벨 을 취소, 프로그램은 스택을 유지할 수 있습니다 가장 최근에 실행 된 명령입니다. 사용자가 명령을 실행 취소하려는 경우 프로그램은 가장 최근의 명령 개체를 팝하고 해당 실행 취소() 메서드를 실행합니다.
편집 :이 기록은 각각의 "행동"입니다 내가 어떻게 할 것인지이 문제를 해결하려고 한 경우이 유용 할 수 있는지의 관점에서 말하면 사용자는 명령으로 선 등을 그리고 모든 저장 않습니다처럼 도면 컨텍스트에 적용하기 전에 해당 명령 내에서 해당 작업을 완료하는 방법에 대한 정보
그래서 모든 작업이 스택에 푸시되므로 항목을 다시 팝업 할 수 있습니다.
속도를 높이기 위해 일련의 동작에 대한 그리기 개체의 상태를 기록하는 것과 같은 것을 보게 될 것입니다. 그리기의 컨텍스트이므로 알려진 그리기 상태에서 시작하여 명령을 다시 적용하여 현재 버전을 만드는 것이 더 쉬울 것입니다.
예를 들어 실행중인 명령 스택과 실행중인 그리기 개체 스택이 있습니다. 5 개의 명령마다 그리기 객체의 상태를 스택으로 푸시합니다. 그러면 사용자가 실행 취소를 누르면 드로잉 객체의 맨 위 상태를 가져 와서 마지막 명령에 대한 객체 저장에 최신 명령을 적용합니다. 10 개의 액션을 취소하려면 오브젝트 그리기의 2 가지 상태로 돌아가고 새로운 명령을 적용 할 필요가 없습니다.
프로그램에서 수행 할 수있는 실행 취소/다시 실행 상태의 깊이를 제한하려는 경우가 많습니다. 그렇지 않으면 메모리가 무한히 커집니다.
실행 취소에 관한 질문은 매번이 링크가 표시됩니다. 하지만 솔루션의 1/4입니다. 다른 3/4은 응용 프로그램의 ** 상태 **를 추적하고이를 복원하는 방법입니다. (그리고 효율적으로!) – Andrey
@Andrey 작성 소프트웨어는 쉽지 않습니다. 그래서 우리 모두는 직업을 갖게됩니다. 소프트웨어 패턴은 문제를 반복적으로 해결하기 위해 만들어졌으며, 패턴을 구현할 수있는 소프트웨어 개발자의 역할입니다. 특정 비즈니스 요구 사항을 충족해야합니다. 그러나 나는 더 많은 방향을 추가하기 위해 나의 답을 고칠 것이다. –
기본 방법 중 하나는 스택을 유지하여 새로운 브러쉬 스트로크를 수행하는 것입니다. (배경 색상으로 다시 그리기에 의해 어쩌면 구입 앱의 특성에 따라 다릅니다?) 당신은 실행 취소 버튼을 켰을 때
, 스택에서 팝과 변화를 반전
은 어떻게 정의 할 '를 마지막으로'페인트? 브러시를 드래그하여 선을 그립니다. 그것은 '하나의'페인트일까요? 이 작업을 수행 할 .NET 클래스를 찾고 있다면 운이 좋지 않을 수 있습니다. –
그것은 하나의 페인트 일 것입니다. 나는 수업을 정말로 찾고 있지 않습니다. – Tanner