1999.6.25 조경민

Active X 프로그램 짜기
=======================
OCX를 MS에서 새로 부르는 말로 비베의 VBX와는 달리 16비트 32비트코드
로 바뀔수 있고 VBX를 ActiveX로 바꿀수 있다. 이런 모든 객체화된 모델은
MS의 객체 모델 철학인 COM의 일환이다.
전반적으로 Ctrl(컨트롤)과 Properity(속성)와 ODL(라이브러리)로 나뉘는데
ODL과 Ctrl에서 속성과 이벤트를 하고
프로퍼티는 이 컨트롤의 초기화와 사용자 디자인을 위해 있다고볼수있다.
프로퍼티는 속성이고
매서드는 이를 다루는 C++에서의 맴버 함수와 비슷하고
Event는 ActiveX컨테이너와 통신하는 인터페이스를 제공한다.


컨트롤에서 하는일
----------------
ActiveX이벤트 - 외부적인 메세지(마우스클릭)를 처리한다. (VB에서 객체_MoveDown 같은 이벤트)
Automation프로퍼티 - 컨트롤을 위한 맴버자료로 Stock은 내장된 맴버자료 ( VB에서 그냥 프로퍼티 변수)
            Member는 자유 맴버자료로 바뀌면 호출되는 change함수가있다.
            Get/Set Method는 맴버자료를 만들고 이를 억세스메소드와함께
            한다.
Method 메소드 - 컨트롤 내장 함수 ( VB에서 객체. 찍으면 나오는 변수레 프로퍼티가 나오고 함수로
                                    이 메소드가 나오게 된다. )

프로퍼티에서 하는일
-------------------
그래픽툴의 프로퍼티 다이얼로그에 디자인폼을 만들고
프로퍼티를 위한 맴버자료를 만들고 이를 컨트롤의 프로퍼티맴버자료와
연결을하여(DoPropExchange) 컨트롤의 초기화를 해주는 일을 한다.

odl에서 하는일
---------------
컨트롤과 프로퍼티가 각각
BOOL CGMenuButtonCtrl::DoPropExchange(CPropExchange* pPX)
void CTestXPropPage::DoDataExchange(CDataExchange* pDX)
이것에서 서로 속성을 통신하기 위한
pszpropname을 제공한다.
또한 여러 이벤트와 프로퍼티, 메소드를 담고 있다.


컨트롤 속성 주기
----------------
클래스 위자드 실행후 ~Ctrl로 바꾼후 Automation탭에서
Add Property를 실행한후 External Name을 정하고
Member Value로 정한다.
그러면 odl과 Ctrl에 각각 생기게 된다 맴버 자료가
여기서 두가지로 나뉘는데 이 컨트롤 속성이 OnChange핸들링 할것인지
Get/Set Method를 쓸것인지 이다.
이때 OnChange로 하면 odl과 Ctrl에 각각 변수가 생기는데 Data라면
Ctrl::m_data 를 바꾸면 자동으로 odl의 Data 가 변하게 되어 편리하다.

DISP_PROPERTY_NOTIFY(CTestAXCtrl, "Msg", m_Msg, OnMsgChanged, VT_BSTR)

이렇게 Ctrl 의 프로퍼티 디스패치에서 자동으로 변환해 준다.

프로퍼티에서 속성 만들기
------------------------
그래픽툴으로 가서 다이얼로그에다가 알맞게 에디트박스를 만들고
그 박스를 클래스 위자드를 이용하여 프로퍼티 맴버 자료를 만든다.

프로퍼티와 컨트롤 연결하기
--------------------------
프로퍼티의 값이 바뀌면 그에 맞는컨트롤의 속성도 바뀌게 하는곳이
BOOL CGMenuButtonCtrl::DoPropExchange(CPropExchange* pPX)
이부분인데 이부분에서
PX_String(pPX, _T("Caption"), m_btCaption, "GMenuButton");

PX_String(pPX, _T(old에있는 name), Ctrl::m_맴버, 디폴트);

이렇게 해주면 프로퍼티에서 Caption이라고 (m_Caption)된것이
바뀌게 되면 컨트롤의 맴버자료 m_btCaption도 바뀌게 되고
디폴트로 m_btCaption은 GMenuButton이라는 문자열이 된다.
그리고 자동으로 이 맴버자료가 바뀌었다면이라는 함수도 만들어지는데
프로퍼티에서 값이 바뀌면 컨트롤의 맴버자료를 DoPropExchange에서
자동으로 바꾸며 m_btCaption이 바뀌면자동으로
void CGMenuButtonCtrl::OnBtCaptionChanged()
함수가 호출된다.


void CTestXPropPage::DoDataExchange(CDataExchange* pDX)
{
아래 같은 식으로...
DDP_Text(pDX, IDC_CAPTION, m_Caption, _T("SCaption"));<-역시 odl의 값
DDX_Text(pDX, IDC_CAPTION, m_Caption);
}

일이 일어나는 순서
------------------
먼저 프로퍼티를 띄우면
DDP를 통해서 각 맴버값이 odl의 맴버 속성 ID와 통신이 이뤄진다.
DDX를 통해서 각 맴버컨트롤의 값이 맴버자료와 통신이 이뤄진다.

프로퍼티의 적용을 누르면
proppage::DoDataExchange가 실행되어
이 프로퍼티 pDX를 컨트롤의 DoPropExchange가 실행되며
이는 odl의 맴버 속성에 따라 ctrl::의 맴버속성도 바뀌고
이는 DISP_PROPERTY_NOTIFY를 통해서 속성이 변했다는 함수를 통보한다.
( DISP_PROPERTY_NOTIFY를 썼을 경우 )

새로운 프로퍼티 페이지 만들기
-----------------------------
먼저 그래픽툴에서 New Resource를 Dialog중에서 PROPERTY_MEDIUM
아무거나 선택한다. 그리고 style이 child와 none인지 확인하고
타이틀바는 선택되었으면 빼고, more style에서 invisible은 확인된것
을 뺀다. 그리고 이 페이지 다이얼로그를 클래스위자드로 클래스를
만든다. baseclass는 COleProperty로 한다.
그리고 Ctrl.cpp에서
BEGIN_PROPPAGEIDS(CSampleCtrl, 2)  <-- 2개므로 2로 한다.
   PROPPAGEID(CMyPropPage::guid)
   PROPPAGEID(CAddtlPropPage::guid) <-- 애드된 페이지
...
END_PROPPAGEIDS(CSampleCtrl)
이렇게 애드된 페이지를 넣어준다.
그리고 스트링 테이블에 이 페이지 정보를 넣어주어야 한다.
그래픽툴에서 String Table로 가서 두가지 정보를 애드해주어야한다.
아이디는 IDS_MYADDPAGE_PPG 캡션은 마음대로
아이디는 IDS_MYADDPAGE_PPG_CAPTION 캡션은 마음대로
이렇게 두개를 만들고 새로 만든 addppg.cpp안에서
생성자에서는
CPropertyPageMenu::CPropertyPageMenu() :
        COlePropertyPage(IDD, IDS_GMENUBUTTON_PPG2_CAPTION) <--캡션아이디
{
        //{{AFX_DATA_INIT(CPropertyPageMenu)
        // NOTE: ClassWizard will add member initialization here
        //    DO NOT EDIT what you see in these blocks of generated code !
        //}}AFX_DATA_INIT
}

아래 부분에서
BOOL CPropertyPageMenu::CPropertyPageMenuFactory::UpdateRegistry(BOOL bRegister)
{
        // TODO: Define string resource for page type; replace '0' below with ID.

        if (bRegister)
                return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
                        m_clsid,IDS_GMENUBUTTON_PPG2);<-페이지아이디
        else
                return AfxOleUnregisterClass(m_clsid, NULL);
}

해주면 된다.


스톡 프로퍼티 이용하기
----------------------
기본적으로 제공하는 프로퍼티이다.

스톡 프로퍼티 페이지 이용하기
-----------------------------
폰트나 색깔고르기 프로퍼티 페이지를 이용할수 있다.
BEGIN_PROPPAGEIDS( CSampleCtrl, 4 )
    PROPPAGEID( CMyPropPage::guid )
    PROPPAGEID( CLSID_CFontPropPage ) 폰트
    PROPPAGEID( CLSID_CColorPropPage ) 색깔
    PROPPAGEID( CLSID_CPicturePropPage ) 그림
END_PROPPAGEIDS(CSampleCtrl)

이런식으로 하면된다.


Event는
------------------------
아무래도 이벤트는 FireMouseDown

'KB > tutorial' 카테고리의 다른 글

ATL 조금 하기  (0) 2004.03.19
VB With AutoCAD R14  (1) 2004.03.19
[com] ATL COM 쓰기  (0) 2004.03.19
[mfc] Socket 프로그래밍  (4) 2004.03.19
[ActiveX] 디지털서명  (0) 2004.03.19

+ Recent posts