NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (도구상자 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 메뉴를 만들었는데요. 메뉴에서 새 스크립트를 만들고, 스크립트에 마우스 클릭 액션을 추가하는 방법을 알아볼께요. 우선, 도구 상자를 먼저 구성해야 하는데요. 디자인은 기존과 동일하게 만들었습니다. nuget에서 쓸만한 컨트롤이 있을까하고 찾아봤는데... 적당한게 없네요.

     

    도구상자, 함수상자, 외부 API등등... 대부분의 툴박스는 동일한 형태와 기능을 가집니다. 툴박스에 담는 공구만 다를뿐입니다. 그래서, 엔지엠 6에서 각각 만들어서 사용하던 것을 엔지엠 7에서는 통합했습니다. 도구상자나 함수상자에 담겨지는 액션들만 다르기 때문에 이 방법이 더 좋습니다. 아래 그림과 같이 공통으로 사용되는 클라이언트(에디터, 플레이어등등...)를 별도의 모듈로 빼고, 그 안에 공통으로 사용되는 콘트롤들을 모두 만듭니다. 기존에 커뮤니티, 얼티밋, 엔터프라이즈는 컨테이너 역할만 하게 됩니다.

    yYHeBl7.png

     

     

    툴박스의 디자인입니다. 문서 개요를 보면, 상단에 검색창이 있고, 중앙에는 스플리터가 있습니다. 스플리터는 하단의 설명창을 넓히거나 좁힐 때 사용합니다. 도구 상자를 가장 쉽게 사용할 수 있는 트리뷰를 추가했습니다. 일반적으로 이 컨트롤이 직관적인듯 합니다. 물론, 다루기도 쉽고요^^

    lOVtRsc.png

     

     

    도구상자의 트리뷰에 추가된 아이템을 스크립트뷰로 이동하려면 아래와 같은 내용이 필요합니다.

            private void TreeView_ItemDrag(object? sender, ItemDragEventArgs e)
            {
                if (e.Item != null)
                    DoDragDrop(e.Item, DragDropEffects.Move);
            }

     

     

    새 버전의 에디터는 모든 프레임워크에서 new로 생성하기로 했습니다. static을 최대한 배제하여 메모리 효율을 높이기 위함인데요. Ai.Common과 같이 모든 영역에서 공통으로 사용되는 부분만 static, const를 사용합니다. 디자인 규칙을 마지막까지 지켜야 하기 때문에 필연적으로 여러가지 래퍼 클래스가 생길 수 밖에 없습니다. 그리고, 내부에서만 사용되는 코드들은 private, internal, protected로 캡슐화했습니다. 외부에서 접근할 수 있는 Ai.Common에서 래퍼 클래스로 제공됩니다.

     

    샘플용 액션을 하나 만들어서 추가 해볼께요. 모델 프로젝트에서 마우스 클릭 액션을 추가 해줍니다.

    lf5dBS4.png

     

     

    클릭 액션은 추상화된 베이스(BaseModel)를 상속받고, 베이스는 모든 액션들의 조상인 ActionModel을 상속 받습니다. 새롭게 만드는 매크로 프로그램은 엔진에서 모든 동작을 처리하는게 아닌 각각의 액션이 스스로 자신의 동작을 처리하게끔 만들었습니다. 이전에는 각각의 모델 특성에 따라서 매크로 엔진이 분류하고, 동작을 결정했습니다. 그렇다보니 액션을 분류하는 장치와 동작시키는 코드가 복잡해지는 단점이 있었습니다.

     

    위의 단점을 해결하고자 아래 코드와 같이 모든 액션은 추상화된 Execute를 무조건 구현해야 합니다. 이렇게하면 각각의 액션이 동작을 수행하도록 강제할 수 있습니다.

    namespace Ai.Model.Action
    {
        public abstract class ActionModel
        {
            public abstract void Excute();
        }
    }

     

    베이스모델은 네임스페이스를 보면 어떤 액션의 베이스인지 유추할 수 있습니다. 그리고, 마우스 디바이스가 가져야할 추상적인 속성을 하나 가집니다. 이 속성은 마우스 좌표인데요. 마우스 버튼도 추가할까 하다가 휠 액션의 경우 버튼이라기 보다는 굴리는 느낌이라서 각각의 마우스 액션에서 처리하기로 했습니다.

    namespace Ai.Model.Action.Mouse
    {
        public abstract class BaseModel : ActionModel
        {
            [Category("Action")]
            [LocalizedDisplayName("Coordinate")]
            [LocalizedDescription("Coordinate")]
            [Browsable(true)]
            [DefaultValue(typeof(Point), "0, 0")]
            [Editor(typeof(TypeEditor.MouseTrackingEditor), typeof(UITypeEditor))]
            public Point Coordinate { get; set; }
    
            public override void Excute()
            {
    
            }
        }
    }

     

    마지막으로 실제 마우스 클릭 액션입니다. 여기에서는 Execute 메소드를 직접 구현해야 합니다. Ai.Common에서 제공해주는 마우스 동작을 구현했습니다.

    namespace Ai.Model.Action.Mouse
    {
        public class ClickModel : BaseModel
        {
            [Category("Action")]
            [LocalizedDisplayName("MouseButton")]
            [LocalizedDescription("MouseButton")]
            [Browsable(true)]
            [DefaultValue(typeof(Api.MouseButton), "Left")]
            public Api.MouseButton MouseButton { get; set; } = Api.MouseButton.Left;
    
            public override void Excute()
            {
                Ai.Common.Mouse.Click(this.Coordinate, this.MouseButton);
            }
        }
    }

     

    이렇게하면 나중에 디자이너 또는 프레임워크로 마우스 동작을 제정의(override)할 수 있습니다. Execute에 키보드를 추가하거나 이미지 서치 또는 엑셀과 같은 것들을요. 참고로, 커스텀 모듈을 만들 때 베이스 동작을 수행하고, 추가적인 내용을 쉽게 구현할 수 있습니다.

     

    이제 마우스 액션을 도구상자의 트리뷰에 추가 해볼까요? DockType에 따라서 채워야할 액션들을 구분했습니다. 먼저 카테고리를 만들고, 액션을 추가 해줍니다. 여기에 또 유기적으로 글로벌 리소스를 가져와서 사용해야 하는데요. 셋팅하기 전 트리뷰에 리소스를 미리 만들어 두어야 합니다.

            internal void ActionSetting(Definition.DockType type)
            {
                switch (type)
                {
                    case Definition.DockType.Tool:
                        #region Tool Categories
                        _treeView.Nodes.Add(Ai.ToolCategory.Mouse, _resxCaption.GetString(Ai.ToolCategory.Mouse), "mouse", "mouse");
                        #endregion
    
                        _treeView.Nodes[Ai.ToolCategory.Mouse].Nodes
                            .Add(Ai.Mouse.Click, _resxCaption.GetString(Ai.Mouse.Click), "mouse_click", "mouse_click")
                            .Tag = new Ai.Model.Action.Mouse.ClickModel();
                        break;
                    case Definition.DockType.Function:
                        break;
                }
            }

     

    이제 솔루션을 빌드하고, 실행 해보세요. 아래와 같이 도구상자에 마우스 클릭 액션이 추가된걸 확인할 수 있습니다.

    1A0A7DX.png

     

     

    잘 나오는군요. 이제부터 모든 액션 추가는 이 방법을 반복하는겁니다. 어느정도 노가다성 작업이 될거 같아요. 그래도, 복잡하게 코드를 작성하기 보다는 정형화된 룰에 따라서 새로운 기능들을 추가할 수 있다는건 유지보수 측면에서 좋습니다. 모듈별로 분리되어 있고, 위 코드에서만 관리되기 때문입니다. 도구 상자에는 액션을 담는 그릇 역할뿐만 아니라 검색과 각각의 액션 설명을 보여줘야 합니다. 이 부분은 서브 기능들이라 나중에 천천히 구현하기로 하고, 다음에는 스크립트를 추가하는 방법과 실제로 마우스 클릭 액션을 실행해보도록 하겠습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.