RadialGuage 같은 경우에는 RadialGuageNeedle Class 속성에 AllowDrag 라는 속성이 있어서 사용자가 마우스를 이용해서 변경 할 수 있습니다.

(인프라지스틱스 홈페이지 참조 : http://help.infragistics.com/NetAdvantage/winforms/CLR4.0/?page=WinGauge_Working_with_Linear_Gauges.html)

 

그치만 Linear Gauge의 LinearGaugeNeedle에는 AllowDrag를 제공하지 않아 직접 구현해야합니다.

 

 

 

 

일단 클릭한 지점의 Marker를 저장하기 위한 필드 하나를 작성합니다.

 

 

private LinearGaugeNeedle draggingNeedle; 

 

 

 

ultraGauge 개체의 아래의 이벤트 등록합니다.

 

 

 this.ultraGauge.PrimitiveMouseDown += ultraGauge1_PrimitiveMouseDown;

            this.ultraGauge.MouseMove += ultraGauge1_MouseMove;

            this.ultraGauge.MouseLeave += ultraGauge1_MouseLeave;

            this.ultraGauge.MouseUp += ultraGauge1_MouseUp;

 

 

 

아래와 같이 구현합니다.

MouseDown 되었을때에는 needle 개체를 얻고,

MouseMove될때는 얻은 needle개체가 있다면 Value를 설정합니다.

아래의 예제같은경우 min, max를 지정을해서 Range 밖으로의 이동을 막았습니다.

 

       

        private void ultraGauge1_PrimitiveMouseDown(object sender, GaugePrimitiveMouseEventArgs e)

        {

            LinearGaugeNeedle needle = e.Primitive.Element as LinearGaugeNeedle;

            if (needle != null)

            {

                this.draggingNeedle = needle;

            }

        }

 

        private void ultraGauge1_MouseMove(object sender, MouseEventArgs e)

        {

            if (this.draggingNeedle != null)

            {

               

                Rectangle scaleBounds = this.draggingNeedle.Scale.GetScaleBounds(this.ultraGauge.Bounds);

                double value = (double)this.draggingNeedle.Scale.Axis.MapInverse(e.X, scaleBounds.Left, scaleBounds.Right);

                if (value < min || value > max)

                    return;

                this.draggingNeedle.Value = value;

                System.Diagnostics.Debug.WriteLine(this.draggingNeedle.Value);

            }

        }

        private void ultraGauge1_MouseLeave(object sender, EventArgs e)

        {

            this.draggingNeedle = null;

        }

        private void ultraGauge1_MouseUp(object sender, MouseEventArgs e)

        {

            this.draggingNeedle = null;

        }

 

 

 

 

 

부모 컨테이너에서 MouseUp 되는것도 감지해줘야하기 때문에

해당 컨테이너의 Mouse Up 또는 Mouse Leave 되는 이벤트도 override해줍니다.

 

 

        protected override void OnMouseUp(MouseEventArgs e)

        {

            base.OnMouseUp(e);

            this.draggingNeedle = null;

        }

 

        protected override void OnMouseLeave(EventArgs e)

        {

            base.OnMouseLeave(e);

            this.draggingNeedle = null;

        }

 

 

 

결과 이미지입니다.

 

 

 

 

 

아래 압축파일은 예제 Form Class파일입니다.

 

Gauge 마커 이동 Form 예제.zip

 

 

 

 

+ Recent posts