ActiveX control

C++ 2010. 11. 4. 13:06
 
 

 

ActiveX control
 
독립된 UI를 갖는 COM 서버의 종류. ex) 달력, 시계, 차트 컨트롤 등..
.ocx 파일 생성.
property, method, event 을 통해 컨테이너(client)에서 ActiveX로 정보 전달.
 
property page 제공(하나의 COM임) (ISpecifyPropertyPages, IPropertyPage, IPropertyPageSize)
MFC class 
COleControlModule : ActiveX의 생성 및 소몇 주관
COleControl : 모든 기능 구현을 위한 클래스. CWnd의 파생 클래스.
OnDraw() : 컨트롤 그리기 기능
DoDropExchange() : property 저장 및 읽기 기능
Ambient___() : ambient property를 얻음. (컨테이너(client)의 속성 획득)
Fire______() : stock event 발생 시킴.
Get_______() : stock proeprty 획득.
Refresh : stock method Refrech
DoClick : stock method DoClick
InvalidateControl() : 컨트롤 redraw
SetModifiedFlag() : property 변화를 알림.
COlePropertyPage : property page를 위해 IPropertyPage를 구현한 클래스
 
stock property : 기 정의된 속성들
Appearance : TRUE(3D 표현), FALSE(flat 표현)
BackColor : 컨트롤 배경색
BorderStyle : 경계선 스타일
Caption : 컨트롤 타이틀
Enabled : TRUE(활성화), FALSE(비활성화)
Font : 사용할 폰트
ForeColor : 전경색
hWnd : 윈도우 핸들
ReadyState : 0(초기화 전), 1(데이터 로딩 중), 2(데이터 로딩 완료), 3(비활성화), 4(준비완료)
Text : 컨트롤의 텍스트
 
stock method : 기 정의된 메소드
Refresh : 컨트롤 redraw
DoClick : 마우스 왼쪽 버튼 눌린 것으로 동작
 
stock event : 기 정의된 이벤트
Click : 마우스 클릭시
DblClick : 마우스 더블 클릭시
KeyDown : WM_KEYDOWN or WM_SYSKEYDOWN 발생시
KeyPress : WM_CHAR 발생시
MouseDown : 마우스 버튼 누를때
MouseMove : 마우스 움질일때
MouseUp : 마우스 버튼 올라갈때
Error : 에러 발생시
 
ambient property : 컨테이너(clinet)가 ActiveX 컨트롤에게 제공하는 속성
BackColor : 컨테이너 배경색
DisplayName : 에러 메세지 내용
Font : 컨테이너 폰트
ForeColor : 컨테이너 전경색
ScaleUnit : 컨테이너 좌표단위
TextAlgn : 0(글자 왼쪽, 숫자 오른쪽), 1(왼쪽), 2(중앙), 3(오른쪽), 4(양쪽) 정렬
 
 
 
ActivcX 컨트롤 작성
 
1. MFC ActiveX Control 프로젝트 생성
ex) 프로젝트명 : Test
(Control Settings에서 BUTTON, EDIT 등 서브 클래싱 사용 가능)
COleControlModule, COleControl, COlePropertyPage 를 상속한 3개의 클래스 자동 생성됨.
DllRegisterServer(), DllUnregisterServer() 자동 생성됨.
 
2. property, method, event 추가 후 기능 작성
stock property 추가
"Class View > TestLib > _DTest > 오른쪽 마우스 > Add > Add Property..."
Implementation type 에서 stock 선택 가능
ex)
Property type : OLE_COLOR
Property name : BackColor
Implementation type : stock

ex) html에서 param으로 값 전달
<object id=testActivex width=300 height=300	classid=CLSID:D6F5AA31-5CD7-459D-934B-1357675FCE28>
	<param name = "BackColor" VALUE = "11111" />
</object>​

 
사용자 property 추가
"Class View > TestLib > _DTest > 오른쪽 마우스 > Add > Add Property..."
ex) html
<object id=testActivex width=300 height=300	classid=CLSID:D6F5AA31-5CD7-459D-934B-1357675FCE28>
	<param name="BackColor" VALUE="2222" />
</object>

<script language="javascript">
function test()
{
	testActivex.testLong = 3;	//사용자 추가된 property의 값 변경.
}
</script>
<a href="javascript:test()"> test</a>
 
stock method 추가
"Class View > TestLib > _DTest > 오른쪽 마우스 > Add > Add Method.."
"Method name"에서 stock method 선택 및 "Select method type"에서 Stock 확인.
DoClick, Refresh 만 존재함.
 
사용자 mehtod 추가
"Class View > TestLib > _DTest > 오른쪽 마우스 > Add > Add Method.."
Test.idl, TEstCtrl.h, TestCtrl.cpp에 해당 메소드가 추가됨
ex) javascript 호출
 <object id=testActivex width=300 height=300 classid=CLSID:XXXXXXX...>
 </object>
 <script language="javascript">
 testActivex.추가한메소드명();
 </script>   ​

 
stock event 추가
"Class View > CTest2Ctrl > 오른쪽 마우스 > Add > Add Event.."
"Event name" 에서 이벤트 선택
"Event type" Stock 확인/
ex) Click이나 MouseDown 이벤트 등을 추가하면 
CTestCtrl에서 WM_LBUTTONDOWN, WM_RBUTTONDOWN 등을 넣어
사용자의 마우스 조작을 제어할 수 있다.
 
사용자 event 추가
"Class View > CTest2Ctrl > 오른쪽 마우스 > Add > Add Event.."
"Event name" 에서 이벤트 명 입력 ex)TestEvent
.idl과 TestCtrl.h에 TestEvent() 함수 추가됨.
코드에서 TestEvent() 를 호출하면 컨테이너(client)로 이벤트 전달 가능.
ex) javascript 에서의 예
	<object id=testActivex width=300 height=300
		classid=CLSID:XXXXXXX...>
	</object>		
	<script language="javascript">
	function func()
	{
		alert("activex event 발생");  
	}
	</script>
	<script language="javascript"  event="TestEvent()" for="testActivex">
	     func()	//ActiveX에서 TestEvent() 호출시(이벤트 발생시) 실행됨.
	</script> 

 

 
3. 컴파일 및 regsvr32 로 ocx 파일 등록.
 
4. 테스트
Visual Studio 2008엔 ActiveX Control Test Container가 없는데
아래 주소를 보면 샘플에서 직접 컴파일 하여 사용하라고 함.
http://blogs.msdn.com/b/vcblog/archive/2010/03/18/activex-test-container-application-is-still-available.aspx
(잘 안되서 그냥 explorer에서 javascript로 테스트함)
 
 
 
ActiveX 컨트롤 컨테이너(client) 작성.
 
1. MFC application 프로젝트 생성
"Advanced Features" 에서 ActiveX controls 체크 확인.
 
2. "대화상자 > 오른쪽 마우스 메뉴 > Insert ActiveX Control..." 선택
ActiveX Control 리스트에서 작성한 컨트롤 선택 후 properties 창에서 기본값 설정
 "Add Variable.." 로 변수 생성. ex) m_ctrl
 
3. m_ctrl 사용
m_ctrl은
property : Set___(), Get___()로 조작 가능.
method : 멤버 메소드로 바로 호출 가능.
event : "Class View"에서 해당 클래스 선택 후 "properties" 창에서 이벤트 함수 생성시켜 사용.
 (ActiveX 컨트롤에서 이벤트 발생시 받음)