2009-12-11 4 views
1

CPaneDialog에 문제가 있습니다. SetPaneSize MFC 기능 팩 샘플 프로젝트를 테스트했습니다. 이상한 것은 CDockablePane이있을 수 있지만 CPaneDialog를 MainFrm에 도킹 할 수 없다는 것입니다. CPaneDialog 또한 CDockablePane의 자식 클래스이지만 할 수는 없습니다. DockToWindow (& other_CPaneDialog_instance ...) 만 가능합니다. DockToPane()을 호출하면 CPaneDialog의 내용이 올바르게 그려지거나 새로 고쳐지지 않습니다.CPaneDialog를 MainFrm에 도킹하는 방법 ..?

어떻게 CPaneDialog를 MainFrm 창에 도킹 할 수 있습니까?

또 다른 문제는 그림에 관한 것입니다. SetPaneSize 샘플에서 트리 컨트롤에 대한 코드를 제거하면 view1 (CDockablePane의 인스턴스)의 내용이 제대로 다시 그려지지 않습니다. 몇 가지 실험을 한 후에 OnSize 및 OnPaint 메서드에서 수행해야 할 작업을 결정했습니다. (OnSize가 더 중요합니다.) 예상되는 동작입니까?

답변

0

HexEdit를 MFC9로 변환 (http://www.hexedit.com 참조)이 문제가 발생했습니다. VS2010 (MFC10)에서 테스트했는데이 버그가 수정 된 것으로 보입니다.

CDockablePane (있는 경우)에 도킹하려면 CMainFrame :: OnCreate에서 DockToWindow를 사용할 수 있으므로이 문제는 중요하지 않습니다. 사용자는 창을 부양하거나 다른 곳에 도킹 할 수 있으며 프로그램을 다시 열면 위치가 기억되고 복원됩니다.

저는 MFC9에서이 버그에 대해 새로운 사람이되었습니다. 따라서 SetPaneSize 데모 (DockPane이 아닌 다른 모든 도킹 가능한 윈도우에 대해 CDockablePane :: DockToWindow 호출)의 확실한 해결 방법이 있습니다. 그러나 적어도 MFC10에서는 수정되었습니다.

내가 발견 한 또 다른 버그는 CPaneDialog가 닫히면 (숨김), 응용 프로그램을 다시 시작할 때 올바른 (숨겨진) 상태로 복원되지 않고 창이 다시 열립니다. 창을 닫을 때 도킹 된 경우에는 발생하지 않습니다. 이것은 MFC10에서도 수정되었습니다.

+0

추가 정보를 제공해 주셔서 감사합니다. –

2

이전 MFC 응용 프로그램을 변환하는 동안 필자는 기능 팩에서 비슷한 문제가 발생했습니다. 제대로 해결할 시간이 없었지만 다음 해결 방법을 사용했습니다.

  1. 대화 상자 리소스를 CDialogBar 클래스에 넣습니다.
  2. 이제 패널의 OnCreate- 메서드에서 CDockablePane
  3. 에서 클래스를 파생시키고 대화 상자를 만듭니다.

2 가지 더 :

void CInputPane::OnSize(UINT nType, int cx, int cy) 
{ 
    CDockablePane::OnSize(nType, cx, cy); 
    m_pInputBar->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE | SWP_NOZORDER); 
} 

BOOL CInputPane::OnBeforeFloat(CRect& /*rectFloat*/,AFX_DOCK_METHOD /*dockMethod*/) 
{ 
    return FALSE; 
} 

이 적절한 대화 상자의 크기와 주위의 줄을 드래그에서 사용자를 방지를 보장합니다.

HTH, 나를 위해 일했습니다.

+0

감사합니다. 사실 다른 곳에서도 유사한 솔루션을 보았지만 CPaneDialog는 이러한 목적을위한 것이 아닙니다. 또한 다른 CDockablePane 파생물과 달리 CPaneDialog는 DockPane()을 사용하여 도킹 할 수 없다는 점에서 이상하게 작동합니다. –