Login Sign Up
꿈을꾸는개발자
개발자의 일기장
Visual C++ MDI Tip

제가 쓰는 방법입니다만..
님의 코드를 보니 아마 InitInstance에서 가져오신 것 같네요..
그렇게 하지 마시고 일단 InitInstance에 뷰를 모두 정의해 두세요..

pDocTemplate = new CMultiDocTemplate(
...
AddDocTemplate(pDocTemplate);

이렇게 나오는 것 있잖습니까?..
아마 리소스에서 뷰를 만드셨다면 코드가 이렇게 생성되어 있을 겁니다..

그다음 해당 뷰를 불러오는 지점에서 
..
AfxGetApp() -> CloseAllDocuments(TRUE);
POSITION pos = GetFirstDocTemplatePosition();
CMultiDocTemplate *pTemplate;
pTemplate = (CMultiDocTemplate*)GetNextDocTemplate(pos); // 

리소스뷰에서..
다이얼로그에서...

Insert  하시고..
Dialog 확장하시면..
다이얼로그 형태 선택하는게 나옵니다.

즐프하셈~~

/////////////////////////////////////////////////////////////////////////////////////

폼뷰가 처음 뜰때 다이얼로그의 사이즈보다 작게 설정되어있어

항상 스크롤바가 생깁니다.

초기에 다이얼로그의 크기에 맞춰서 띄우려면 어케해야하는지요?

================>


OnInitialUpdate()에서 

    ResizeParentToFit(FALSE);

    CRect rect;
    GetClientRect(&rect);
    CDKFTPView::SetScaleToFitSize(rect.Size());    

일케하면 된다구 예전 게시물에 되어있네요. ^^

/////////////////////////////////////////////////////////////////////////////////////



248799 추원식(heavenmy) 2002-10-19 96 MDI에서 폼뷰 띄우는건데요 잘 안되는게 있어요.. 1 
248838 문정섭(js708) 2002-10-20 144    이건 으아~~~~~^^ 

++++++


소스 테스트를 해 보고 있는 중인데요..

근데.. 이 소스 실행해 보시면 메뉴 끝에 두개의 서브메뉴가 있는데 

두번째 폼을 한번 실행하고 뜨는 창을 닫고 난 다음에 다시 두번째 폼을 띄울려면 에러가 납니다.

첫번째 폼이랑 소스로 봐서는 차이가 없는데 왜 이럴까요?

답변 좀 부탁드려요....^^

+++++++++++++++++++++++++++++++++


소스 잘보았습니다.
잘짜셧군여 ^^

근데 실수하신게 한가지 있네여

두번째 윈도우 OnDestroy() 이 함수 바보세염
void CSecondView::OnDestroy() 
{
CFormView::OnDestroy();
    
((CMainFrame*)AfxGetMainWnd())->m_pWndFrame1 = NULL;
//위에 이부분에 처음꺼 윈도우에 대한 Destroy()져?
복사하신거 같은데 이거 m_pWndFrame2로 바꾸면 잘될겁니다. ^^

    
}

그럼 즐프 ^^


///////////////////////////////////////////////////////////////////////////////
폼뷰기반 MDI 로 해보세요..


저두 비슷한 프로젝트를 해봤습니다..
저는 프로젝트 시작할때부터 메인인터페이스를 구축해놓고 각 기능을 팀원이 나눠서 구현했지요..
인터페이스 제작에만  2주가 걸렸습니다..(너무나 실력이 없어서)
MDI 인터페이스에서 차일드 인터페이스를 각각 다르게 구현하는게 관건이죠..
이 기능은 웬만한 책에두 예제가 있지만 직접 구현해보니 만만치 않아요(저한테만 그러나)..
메인 인터페이스만 구축되면 각 기능을 옮기는건 금방 이죠..
 
^^ 
////////////////////////////////////////////////////////////////////////////////////


프로젝트 생성할때...여러가지 옵션 단계중...뷰의 base class를 바꾸는 곳이 있습니다.
거기서 일반 cview가 아닌 cformview로 변경 하시면 되구요
만약 이미 생성된 프로젝트라면 귀하의 뷰 클래스의 기본클래스(base class)를
폼뷰로 바꾸면 됩니다.
일단 해당 뷰의 헤더파일에서 CView를 CFormView로 변경하세요 몇개 안됩니다.
다음 구현파일(CPP)에도 마친가지로  CView를 CFormView로 변경하세요 역시
몇개 안됩니다. 앞의 생성자및 뭐 그런 부분에서만 바꾸면 될 겁니다.



////////////////////////////////////////////////////////////////////////////////////
[왕초보]분할윈도우에서 서로 다른 폼뷰끼리의 통신...

=====================
제목이 좀 거창한 것 같은데...
지금 VC++을 공부중인데... 분할 윈도우가 두개의 폼뷰로 구성되고 각각의 폼뷰에는
각각의 에디트 컨트롤들이 있습니다.
만약 A라는 폼뷰의 에디트 컨트롤에 입력한 값을 B 폼뷰의 에디트 컨트롤에 보여주고 
싶은경우 어떻게 해야하는지 궁금하네요..
윈도우 핸들을 구해야 하는 것 같기도 한데...

아직 초짜라 어케 하는지 몰라서 그러는데 고수님들의 답변을 부탁드립니다...
예를 들어 설명해주시면 더 고맙구여...^^
그럼 오늘도 좋은 하루 행복한 하루되세요...

=======================>


저도 초본데요...
얼마전에 이곳에 질문을 해서 답을 얻었거든요..

아래는 미디형태의 왼도우에서 작업한 프로젝트중 일부 임다.

//현재 메인 프레임을 가져 온다.
CMainFrame * pFrame;
pFrame = (CMainFrame*) AfxGetMainWnd();

//현재 활성화 되어 있는 자식 프레임을 가져 온다.
CChildFrame * pcFrame;
pcFrame = (CChildFrame*) pFrame->GetActiveFrame();
            
//GetPane()함수를 이용해서 컨트롤할 뷰를 가져 온다.
CDataList * pDataList; //해당 뷰 클래스
pDataList = (CDataList *) pcFrame->m_pwndSplitter->GetPane(0,0);
            
//원하는 컨트롤에 작업을 한다.
pDataList->m_tabCtrl.SetCurSel(0);


/////////////////////////////////////////////////////////////////////////////////


초보입니다.

MDI에서 메뉴를 통해 폼뷰를 띄울때, 이미 띄워져있는 폼뷰가 있을 경우 그 폼뷰를 가장 앞으
로 나오게 할 수 있는 방법을 모르겠습니다. 계속 새로운 창만 생성되고 있습니다.

다이얼로그에서는
if(m_pGISDlg != NULL)
{
    m_pGISDlg->SetFocus();
}
else
{
    m_pGISDlg = new CGISDlg;
    m_pGISDlg->Create(IDD_GIS_DIALOG);
    m_pGISDlg->ShowWindow(SW_SHOW);
}
이렇게 하면 된다는데 폼뷰에서는 잘 안되는 군요....

===================>


함수를 하나 작성해 드리지요..
BOOL CMyApp::DinamicViewLoad(int mode)
{
    POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
    if(pos == NULL) return FALSE;

    CMultiDocTemplate* pTemplate;
    for(int i = 0;i GetNextDocTemplate
(pos);
    }
    POSITION DocPos //
    if((DocPos = pTemplate->GetFirstDocPosition()) != NULL)
    {
        //AfxMessageBox("GetFirstDocPosition-Success");
        while(DocPos !=0)
        {
            CDocument *pDoc 
            if((pDoc = pTemplate->GetNextDoc(DocPos)) != NULL)
            {
                //AfxMessageBox("GetNextDoc-Success");
                POSITION pv = pDoc->GetFirstViewPosition();
                while(pv)
                {
                    CView *pView;
                    if((pView = pDoc->GetNextView(pv)) !
= NULL)
                    {    
                        
                        
                        CMDIChildWnd *pFrame = 
(CMDIChildWnd*)pView->GetParentFrame();
                        if(pView->GetRuntimeClass()
==RUNTIME_CLASS(CKidView)){)){//인자로 님의 폼뷰 클래스를 넣으세요.

                            pFrame-
>ActivateFrame(-1);
                            break;
                        }
                        else if(pView-
>GetRuntimeClass()==RUNTIME_CLASS(CKidSearchWnd            
                pFrame-
>ActivateFrame(-1);
                            break;
                        }
                        
                                
                
                    }
                }
            }
                  
                    }
}
괄호가 제대로 닫혔는지 모르겠네요..확인해보시고 짝을 맞추어 주세요
이렇게 하고 이 함수를 메뉴핸들러 함수에서 다음처럼 호출하시면 
이미 폼뷰가 있을경우 이를 다시 만들지 않고 앞으로 내어줍니다.
void CChildFrame::OnLifeview() //ChildFrame 메뉴에서 작업합니다.
{
    // TODO: Add your command handler code here
int mode = 1;
    CMyApp *pApp = (CMyApp *)AfxGetApp();
    pApp->DinamicViewLoad(mode);
}
궁금하신건 메일주세요..
KidsSoft Programmer
Kids


///////////////////////////////////////////////////////////////////////////////////

Write Reply

Diary List

꿈을꾸는개발자의 일기장 338 업무일지 27 자료모음.

History

Kishe.com Diary
Diary Top Community Top My Informaton