2008/12/23

CDialogBar 를 CDialog 처럼 사용하기

이 내용은 다음의 사이트를 참고하여 직접 작업을 해 보면서 작성한 글임.

http://myhome.hanafos.com/~kukdas/doc/mfc/dialogbar.html

http://www.charmzine.com/blog/charmzine/17


1. 리소스에 다이얼로그 추가

다이얼로그 리소스를 추가하고 아이디를 부여한다.

DialogBar로 사용하기 위해 Style 속성을 Child로, Border 속성을 None 으로 변경한다.




2. 클래스 생성

추가된 다이얼로그 리소스를 기반으로 클래스를 생성한다.

이때 Base 클래스가 CDialogBar가 없기 때문에 CDialog 를 상속 받아서 생성한다.




3. 기반(Base) 클래스 변경

생성된 클래스에서 CDialog 를 CDialogBar로 변경한다.

생성자 부분의 기반 클래스 생성자 호출 부분은 주석처리 한다.

    IMPLEMENT_DYNAMIC(CMyBar, CDialogBar)

CMyBar::CMyBar(CWnd* pParent /*=NULL*/)
/*: CDialogBar(CDialogBar::IDD, pParent)*/
{
}

CMyBar::~CMyBar()
{
}

void CMyBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CMyBar, CDialogBar)
END_MESSAGE_MAP()




4. DDX/DDV를 사용하기 위해 메세지 처리 함수 추가하고 WM_INITDIALOG 와 매핑시킨다.

    // Header
afx_msg LRESULT OnInitDialog(WPARAM, LPARAM);

// Source
BEGIN_MESSAGE_MAP(CMyBar, CDialogBar)
:
ON_MESSAGE( WM_INITDIALOG, OnInitDialog)
:
END_MESSAGE_MAP()

LRESULT CMyBar::OnInitDialog(WPARAM wParam, LPARAM lParam)
{
if ( !HandleInitDialog(wParam, lParam) || !UpdateData( FALSE ) )
{
TRACE0("Warning: UpdateData failed during dialog init.\n");
return FALSE;
}

return TRUE;
}




5. 메인 프레임에서 생성하기

생성된 클래스의 헤더파일을 메인프레임에 포함시켜 주고 OnCreate 에 다이얼로그바를 생성한다.

    // Header
#include "MyBar.h"

CMyBar m_wndDialogBar;

// Source
if ( !m_wndDialogBar.Create( this, IDD_MYBAR,
CBRS_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY,
IDD_MYBAR ))
{
TRACE0("Failed to create dialogbar");
return -1;
}




6. 버튼 활성화 시키기

DialogBar에 올려진 버튼은 ON_BN_CLICKED 이벤트를 매핑 시켜 주어도 활성화가 되지 않는다.

ON_UPDATE_COMMAND_UI 이벤트를 매핑 시켜 주어야하는데 이 작업은 수동으로 해야한다.

    // Source
afx_msg void OnUpdateCmdUI(CCmdUI* pCmdUI);

// Header
BEGIN_MESSAGE_MAP(CMyBar, CDialogBar)
ON_UPDATE_COMMAND_UI( IDC_BTN_SEARCH, OnUpdateCmdUI )
END_MESSAGE_MAP()


Original Post : http://neodreamer-dev.tistory.com/228

No comments :

Post a Comment