MFC에서 컨트롤처럼 사용할 수 있는 Active X를 만들어보는 연습입니다.
이 글에서는 글자를 출력하는 컨트롤을 만듭니다.
※ 컴파일 과정에서 OCX 파일을 등록하는 과정이 포함되어 있습니다.
그렇기 때문에 Visual Studio를 관리자 권한으로 실행하여야합니다.
프로젝트 생성
프로젝트는 "MFC ActiveX 컨트롤" 프로젝트로 생성합니다.
MFC ActiveX 파일 구조 옅보기
Visual Studio 2019를 사용하여 MFC ActiveX 프로젝트를 생성하면 위와 같이 생성됩니다.
(VS 버전을 표기한 이유는 버전에 따라서 생성하는 파일과 구조가 조금씩 달라집니다.)
xxxxxxxxApp | 최상단 앱 클래스(일반 MFC와 동일 개념) |
xxxxxxxxCtrl | 주 처리 클래스(컨트롤의 주체) |
xxxxxxxxPropPage | 속성창에서 보여줄 페이지 |
xxxxxxxxLib | 함수, 변수, 이벤트 연결 |
컨트롤 배치 및 속성 생성
프로젝트를 처음 생성하게 되면 리소스에 2가지 다이얼로그 페이지가 생성됩니다.
하나는 AboutBox, 다른 하나는 우리가 사용할 기본 설정탭(속성창)입니다.
기본탭을 열어서 글자를 입력해주는 입력박스를 하나 만듭니다.
위와 같이 만들어 줍니다.
그리고 클래스뷰로 가서
생성한 ActiveX 라이브러리를 선택하여
속성을 추가합니다.
속성이름을 원하는 이름으로 정합니다.
(이때 속성이름을 정하게 되면 기본적인 변수 이름이 결정되고(변경 가능) 그에 따른 자동 링크가 되며 알림 함수도 자동으로 생성됩니다.)
이 속성은 우리가 출력할 글자를 의미하기 때문에 문자열을 뜻하는 "BSTR"로 지정합니다.
이렇게 생성된 속성은
Lib에 등록이 됩니다.
또한
Ctrl 클래스에 이벤트 ID와 멤버 변수, 알림함수가 생성되고
Lib에 등록된 속성과 연결(링크)됩니다.
여기서 한 가지 주의점이 있는데
최신버전의 Visual Studio로 프로젝트를 이끌어가면 바로 위의 사진과 같이 인수의 형식이 "VTS_BSTR"로 되어있음을 확인할 수 있습니다.
이 인수의 형식을
위의 사진과 같이 "VT_BSTR"로 변경해주어야 합니다.
이제 이렇게 연결된 문자열 변수를 메모리상에 유지 및 사용할 수 있도록
DoPropExchange 함수에 연결시켜줍니다.
(ActiveX에 문자열을 TextCaption Prop에 저장후 ActiveX를 실행시켰을 때 TexCaption에 저장된 내용을 m_Caption에서 끌어와 사용하게 됩니다.)
속성과 PropPage 변수 연결
위에서 생성한 속성을 PropPage와 연결을 합니다.
연결하는 과정은 MFC에서 컨트롤을 변수와 연결하는 개념과 유사합니다.
PropPage에서 메인 Ctrl의 m_Caption과 연결할 변수(m_strCaption)를 하나 생성합니다.
DoDataExchange 함수에 DDP_Text를 사용하여 연결합니다.
// DDP_Text 사용법
DDP_Text(pDX, 이벤트를_감지할_컨트롤의_ID, 변경값을_저장할_변수, 연결시킬_Ctrl클래스의_속성);
이제 PropPage에 있는 에딧 컨트롤의 "EN_CHANGE" 이벤트를 감지하는 함수를 작성합니다.
(MFC 에딧 컨트롤의 텍스트 변화 이벤트)
이제 에딧 컨트롤의 텍스트가 변경되었을시 m_strCaption에 해당 텍스트가 들어가게 됩니다.
문자열 출력
CaptionChanged 함수에 "InvalidateControl()" 함수를 추가합니다.
(MFC의 Invalidate와 같은 역할을 합니다.)
이제 문자열을 실제로 출력하도록
OnDraw 함수에 텍스트를 출력하도록 DrawText를 넣습니다.
실행 결과
원하는 글자를 입력한 후 적용을 누르면 글자가 반영이 되는 것을 볼 수 있습니다만
ActiveX 이므로 일반적인 디버깅(F5)를 이용해서는 디버깅이 되지 않습니다.
위의 방법을 사용하여 디버깅을 시도합니다.
'Study > MFC' 카테고리의 다른 글
[MFC] Combo Box 컨트롤 (콤보 박스) (0) | 2022.03.05 |
---|---|
[MFC] Button 컨트롤 - 색상 변경 (0) | 2022.02.17 |
[MFC] Button 컨트롤 (버튼 컨트롤) (0) | 2022.02.17 |
[MFC] Tab 컨트롤 (0) | 2022.02.05 |
[MFC, ATL]레지스트리 읽기, 쓰기 (CRegKey) (0) | 2021.07.23 |