ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.