간단한 예제를 통해서 activeX컨트롤이 어떻게 작성되고 사용되는지에 관해서 알아보도록 한다. 다음은 shape컨트롤과 textbox를 혼합한 새로운 컨트롤을 작성하는 과정이다. [파일-새 프로젝트]메뉴를 선택한 후, 새 프로젝트 대화상자에서 [activeX 컨트롤]을 선택한다. 그러면, 사용자 컨트롤을 작성할 수 있는 폼을 볼 수 있다. 아래와 같이 shape와 textbox를 사용해서 아래와 같은 activeX컨트롤을 디자인한다. 속성설정
프로젝트명 : MyControl shape1
└ borderStyle : 1 - 단색
└ fillColor : 원하는 특정색
└ fillStyle : 0 - 단색
└ shape : 3 - 원형 text1
└ text : userControl 테스트
└ backColor : 원하는 특정색
└ borderStyle : 0 - 없음 userControl
└ name : shapeLabel
└ backStyle : 0 - 투명 다음은 shapeLabel컨트롤을 테스트하기 위해 [파일-프로젝트 추가]메뉴를 선택한 후, [프로젝트 추가]대화상자에서 표준exe를 열어 현재 프로젝트에 새로운 프로젝트를 추가한다. 추가한 프로젝트 이름은 "testProject"라고 설정한다. 이 상태에서 form1에 shapeLabel컨트롤을 사용할 수는 없다. 사용한다 하더라도 크기가 엉망으로 되기 때문에 userControl의 resize이벤트에 폼에 사용될 크기를 조정하도록 하는 코드가 추가되어야 한다.
즉, userControl의 크기와 text1을 감싸고 있는 shape1의 크기에 따라서 각기 다른 크기가 resizing되어야 한다. '크기의 변화에 반응하는 userControl 이벤트 프로시저
Private Sub UserControl_Resize()
Dim wid As Double '너비를 나타내는 변수
Dim hei As Double '높이를 나타내는 변수
Dim X As Double '텍스트박스 x좌표
Dim Y As Double '텍스트박스 y좌표 'shape의 크기를 userControl의 변화에 꽉차게 한다.
Shape1.Move 0, 0, ScaleWidth, ScaleHeight X = ScaleWidth / 4
Y = ScaleHeight / 4
wid = X * 2
hei = Y * 2 'text의 모서리가 shape에 꽉차게 한다.
'text1.move left, top, width, height의 syntax를 따른다.
Text1.Move X, Y, wid, hei
End Sub 크기조정에 대한 부분이 끝나면 shapeLabel컨트롤에 속성을 추가한다.
이 속성은 public속성을 가지게 될 것이며, textbox의 text속성을 사용하도록 한다. 일단, userControl코드창이 활성화된 상태에서 [도구-프로시저 추가]메뉴를 선택해 프로시저 추가대화상자에서 아래와 같이 입력한다. 속성설정
이름 : text
형식 : property
범위 : public userControl코드창에서는 자동적으로 property get과 property let프로시저가 생성된다. 각 프로시저에 다음 코드를 작성한다. Public Property Get text() As String
text = Text1.text
End Property Public Property Let text(ByVal newText As String)
'newText를 통해서 text1에 새로운 text를 추가할 수 있다.
Text1.text = newText PropertyChanged "text" '속성이 바뀌었다는 것을 컨테이너에 통보
End Property 일반적으로 우리는 표준컨트롤을 폼에 추가시킨 후, 속성창을 사용해 속성을 설정하게 된다. 마찬가지로 우리가 만든 shapeLabel의 속성창을 만들기 위해서는 속성페이지라는 것을 사용해야 한다. 속성페이지를 추가하기 위해 프로젝트 탐색기창에서 shapeLabel을 선택한 후, 마우스 우측클릭을 통해 [추가 - 속성페이지]를 선택한다.

추가된 속성페이지의 이름은 propertyGeneral로 설정하고, caption속성은 general로 변경하도록 한다. 속성페이지는 저장시에 pag확장명을 사용해서 저장이 된다. 디자이너 제목표시줄에 name속성대신 속성페이지의 caption속성을 나타낸다는 것을 제외하고는 속성페이지 디자이너는 컨트롤 디자이너와 비슷하다. 다음으로 propertyGeneral의 속성페이지에 다음 표에 있는 컨트롤과 속성을 이용해 아래와 같이 디자인한다. 속성설정
text1
└ name : txtCaption
label1
└ caption : 글을 넣어 주세요. 속성페이지 디자인을 마쳤다면, 아래와 같은 코딩을 통해서 속성값을 얻을 수 있다. 일단은 하나의 컨트롤만을 선택할 것이다. Private Sub PropertyPage_ApplyChanges() '선택사항 적용시
'선택된 특정컨트롤을 사용하여 개체변수로 사용한다.
Dim objControl As Variant For Each objControl In SelectedControls
objControl.text = txtCaption.text
Next
End Sub Private Sub PropertyPage_SelectionChanged() '컨트롤선택 바뀜시
'현재 선택된 컨트롤의 목록속에 처음 컨트롤의 text를 표시한다.
txtCaption.text = SelectedControls(0).text
End Sub 'txtCaption의 텍스트박스의 속성변화에 따라 반응이 가능하다.
Private Sub txtCaption_Change()
'페이지 속성의 변화유무는 속성페이지 대화상자의 적용단추를 조절하여 변화한다.
Changed = True '텍스트내용이 변화되었을 때, [적용]단추가 사용가능하다.
End Sub 속성페이지를 shapeLabel컨트롤에 연결해야만 위에서 정의한 기능을 사용할 수 있다. 속성페이지 연결 대화상자를 열기 위해 일단, 프로젝트 탐색기창에서 shapeLabel을 두번 눌러서 디자이너를 연 후, 속성창에서 propertyPages속성을 두 번 누르면 속성페이지 연결대화상자를 볼 수 있다. 연결가능한 속성페이지에 "propertyGeneral"을 선택하고 연결을 종료한다. 도구상자에 shapeLabel컨트롤을 보이게 하려면 반드시 사용자 컨트롤 디자인모드를 닫아야 한다. 다음은 form1을 활성화시켜 shapeLabel컨트롤을 추가한다. 폼에 추가된 shapeLabel의 속성창을 보려고 하면, 연결했던 속성페이지가 나타나는 것을 볼 수 있다. 그럼 위의 텍스트상자에 개체의 text가 나와있는 것을 알 수 있다. 간단히 자신이 넣고 싶은 문자를 넣고 [확인]버튼을 누르면 shapeLabel컨트롤의 내용이 바뀌는 것을 볼 수 있을 것이다. 표준컨트롤을 보면 click, mouseUp등과 같은 이벤트를 가지고 있다. 마찬가지로 userControl에도 이벤트를 만들어 사용할 수 있다.
이는 어떤 프로그램에서도 shapeLabel과 같은 컨트롤을 ocx형태로 사용할 수 있으며, click과 같은 이벤트를 통해서 userControl을 실행할 수 있다는 것을 보여준다. userControl 코드창에 다음과 같은 코드를 작성한다. Option Explicit
Public Event aclick() 'aclick이벤트 생성 Private Sub Text1_Click()
RaiseEvent aclick
End Sub 위의 경우, shapeLabel컨트롤에서 textbox를 클릭했을 경우의 이벤트이고, 다음은 주위배경을 클릭했을 경우 생기는 event에 관한 코딩이다. 이를 위해서는 userControl의 mouseUp이벤트를 선택하면 된다. Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'shape컨트롤의 원밖의 부분은 무시, 마우스 포인터가 위치하는 값과 배경색이 같으면 이벤트
If Point(X, Y) = Shape1.FillColor Then
RaiseEvent aclick
End If
End Sub form1의 shapeLabel컨트롤 중 하나를 선택해서 클릭이벤트를 추가한다. 아래와 같은 코드를 간단히 추가함으로 이벤트의 추가가 가능하게 된다. Private Sub shapeLabel1_aclick()
MsgBox "컨트롤을 누르셨어요. " & Chr(10) + Chr(13) & shapeLabel1.Text
End Sub form1을 실행시켜 shapeLabel컨트롤을 클릭하여 테스트한다. 특정폴더로 옮길시, 요소를 못 읽는 경우가 있는데 두 프로젝트를 로드해주면 해결된다. 이로써 userControl에 속성과 method와 event를 모두 추가해 보았다. 이 것을 토대로 [파일-myControl.ocx만들기] 메뉴를 눌러 여러 폼에서 shapeLabel컨트롤을 사용할 수 있다.
by Anna 안나 2008. 12. 5. 23:15