2017-12-07 18 views
2

나는 내가 만든 두 개의 CDialog 클래스가 있습니다. MainDialog 및 ExtraDialog라고 부르 자. ExtraDialog를 doModal과 MainDialog 내에서 중첩 된 대화 상자로 표시 할 수있게하고 싶습니다.다른 CDialog 내에 중첩 된 CDialog를 표시하려면 어떻게해야합니까?

Button과 doModal을 통해 별도로 가져올 수 있습니다. 그러나, 나는 그것을 MainDialog 안에 배치하는 방법에 대해 고심했다.

CWnd* m_pWndStatic = new CWnd; 
m_pWndStatic->Create(_T("Something"), _T("Title"), WS_CHILD | WS_VISIBLE, CRect(x, y, xEnd, yEnd), this, idWnd); 

CExtraDialog* dlg = new CExtraDialog; 
dlg->Create(IDD_NEW_DIALOG, this); //Or second variable can be m_pWndStatic? 
//dlg->SetWindowPos(m_pWndStatic, x, y, xEnd, yEnd, SWP_NOZORDER | SWP_NOACTIVATE); 
//dlg->Invalidate(); 
//dlg->ShowWindow(SW_SHOW); 
//m_pWndStatic->ShowWindow(SW_SHOW); 

위의 그림에서 나는 내가 시도한 몇 가지 문장을 공유했다. 나는 CWnd를 만들고 CWnd 안에 대화 상자를 넣기를 원했지만 나는 뭔가를 놓친 것처럼 느껴졌고 온라인에서 도움이되는 것을 찾을 수 없었습니다.

편집 : 기본적으로 하나의 CDialog에 여러 CWnds를 넣고 CWnd가 다른 클래스의 다른 기능을 실행하려고합니다. 레고 블록끼리 맞추는 것.

편집 2 : 비슷한 질문이 있습니까? 비슷하게 보이기를 바랄 뿐이지 만 버튼을 원하지 않고 한 번에 두 개를 표시하려고합니다. Embedding dialogs in main dialog and switching them with button click in MFC

+0

은 당신의 내면의'CDialog' 스타일 = 아이가? 그리고 Visible = True? – sergiol

+0

나는이 질문에 게시 한 것 외에 다른 것을하지 않았다. 아마 아닐거야? 만약 내가 dlg-> ShowWindow (SW_WHOW)를하면, 내가 원하는 바가 아닌 별도의 창에 그것을 띄웁니다. 미안, 귀하의 질문을 이해할 수 없다면, 나는 MFC에 상당히 새로운이야 –

+0

단추 처리기 대신 OnInitDialog 함수에서 찾은 다른 질문의 코드를 넣으십시오. 필요한 각 임베드 된 대화 상자마다 반복 될 수 있습니다. –

답변

3

MainDialog 내에 배치하는 방법에 대해 고민했습니다.

최소한 WS_POPUP, WS_CAPTIONWS_SYSMENU 스타일을 제거하십시오. WS_CHILD 스타일을 추가하십시오.

포함 된 대화 상자 안팎으로 키보드를 탐색 할 수 있도록 확장 스타일을 WS_EX_CONTROLPARENT 추가하는 것이 좋습니다. 예를 들어

, 부모 대화의 OnInitDialog()에 당신은 추가 할 수 있습니다 : 나는하여 CWnd를 작성하고 혼잡 윈도우의 내부 대화 상자를 넣어 기대했다

// Note: Create member variable CExtraDialog, so there is no need for dynamic allocation! 
m_extraDlg.Create(IDD_NEW_DIALOG, this); 

// Adjust styles. 1st parameter removes, 2nd adds. 
m_extraDlg.ModifyStyle(WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, WS_CHILD); 

// Adjust extended styles. 1st parameter removes, 2nd adds. 
m_extraDlg.ModifyStyleEx(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE, WS_EX_CONTROLPARENT); 

// As we have changed the frame, we let Windows recalculate the non-client area 
// by passing the SWP_FRAMECHANGED flag to SetWindowPos(). 
m_extraDlg.SetWindowPos(nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | 
    SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 

난 항상에 추천 CDialog 파생 된 클래스를 포함 된 대화 상자의 부모로 사용하십시오. 이것은 표준 키보드 탐색과 같은 기능을 위해 Windows 대화 관리자와의 최상의 호환성을 보장합니다. 으로 처리하면됩니다. 더

읽기 :

+0

제 2 편집에서 공유 한 링크와 함께 답을 조합했습니다. 그리고 추가 속성으로 SetWindowPos도 사용했습니다 : 을 클릭하십시오. https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx –

+0

@KemalTezerDilsiz 예, 경계를 제거한 후 Windows가 NC 영역을 다시 계산하도록하는 것이 좋습니다. – zett42