태그 보관물: CDockablePane

CDockablePane에 Dialog 등록

http://cafe.naver.com/ssua/517

CDockablePanel에 Dialog를 등록하여 사용할경우 컨트롤러를 직접 생성하는것보다 편리하다.

처리해야할 부분

기본적으로 CDockablePanel를 상속받아 Panel을 만들고 OnCreate 에서 다이얼로그를 생성하여 등록 하면

되지만 부가적으로 해야할 처리들이 몇가지 존재한다.

1. 페널의 사이즈가 변경될시 다이얼로그의 사이즈도 변경해 줘야 한다.

2. 페널이 포커스되면 다이얼로그에  포커스를 설정해 줘야 한다.

3. 페널위 다이얼로그에서 마우스 오른쪽 클릭시에도 DockablePane Context menu (도킹관련 팝업메뉴)가 떠버려

다이얼로그를 가리게 되며 다이얼로그 위에서 마우스 왼쪽 클릭을 해도 사라지지 않는 문제점이 발생한다

이를 위해 Context Menu를 차단 해줘야 한다.

세부 작업 설명

1. 다이얼로그 생성한후 아래와 같이 셋팅하자.

Dialog.Properties.Border = None

Dialog.Properties.Style = Child

2. 페널 생성.

클래스 위자드->MFC클래스-> Base Class(상속받을 클래스)에 CDockablePane 설정후 페널 생성.

3. 페널에 다이얼로그 등록.

페널에 WM_CREATE 메시지 핸들러 등록.

int DockingPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  Add your specialized creation code here
BOOL bRet = m_Dialog.Create(IDD_TEST_DOCKING, this);
ASSERT( bRet );
m_Dialog.ShowWindow(SW_SHOW);

return 0;
}

4. 사이즈 변화에 대한 다이얼로그 적용.

페널에  WM_SIZE 메시지 핸들러 등록.

void DockingPane::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
m_Dialog.MoveWindow( 0, 0, cx, cy );
 //m_Dialog.SetWindowPos (NULL, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}

5. 페널이 포커스시 다이얼로그포커스 설정.

페널에 WM_SETFOCUS 메시지 핸들러 등록.

void DockingPane::OnSetFocus(CWnd* pOldWnd)
{
CDockablePane::OnSetFocus(pOldWnd);

// TODO: Add your message handler code here
 m_Dialog.SetFocus();
}

6. DockablePane Context menu 차단.

OnShowControlBarMenu 함수를 오버라이딩하여 Base클래스에서의 처리를 막아버린다.

//: h

virtual BOOL OnShowControlBarMenu(CPoint point);

//: cpp

BOOL DockingPane::OnShowControlBarMenu( CPoint point )
{
return FALSE;
}

기타

! vs2010 에서는 다이얼로그 페널(CPaneDialog)을 자체적으로 지원하는 걸로 알고 있다.