XML Exporter: 대화 상자

기본적인 대화 상자가 포함 되어 있엇지만 사용하지 않았다.
이번 장에서 대화 상자에 버튼을 추가하여 "Export" 버튼을 누르면 익스포트 하도록 해본다.

대화 상자를 추가하기전에 INode 이름을 XML로 저장할 때 버그를 수정하고 넘어가자.
Element Name을 적을 때 띄워쓰기를 할 수 없다는 것을 깜빡해 버렸다.

예를 들면 기존 문제가 있던 XML은 다음과 같다.

<?xml version="1.0" encoding="euc-kr" ?>
<Scene Root>
    <Bip01>
        <Bip01 Footsteps />
    </Bip01>
</Scene Root>

"Scene Root"와 같이 엘리먼트 이름을 띄워쓰기 하면 XML에러가 발생한다.
그래서 엘리먼트 이름은 "Node"로 하고 속성은 "name", 속성 값은 INode의 이름으로 사용하는걸로 수정 하였다.

<?xml version="1.0" encoding="euc-kr" ?>
<Node name="Scene Root">
    <Node name="Bip01">
        <Node name="Bip01 Footsteps" />
    </Node>
</Node>

Export::CollectINode() 바뀐 형식에 맞도록 수정하엿다.

void Export::CollectINode( INode* pNode, XmlNode* pParentXML )

{

    if(!pNode)

        return;

 

    XmlNode* pXmlNode = CreateXmlNode( "Node" );

    pXmlNode->AddAttribute( "name", pNode->GetName() );

    if( m_pXmlRoot == NULL )

        pParentXML = m_pXmlRoot = pXmlNode;

    else

        pParentXML->AttachChild( pXmlNode );

 

    int iChild = pNode->NumberOfChildren();

    for(int i=0; i<iChild; ++i)

    {

        INode* pChild = pNode->GetChildNode(i);

 

        if(pChild)

            CollectINode(pChild, pXmlNode );

    }

}

대화 상자에 버튼을 추가하는건 아주 쉽다. 비쥬얼 스튜디오에서 리소스 에디터를 열어 버튼을 추가하면 된다.

maxProjectOptionsDlgProc에 대화 상자를 만들때, lParam로 Export 객체의 포인터를 넘겨준다.

IDC_EXPORT 버튼을 누르면, Export::SetExport()를 셋팅한후 대화 상자를 닫고 Export 한다.

INT_PTR CALLBACK maxProjectOptionsDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

    static Export *imp = NULL;

 

    WPARAM wlParam = LOWORD(wParam);

    WPARAM whParam = HIWORD(wParam);

 

    switch(message)

    {

    case WM_INITDIALOG:

        imp = (Export *)lParam;

        CenterWindow(hWnd,GetParent(hWnd));

        return TRUE;

 

    case WM_CLOSE:

        EndDialog(hWnd, 0);

        return 1;

    case WM_COMMAND:

        {

            if( imp && IDC_EXPORT == wlParam)       

            {

                imp->SetExport( true );

                SendMessage(hWnd, WM_CLOSE, 0, 0);               

            }

        }

        return 1;

    }

    return 0;

}

ML 포맷으로 노드를 저장해 보자.
TinyXML 라이브러리 이외에 XmlNode.h, XmlNode.cpp, StringUtil.h, StringUtil.cpp를 추가한다.
XmlNode를 이용해서 XML을 저장한다.

소스: maxProject_dlg.zip