배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   Move 메서드, Control, Image컨트롤
제목:   컨트롤을 드래그하여 이동시키기
     
 

새 페이지 1

  STEP> 따라하기
 

※ 오늘 Daily Tip은 곽승주님이 제공해주신 내용입니다.

Userform Control에는 자주 사용하지 않지만 어쩌다가 필요한 경우에 사용할 수 있는 여러 가지 Property(속성) Method(방법)이 있습니다.

오늘 소개하는 것은 Move 메서드입니다. Move를 이용하여 Userform내에서 Control을 이동하는 방법을 보여드리고자 합니다.

Move메서드를 먼저 알아보기 위해 도움말을 살펴보면 다음과 같습니다.

컨트롤의 경우 그 위치는 Left Top 속성으로 정해집니다. 즉 왼쪽 상단의 모서리의 좌표를 지정하여 그 위치를 결정합니다. 컨트롤의 Move 메서드의 매개변수는 컨트롤의 새로운 위치의 Left Top 값입니다

CommandButton을 클릭하거나 SpinButton을 클릭하여 컨트롤을 옮기는 것보다는 마우스로 드래그하여 옮기는 것이 자연스러울 겁니다. 그래서 필요한 것이 Mouse와 관련한 이벤트 프로시져입니다. 해당 컨트롤에 마우스 포인터를 옮기고 마우스 왼쪽버튼을 누른 채 이를 드래그하여 새로운 위치로 이동한 후 다시 마우스 버튼을 풀어 놓는 동작이 자연스러운 사용입니다

따라서 필요한 이벤트 프로시져와 실행순서는 MouseDown, MouseMove, MouseUp입니다.

이동을 보여줄 적당한 컨트롤을 찾다 보니 Image 컨트롤이 제격인 듯하여 여기에서는 Image컨트롤을 이동하는 예를 보여 드립니다.

다음은 Image컨트롤의 MouseDown이벤트 프로시져입니다. 즉 이미지에 마우스 포인터를 옮기고 마우스 버튼을 클릭할 때 실행되는 프로시져입니다.

Dim Moving      As Boolean
Dim old_X       As Single
Dim old_Y       As Single

Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Moving = True
    old_X = X
    old_Y = Y

End Sub

위의 프로시져에서 Moving은 이동에 대한 정보를 True/False으로 저장하는 모듈수준의 변수입니다. 이것이 True이면 이동을 하겠다는 의사가 되죠. 그리고 클릭할 당시의 마우스 좌표값을 old_X old_Y에 저장합니다. 새로운 좌표 계산을 위해 필요합니다

이제 마우스를 드래그하여 옮기는 과정을 MouseMove 이벤트 프로시져에서 담당합니다. 사실 MouseMove 이벤트 프로시져는 드래그할때 만 발생하는 것은 아닙니다. 해당 컨트롤에서 마우스 포인터가 움직일때 마다 발생합니다. 즉 마우스 버튼을 누르지 않아도 발생하는 겁니다. 이런 성질때문에 Moving을 사용하여 이동여부를 표시하는 겁니다.

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim new_X        As Single
    Dim new_Y        As Single

    If Moving Then
        With Image1
            new_X = .Left + X - old_X
            new_Y = .Top + Y - old_Y
            .Move new_X, new_Y
        End With
    End If

End Sub

새로운 위치는 다음의 식에 의해 계산되고 new_X와  new_Y Move메소드의 매개변수로 전달됩니다.

new_X = .Left + X - old_X,
new_Y = .Top + Y - old_Y

마지막으로 마우스 버튼을 놓음으로써 이동이 완료되므로 Moving Fasle로 변경합니다.

Private Sub Image1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Moving = False

End Sub