Com개체를 이용한 프로그래밍을 하다보면 Com Control을 이용하게 될 수도 있습니다. 바로 지금 보고 계시는 IE조차도 Com으로 이루어진 Browser Com 입니다. IE라는 것이 뭐 기능적으로 추가를 시켜 실제로 보는 익스플로어가 되는 것이죠. 그래서 웹마 같은 IE기반의 웹 브라우저가 나올 수 있는 까닭이 이 때문입니다.
그런데 Control을 보면 예를 들어서 어떠한 이벤트가 끝났을 때 해당 클라이언트에 링크된 함수를 호출시켜주는 경우가 있죠. 컨트롤이 다 그려졌을 때, 뭐 대충 이런것이라고 할까요? 이 부분을 정리해보기로 했습니다.
일단 ATL 프로젝트를 시작하여 프로젝트를 만든 다음 Control Class 를 추가할 때 Options에서 필수적으로 Connection Points를 체크해야 합니다. 이 것을 해야 이벤트를 구현할 수 있습니다.

Interface, Apperance, Stock Properties같은 부분에서 설정할 부분은 모두 다 설정한 뒤, "Finish" 혹은 "마침" 버튼을 눌러 해당 컨트롤을 생성하는 과정을 마칩니다. 그럼 Class View에 해당 Control에 대한 클래스와 Event에 해당하는 클래스가 생성됩니다. 그럼 이 Event에 해당하는 Interface에 메소드를 추가해야 합니다.

겉으로는 드러나지 않고 TEventLib 안으로 한 레벨 들어가면 _ITestControlEvents 라고 있습니다. 여기서 마우스 오른쪽 버튼을 누른 뒤, Add Method를 선택하여 기존 Com Class에 Method를 추가하듯이 해당 메소를 추가합니다. 다만 여기서 하나 생각해줘야 할 점은 Event 라는 것이 해당 Com Control이 클라이언트에게 호출 하는 것이다보니 [in]파라메터로 넘기는게 좋다는 것이죠. 그럼 일단 파라메터가 없는 빈 AfterDraw이벤트를 추가해보도록 하겠습니다.
그런 다음 CTestControl 에서 마우스 오른쪽 버튼을 눌러 Add Connection Point를 선택합니다. 그 후엔 당연히 _ITestControlEvents를 선택하시면 됩니다. 혹시 CProxy_ITestControlEvents를 더블클릭하여 해당 소스를 봤는데 아무런 차이가 나지 않고 "Fire_메소드명" 이 보이지 않는다면 한 번 빌드를 하신 뒤 다시 해보시기 바랍니다. 만약 제대로 된다면 다음과 같은 소스가 추가됩니다.
이렇게 생성이 된 메소드를 어떻게 호출을 하냐면 일단 목표가 Control이 다 그려지고 난 후에 호출하자고 정했으니 CTestControl 부분의 소스로 건너갑니다. 그 다음 소스를 아래로 주욱 내리시면 OnDraw라는 함수가 보이실 겁니다. 빙고@0@. 드디어 찾았습니다. 그럼 삽입을 해야 겠죠?
단 한 줄 이지만 무지 중요합니다 ㅠㅠ. 이 것을 추가하지 않는다면 제대로 작동하지 않죠~. 추가도 되었으니 이제 소스를 빌드하고 regsvr32 로 등록을 합니다. 그런 다음 C#에서 이제 테스트를 해보는 겁니다. @0@ 컨트롤을 추가하니 AfterDraw 이벤트가 보이는군요!! 당장 추가하고 메시지 박스를 띄워봅니다.

실행을 하면 메시지 박스가 하나 띄워집니다. 그리고 컨트롤을 살짝 가렸다가 다시 보여주니 메시지 박스가 띄워지는 군요^^. 이벤트 방식으로 컨트롤이나 소스를 처리하는 방식도 있는데, 이를 이용하면 아주 유용하게 사용할 수 있을듯 합니다. 한 번 시도해보시는건 어떨까요??
그런데 Control을 보면 예를 들어서 어떠한 이벤트가 끝났을 때 해당 클라이언트에 링크된 함수를 호출시켜주는 경우가 있죠. 컨트롤이 다 그려졌을 때, 뭐 대충 이런것이라고 할까요? 이 부분을 정리해보기로 했습니다.
일단 ATL 프로젝트를 시작하여 프로젝트를 만든 다음 Control Class 를 추가할 때 Options에서 필수적으로 Connection Points를 체크해야 합니다. 이 것을 해야 이벤트를 구현할 수 있습니다.

Interface, Apperance, Stock Properties같은 부분에서 설정할 부분은 모두 다 설정한 뒤, "Finish" 혹은 "마침" 버튼을 눌러 해당 컨트롤을 생성하는 과정을 마칩니다. 그럼 Class View에 해당 Control에 대한 클래스와 Event에 해당하는 클래스가 생성됩니다. 그럼 이 Event에 해당하는 Interface에 메소드를 추가해야 합니다.

겉으로는 드러나지 않고 TEventLib 안으로 한 레벨 들어가면 _ITestControlEvents 라고 있습니다. 여기서 마우스 오른쪽 버튼을 누른 뒤, Add Method를 선택하여 기존 Com Class에 Method를 추가하듯이 해당 메소를 추가합니다. 다만 여기서 하나 생각해줘야 할 점은 Event 라는 것이 해당 Com Control이 클라이언트에게 호출 하는 것이다보니 [in]파라메터로 넘기는게 좋다는 것이죠. 그럼 일단 파라메터가 없는 빈 AfterDraw이벤트를 추가해보도록 하겠습니다.
그런 다음 CTestControl 에서 마우스 오른쪽 버튼을 눌러 Add Connection Point를 선택합니다. 그 후엔 당연히 _ITestControlEvents를 선택하시면 됩니다. 혹시 CProxy_ITestControlEvents를 더블클릭하여 해당 소스를 봤는데 아무런 차이가 나지 않고 "Fire_메소드명" 이 보이지 않는다면 한 번 빌드를 하신 뒤 다시 해보시기 바랍니다. 만약 제대로 된다면 다음과 같은 소스가 추가됩니다.
이렇게 생성이 된 메소드를 어떻게 호출을 하냐면 일단 목표가 Control이 다 그려지고 난 후에 호출하자고 정했으니 CTestControl 부분의 소스로 건너갑니다. 그 다음 소스를 아래로 주욱 내리시면 OnDraw라는 함수가 보이실 겁니다. 빙고@0@. 드디어 찾았습니다. 그럼 삽입을 해야 겠죠?
단 한 줄 이지만 무지 중요합니다 ㅠㅠ. 이 것을 추가하지 않는다면 제대로 작동하지 않죠~. 추가도 되었으니 이제 소스를 빌드하고 regsvr32 로 등록을 합니다. 그런 다음 C#에서 이제 테스트를 해보는 겁니다. @0@ 컨트롤을 추가하니 AfterDraw 이벤트가 보이는군요!! 당장 추가하고 메시지 박스를 띄워봅니다.

실행을 하면 메시지 박스가 하나 띄워집니다. 그리고 컨트롤을 살짝 가렸다가 다시 보여주니 메시지 박스가 띄워지는 군요^^. 이벤트 방식으로 컨트롤이나 소스를 처리하는 방식도 있는데, 이를 이용하면 아주 유용하게 사용할 수 있을듯 합니다. 한 번 시도해보시는건 어떨까요??
"Programming" 분류의 다른 글
| 한게임 자동테트리스 Ver 0.6 (22) | 2008/11/15 |
| 한게임 자동테트리스 Ver 0.2 (22) | 2008/11/03 |
| Read Sector From Floppy (0) | 2008/07/17 |
| 어제 무작정 맹글어봤던 것입니다.. (2) | 2008/07/16 |
| Com 개체를 Retun in Com Programming (2) | 2008/07/08 |
TAG Event


댓글을 달아 주세요