블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

05-05 00:45

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 5. 11. 16:17 Programming/COM

이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다. 문제가 될시 삭제가 될 수 있습니다.

작성날짜    : 2011-03-22


복합 컨트롤

여러 개의 컨트롤을 사용하여 사용자 인터페이스를 구성하는 ActiveX 컨트롤

- CComCompositeControl 템플릿 클래스에서 파생

 

class ATL_NO_VTABLE CUpDown :

        . . .

        public CComCompositeControl<CUpDown>,

        . . .

{

 

CComCompositeControl

- CAxDialogImpl 템플릿 클래스로 구현되는 대화상자를 포함하는 CComControl 컨트롤을 구현

대화상자 구현(열거형 변수 IDD)

표준 컨트롤, 윈도우 공통 컨트롤, 커스텀 컨트롤 포함 가능

 

template <class T>

class CComCompositeControl :

        public CComControl< T, CAxDialogImpl< T > >

 

복합 컨트롤 클래스 생성

- ATL COM AppWizard

- DLL

- ATL Object Wizard

- Controls

- Conposite Control or Lite Conposite Control

자동으로 빈 다이얼로그 리소스 생성

 

다이얼로그 사용자 인터페이스 및 코드 구현

사용자 인터페이스 구성

표준 컨트롤, 윈도우 공통 컨트롤, 커스텀 컨트롤, ActiveX 컨트롤 포함 가능

- ActiveX Control 포함시 오른쪽 마우스 클릭을 통해 Insert ActiveX Control 선택

포함된 컨트롤 제어 방법

- API 함수 호출

- CWindow, CDialogImpl, CAxDialogImpl 클래스의 멤버 함수 호출

- SendMessage API 함수 또는 CWindows 정적 함수 호출

이벤트 핸들러

메시지 맵에 메시지 핸들러 추가

- VC++ 6.0 이후, [New Windows Messagte and Event Handlers] 대화 상자를 이용해 이벤트 핸들러 자동 추가 기능 지원

- Workspace윈도우의 ClassView탭에서 사용자 컨트롤 클래스 노드를 오른쪽 마우스 클릭하고 [New Windows Message Handlers] 선택

 

포함된 ActiveX 컨트롤의 이벤트 핸들러 구성

- ActiveX 임포트

#import "D:\EXAMPLE\CIRCLE\DEBUG\CIRCLE.DLL" raw_interfaces_only,

        raw_native_types, no_namespace, named_guids

사용자 컨트롤 클래스의 베이스 클래스에 IDispEventImpl 템플릿 클래스 추가

class ATL_NO_VTABLE CTest :

        . . .

        public IDispEventImpl<IDC_CIRCLECTRL1, CTest>

        . . .

사용자 컨트롤 클래스에 이벤트 싱크 맵

BEGIN_SINK_MAP(CTest)

        //Make sure the Event Handlers have __stdcall calling convention

        SINK_ENTRY(IDC_CIRCLECTRL1, 0x1, OnCircleClickInCirclectrl1)

END_SINK_MAP()

이벤트 핸들러 구현 코드

VOID __stdcall OnCircleClickInCirclectrl1(INT x, INT y)

{

        // TODO : Add Code for event handler.

}

 

IDispEventImpl

- ATL COM 개체에 커넥션 포인트 기능을 제공

대화상자에 포함된 ActiveX 컨트롤에 대해 각각 하나의 IDispEventImpl 클래스 필요

class ATL_NO_VTABLE CTest :

        . . .

        public IDispEventImpl<IDC_CIRCLECTRL1, CTest>

        . . .

IDC_CIRCLECTRL1 // 대화상자에포함된ActiveX 컨트롤의리소스ID

CTest          // 복합컨트롤사용자클래스명

이벤트 싱크 맵

BEGIN_SINK_MAP(CTest)

        SINK_ENTRY(IDC_CIRCLECTRL1, 0x1, OnCircleClickInCirclectrl1)

END_SINK_MAP()

 

IDC_CIRCLECTRL1 // ActiveX 컨트롤의리소스ID

0x1            // 이벤트의DISPID

OnCircleClickInCirclectrl1 // 이벤트핸들러명

복합컨트롤이 완전히 활성화되기 전에 각각의 ActiveX 구성 컨트롤은 이벤트 인터페이스를 요청한다.

이벤트 인터페이스가 발견되면 커넥션이 성립되고 이벤트 인터페이스가 컨트롤에서 이벤트를 처리하는데 사용됨

'Programming > COM' 카테고리의 다른 글

[COM] Form View  (0) 2015.05.11
[COM] ActiveX Control 배포  (0) 2015.05.11
[COM] ATL ActiveX  (0) 2015.05.11
[COM] ActiveX Control(Graph)  (0) 2015.05.11
[COM] ATL / COM  (0) 2015.05.11
posted by Kanais