ATL에서 Composite Control 등을 기반으로 콘트롤을 추가하여 사용하고자 할 때,
아래와 같이 사용하면 MFC 콘트롤을 다루는 것과 같은 방식으로 이용할 수 있다.


:: .h 파일
#include "atlcontrols.h"

using namespace ATLControls;

class ATL_NO_VTABLE CTestControl :
{
    ...
    // 멤버변수 추가
    // using namespace 를 선언하고 사용함에도 ambiguous 오류인해 다시 스코프를 지정
    CContainedWindowT  m_ctrlListFiles;
    CContainedWindowT  m_ctrlBtDelete;
    CContainedWindowT  m_ctrlBtUpload;
    CContainedWindowT  m_ctrlPreview;
    ...
}


:: .cpp 파일
void CTestControl::InitControls()
{
    // 콘트롤 변수에 오브젝트 바인딩
    m_ctrlListFiles.Attach(GetDlgItem(IDC_LIST_FILES));
    m_ctrlBtDelete.Attach(GetDlgItem(IDC_BUTTON_DELETE));
    m_ctrlBtUpload.Attach(GetDlgItem(IDC_BUTTON_UPLOAD));
    m_ctrlPreview.Attach(GetDlgItem(IDC_PREVIEW));
}

atlcontrols.h 는 Visual Studio 2008이 설치된 디렉토리에 샘플소스안에 포함되어 있다.

atlcontrols.zip


// .h 파일
class ATL_NO_VTABLE CTestControl :
...
public IDropTarget // 인터페이스 추가
...
{
    ...
    // 오버라이딩
    STDMETHOD(DragEnter)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    STDMETHOD(DragOver)(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    STDMETHOD(DragLeave)(void);
    STDMETHOD(Drop)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
    ...
}

// .cpp 파일
// 초기화 부분에 추가
::RegisterDragDrop(m_hWnd, (IDropTarget*)this);

// 함수구현
HRESULT CTestControl ::DragEnter(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    return S_OK;
}

HRESULT CTestControl ::DragOver(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    return S_OK;
}

HRESULT CTestControl ::DragLeave(void)
{
    return S_OK;
}

HRESULT CTestControl ::Drop(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  // init MFC

    COleDataObject DataObj;
    HGLOBAL        hGlobal;
    HDROP          hDropInfo;

    DataObj.Attach(pDataObject, FALSE);

    // Data Object 에서 리스트를 읽어온다.
    // HDROP 구조체에 저장되므로, HDROP 핸들을 얻어와 Drag&Drop API를 사용하면 된다.
    hGlobal = DataObj.GetGlobalData (CF_HDROP);
    if ( NULL != hGlobal )
    {
        hDropInfo = (HDROP) GlobalLock (hGlobal);

        UINT uDropCnt = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);    // 드롭된 파일의 갯수
        char buffer[256];  // Drag&Drop된 파일,폴더의 절대경로 저장

        for(UINT i=0; i<uDropCnt; i++)
        {
            // 파일의 경로 얻어옴
            DragQueryFile(hDropInfo, i, buffer, 255);
            // 파일경로 확인
            ::MessageBox(NULL, buffer, _T("Filename"), MB_OK);
        }
        GlobalUnlock (hGlobal);
    }

    DataObj.Detach();
   
    return S_OK;
}

HTML 파일에서 다음과 같이 ActiveX콘트롤로 인수를 넘겨줄때
<OBJECT ..............>
<PARAM NAME="COUNT" VALUE="5">
</OBJECT>

// .h 파일
class ATL_NO_VTABLE CTestControl :
...
public IPersistPropertyBagImpl<CTestControl> // 인터페이스 상속
...
{
    ...
    STDMETHOD(Load)(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog); // 오버라이딩
}

// .cpp 파일
// 함수 구현
STDMETHODIMP CTestControl ::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
{
    CComVariant vtVal ;

    // COUNT 값
    HRESULT hr = pPropBag->Read(L"COUNT", &vtVal, pErrorLog) ;
    if (SUCCEEDED(hr) && VT_BSTR == vtVal.vt)//형검사
    {
        USES_CONVERSION;
        char* pszVal = OLE2A(vtVal.bstrVal);
        put_UploadFileCount(atoi(pszVal)) ;  //Param값 넘기기
    }
    return S_OK ;
}

출처 : 데브피아