-
[MFC] - ActiveX 컨트롤 만들기VC++/MFC 2021. 1. 5. 22:56
MFC ActiveX 컨트롤 만들기
해당 내용은 Visual Studio Professional 2015로 설명 드리겠습니다. 프로젝트 이름은 추 후에 C# ActiveX 컨트롤을 MFC ActiveX 컨트롤에 래핑하는 예제를 위해서 아래와 같이 CSharpActiveXCtrlWrapper라고 짓게 되었습니다.
[ 그림 1 - MFC ActiveX 프로젝트 추가 ] [ 그림 2 - MFC ActiveX 컨트롤 마법사 시작 ] 다음
[ 그림 3 - MFC ActiveX 컨트롤 마법사 응용 프로그램 설정 ] 다음
[ 그림 4 - MFC ActiveX 컨트롤 마법사 컨트롤 이름 ] 마침
[ 그림 5 - MFC ActiveX 컨트롤 마법사 컨트롤 설정 ] 추가 기능에 대한 설명은 아래의 링크를 통해 확인 하시기 바랍니다.
https://msdn.microsoft.com/ko-kr/library/dkzccw76.aspx
컨트롤 설정 탭에서 컨트롤 기준을 (None)으로 하였기 때문에 Internet Explorer 브라우저에서 보이는 컨트롤이 없으므로
CFormView 방식으로 컨트롤을 올려보도록 하겠습니다.
[ 그림 6 - 리소스 추가 ] [ 그림 7 - 리소스 추가/Dialog/IDD_FORMVIEW ] 리소스뷰 창에서 그림6과 같이 리소스 추가(A).... 메뉴를 클릭 후 그림 7과 같이 Dialog/IDD_FORMVIEW 선택 후 새로만들기
[ 그림 8 - CFormView 클래스 추가 ] 그림 8과 같이 추가된 폼 뷰 안에서 마우스 오른쪽 버튼을 눌러 클래스 추가(C) 메뉴를 클릭
[ 그림 9 - MFC 클래스 추가 마법사 시작 ] [ 그림 10 - 추가한 클래스 ] 그림 9와 같이 기본 클래스를 CFormView로 선택 후 클래스 이름을 CMyFormView 지정후 마침 후에 그림 10과 같이 추가한 클래스 생성자/소멸자를 public 영역으로 이동시킵니다.
[ 그림 11 - 클래스 뷰/CMyFormView 선택 ] [ 그림 12 CMyFormView Create, PostNcDestory 함수 재정의 ] 그림 11과 같이 클래스뷰 선택 후 CMyFormView 클래스를 선택 후 그림 12와 같이 속성/재정의 에서
Create, PostNcDestroy 함수를 재정의 합니다.
재정의 후 추가한 PostNcDestory 함수에서 CFormView::PostNcDestroy() 호출 부분을 주석합니다.
다음은 CSharpActiveXCtrlWrapper.h 파일에서 MyFormView.h 파일을 Include 후에
CCSharpActiveXCtrlWrapperCtrl 클래스에서 사용 할 수 있게 CMyFormView 클래스를 멤버 변수로 선언합니다.
[ 그림 13 CCSharpActiveXCtrlWrapperCtrl WM_CREATE 메시지 추가 ] 그림11처럼 이번에는 CCSharpActiveXCtrlWrapperCtrl 클래스 선택후에 그림 13과 같이 WM_CREATE 메시지를 추가합니다. OnCreate 함수를 재정의 하는 이유는 CSharpActiveXCtrlWrapper 클래스에서 OnCreate시 해당 함수를 호출하기 위해서 입니다.
OnDraw 함수에서 그리는 코드를 주석 후 OnCreate 함수에서 CMyFormView 를 추가합니다.
CCSharpActiveXCtrlWrapperCtrl.cpp OnDraw 함수
void CCSharpActiveXCtrlWrapperCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */) { if (!pdc) return; // TODO: 다음 코드를 사용자가 직접 작성한 그리기 코드로 바꾸십시오. // pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); // pdc->Ellipse(rcBounds); }
CCSharpActiveXCtrlWrapperCtrl.cpp OnCreate 함수
int CCSharpActiveXCtrlWrapperCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 여기에 특수화된 작성 코드를 추가합니다. RECT rect; ::GetClientRect(m_hWnd, &rect); if (m_MyFormView.Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect, this, IDD_FORMVIEW)) { OutputDebugString(L"MyFormView Create"); } return 0; }
이로써 간단하게 ActiveX 컨트롤 완성 시켰습니다. 테스트를 해보기 위해서는 Internet Explorer 실행을 통해 확인 해야 합니다. ActiveX 컨트롤을 추가한 Test.html 파일을 만들어야 합니다.
[ 그림 14 CSharpActiveXCtrlWrapper.idl ] Test.html
... <body> <object id="ActiveX" classid="CLSID:C5C3AAE2-4733-487B-8A11-C8925B15B3AE" width="800" height="600"> </body> ...
Test.html 파일에 ActiveX를 추가하였습니다. 중간에 보이는 Object 태그가 ActiveX인데 classid="CLSID:*" 해당 id는 그림 14와 같이 프로젝트명.idl 파일에서 확인 할 수 있습니다.
마지막으로 프로젝트를 빌드하고 ActiveX를 레지스트리에 등록하여 실행을 해보겠습니다. 프로젝트 빌드가 안 될 경우에는 VIsual Studio를 관리자권한으로 다시 실행하여 빌드 하시길 바랍니다.
[ 그림 15 프로젝트 Debug 디렉토리 ] [ 그림 16 CSharpActiveXCtrlWrapper.ocx 레지스트리에 등록 ] 그림 15와 같이 프로젝트 Debug 디렉토리로 이동 후에 그림 16과 같이 명령 프롬프트를 관리자 권한으로 실행 시킨 후에 CSharpActiveXCtrlWrapper.ocx 파일을 레지스트리에 등록합니다.
RegSvr32
- Ocx 파일 레지스트리에 등록 : regsvr32 파일명.ocx
- Ocx 파일 레지스트리에서 등록 해제 : regsvr32 -u 파일명.ocx
[ 그림 17 Internet Explorer 브라우저에 추가된 ActiveX ] GitHub Source
https://github.com/soultomind/Blog/tree/develop/CSharpActiveXCtrlWrapper'VC++ > MFC' 카테고리의 다른 글
[MFC] - 프로그램 안에서 ActiveX 컨트롤 추가하여 사용하기 (0) 2018.04.14