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

- CWinApp참조

CWinApp* AfxGetApp();

 

-메인 프레임 윈도우 참조

CWnd* AfxGetMainWnd();

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

 

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

-뷰에서 토큐먼트 참조

CDocument* CView::GetDocument();

 

-뷰에서 그 뷰를 둘러싸고 있는 프레임 윈도우 참조

CFrameWnd* CWnd::GetParentFrame();

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

 

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

-도큐먼트에서 뷰 참조

POSITION pos = GetFirstViewPosition();

while(pos != NULL)

{

    CView* pView = (CView *)GetNextView(pos);

    if(pView->IsKindOf(RUNTIME_CLASS(CTestView)))
    {

        pView->UpdateWindow();

    }

}

 

-도큐먼트에서 프레임 윈도우 참조

단일 도큐먼트 : AfxGetMainWnd();

다중 도큐먼트 : 도큐먼트에서 뷰를 얻고, 그 뷰에서 자신을 포함하는 프레임 윈도우를 얻음

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

 

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

-프레임 윈도우에서 뷰 참조

CView* CFrameWnd::GetActiveView();

 

-프레임 윈도우에서 도큐먼트 참조

virtual CDocument* CFrameWnd::GetActiveDocument();

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

 

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

//예제 : 폼뷰에 올라와 있는 리스트박스에 등록되어있는 Text를 얻어와 다른 뷰에 출력하는 방법들

void CTestFormView::OnSelchangeList()
{
    CTestDoc* pDoc = GetDocument();
    int index;

 

    index = m_ctrList.GetCurSel();

 

    m_ctrList.GetText( index, pDoc->str );

 

    /////////////////////////////////////////////////////////////////////////
    //방법 1(MDI, SDI 모두가능)
    CMainFrame* pFrame = (CMainFrame *)AfxGetMainWnd();
    CMFC0604Doc* pDoc2 = (CMFC0604Doc *)pFrame->GetActiveDocument();
 
    POSITION pos = pDoc2->GetFirstViewPosition();

    CMFC0604View *pView;
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 

    pView->Invalidate();
 
    /////////////////////////////////////////////////////////////////////////
    //방법 2(MDI, SDI 모두가능)
    CMFC0604Doc* pDoc2 = (CMFC0604Doc *)(((CMainFrame *)AfxGetMainWnd())->GetActiveDocument() );
 
    POSITION pos = pDoc2->GetFirstViewPosition();

    CMFC0604View *pView;
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 

    pView->Invalidate();

 

    /////////////////////////////////////////////////////////////////////////
    //방법 3(MDI, SDI 모두가능)
    CMFC0604Doc* pDoc2 = (CMFC0604Doc *)((CMainFrame *)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
 
    POSITION pos = pDoc2->GetFirstViewPosition();

    CMFC0604View *pView;
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 

    pView->Invalidate();

 

    /////////////////////////////////////////////////////////////////////////
    //방법 4(MDI, SDI 모두가능)

    CMFC0604Doc* pDoc2 = (CMFC0604Doc *)((CMainFrame *)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
 
    POSITION pos = pDoc2->GetFirstViewPosition();

    CMFC0604View *pView;
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 
    pView = (CMFC0604View *)pDoc2->GetNextView(pos); 

    pView->Invalidate();

 

    /////////////////////////////////////////////////////////////////////////
    //방법 5(MDI, SDI 모두가능) <-범용적인 방법
    CDocument* pDoc2;
    CView *pView, *pView2;

    POSITION pos;

    pDoc2 = (CDocument *)((CMainFrame *)AfxGetMainWnd())->GetActiveDocument();

    pos = pDoc2->GetFirstViewPosition();

    pView = pDoc2->GetNextView(pos);
    pView2 = pDoc2->GetNextView(pos);

    pView->Invalidate();
    pView2->Invalidate();
 
    /////////////////////////////////////////////////////////////////////////
    //방법6
    CView* pView;

    POSITION pos;

    pos = pDoc->GetFirstViewPosition();

    while( pos != NULL )
    {
        pView = (CView *)pDoc->GetNextView(pos);

        if( pView->IsKindOf(RUNTIME_CLASS(CMFC0604View)) )
        {
            pView->Invalidate();
        }
    }

}

 

 

 

/***********************************************************************************/

/*메인프레임에서 각 뷰에 접근하는 예제

/*기능 : 타이머를 설정하여 매 타임마다 각 뷰에 텍스트를 찍는 예제

/***********************************************************************************/

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
    /*return m_wndSplitter.Create(this,
     2, 2,               // TODO: adjust the number of rows, columns
     CSize(10, 10),      // TODO: adjust the minimum pane size
     pContext);*/

 

    if (!m_wndSplitter.CreateStatic(this, 2, 2))
    {
        TRACE0("Fail to create splitter window.\n");
        return FALSE;    // failed to create
    }
 
    m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMFC0606View), CSize(100, 100), pContext);
    m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CTestView2), CSize(100, 100), pContext);
    m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CTestView3), CSize(100, 100), pContext);
    m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CTestView4), CSize(100, 100), pContext);
  
    SetActiveView( (CView*)m_wndSplitter.GetPane(0, 0) ); //처음 포커스를 줄 뷰를 선택한다.

    m_wndSplitter.SetRowInfo(0, 300, 1);
    m_wndSplitter.SetColumnInfo(0, 300, 1);  
   
    return TRUE;
}

 

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

 

void CMainFrame::OnDestroy()
{
    CFrameWnd::OnDestroy();
 
    KillTimer( 0 );
}

 

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

 

void CMainFrame::OnTimer(UINT nIDEvent)
{
    static CView* pOldView = NULL;
    static int num = 1;

 

    if( pOldView ) pOldView->Invalidate();

 

    CDocument* pDoc;
    CView* pView;

    CString str;

    POSITION pos;
    CDC *pDC;

 

    pDoc = GetActiveDocument();
    pos = pDoc->GetFirstViewPosition();

 

    for( int i = 0; i < num; i++ )
    {
        pView = pDoc->GetNextView(pos);
    }

 

    pDC = pView->GetDC();  
    str.Format( "Num : %d", num );
    pDC->TextOut( 50, 50, str );
 
    pOldView = pView;

    num++;
    if( num > 4 ) num = 1;

    CFrameWnd::OnTimer(nIDEvent);
}

'Programming > MFC' 카테고리의 다른 글

현재 시간 얻어오기  (0) 2010.11.16
Editbox 컨트롤 사용방법  (0) 2010.11.16
뷰 및 객체간의 상호참조  (0) 2010.11.16
모달리스 다이얼로그  (0) 2010.11.16
컨트롤에서 데이터값 가져오기, 삽입하기  (0) 2010.11.16

//CTestView에서

CTestDlg  m_Dlg;

CTest2Dlg m_Dlg2;

 

//CTestView생성자에서

m_Dlg.m_pView = this;
m_Dlg.m_pDlg = &m_Dlg2;

 

//class CTestDlg : public CDialog 에서
CView *m_pView; //선언
CDialog *m_pDlg;  //선언

 

void CTestDlg::OnOK()  //확인 눌렀을 때
{
    UpdateData(TRUE);
 
    ((CTest2Dlg *)m_pDlg)->m_Id = m_Id;
    ((CTest2Dlg *)m_pDlg)->m_Name= m_Name;
    ((CTest2Dlg *)m_pDlg)->UpdateData(FALSE);

 

    m_pView->Invalidate();

}

'Programming > MFC' 카테고리의 다른 글

Editbox 컨트롤 사용방법  (0) 2010.11.16
클래스들 간의 상호참조  (0) 2010.11.16
모달리스 다이얼로그  (0) 2010.11.16
컨트롤에서 데이터값 가져오기, 삽입하기  (0) 2010.11.16
라디오버튼 기본값 설정  (0) 2010.11.16

//class CMainFrame에서

CModeless *m_pDlg; //선언

 

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

 

void CMainFrame::OnMenuitem() //메뉴를 클릭했을때
{
    if( m_pDlg != NULL )
    {
        m_pDlg->SetFocus();
 
    }

   

    else
    {
        m_pDlg = new Modeless;
        m_pDlg->Create(IDD_DIALOG1, this);
        m_pDlg->ShowWindow(SW_SHOW);
    }
 
}

 

void Modeless::OnCancel() //취소 버튼 눌렀을 때
{
    DestroyWindow();
 
    //CDialog::OnCancel(); //주석 처리 해야함
}

 

void Modeless::OnClose() //확인 버튼 눌렀을때
{
    DestroyWindow();
 
    //CDialog::OnClose(); //주석 처리 해야함
}

 

void Modeless::PostNcDestroy() //PostNcDestroy추가
{
    delete this;
    ((CMainFrame *)AfxGetMainWnd())->m_pDlg = NULL;

}

 

 

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

//더 쉬운 방법

//class CTestView에서

CModeless m_Dlg; //선언

 

void TestView::OnInitialUpdate()
{
    CRect rect, winRect;
    CString str;
 
    if( m_Dlg.GetSafeHwnd() == NULL )
    {
        m_Dlg.Create(IDD_DIALOG1);  
    }

 

    AfxGetMainWnd()->GetWindowRect( &winRect );

    m_Dlg.GetWindowRect( &rect );
    m_Dlg.SetWindowPos( NULL, winRect.right - rect.Width() - 10, winRect.top + 75, rect.Width(), rect.Height(), 0 );
 
    m_Dlg.ShowWindow(SW_SHOW);

}


/****************************************************************************/
/* GetDlgItemText(), GetDlgItemInt(), SetDlgItemText() SetDlgItemInt() 이용
/****************************************************************************/

 CString str;

 GetDlgItemText(IDC_EDIT1, str);
 SetDlgItemText(IDC_STATIC1, str);


 

/************************************************************************/
/* 객체 포인터 이용                                                    
/************************************************************************/

 CString str;

 CEdit* pEdit2 = (CEdit*)GetDlgItem(IDC_EDIT2);
 pEdit2->GetWindowText(str);
 CStatic* pStatic2 = (CStatic*)GetDlgItem(IDC_STATIC2);
 pStatic2->SetWindowText(str);


 

/************************************************************************/
/* 컨트롤 맴버 변수 활용                                               
/************************************************************************/
 CString str;

 m_ctrEdit3.GetWindowText(str);
 m_ctrStatic3.SetWindowText(str);


 

/************************************************************************/
/* 데이터 값을 이용                                                    
/************************************************************************/
 UpdateData(TRUE);
 m_strStatic4 = m_strEdit4;
 UpdateData(FALSE);



OnInitDialog()에서  

CButton* pCheck = (CButton*)GetDlgItem(IDC_RADIO1);

pCheck->SetCheck(1);


라디오버튼 옵션설정에서도 기본 상태는 변경 가능

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.x = 0;
    cs.y = 0; 
    cs.cx = GetSystemMetrics(SM_CXSCREEN); //스크린 넓이

    cs.cy = GetSystemMetrics(SM_CYSCREEN); //스크린 높이

    cs.style = WS_CAPTION | WS_SYSMENU;     //타이틀 바와 시스템 메뉴 박스를 갖는 윈도우

    //cs.style |= WS_MAXIMIZEBOX; //디폴트로 설정되어 있는 윈도우 속성을 유지하면서, 최대화 박스 추가.

    //cs.dwExStyle |= (WS_EX_TOOLWINDOW|WX_EX_TOPMOST);

    //짧은 타이틀바를 갖고 항상 다른 윈도우의 위에 올라가 있는 윈도우 확장 스타일

    return TRUE;
}

 

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

//전체화면

//CWinApp파생 클래스의 InitInstance함수에서

pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);

 

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

//뷰의 배경색 바꾸기

//변경하고 싶은 뷰의 PreCreateWindow에서

cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
                   LoadCursor(NULL, IDC_ARROW),
                   (HBRUSH)GetStockObject(BLACK_BRUSH),
                   LoadIcon(NULL, IDI_APPLICATION)); 


//스크롤바는 컨트롤 변수를 사용하지 않고, 슬라이더바는 컨트를 변수를 사용해봤음

 

//포인터 객체 선언(스크롤바)

CScrollBar *m_pScrollRed;
CScrollBar *m_pScrollGreen;
CScrollBar *m_pScrollBlue;

 

//컨트롤 변수(슬라이더바)

CSliderCtrl m_ctrSliderRed;
CSliderCtrl m_ctrSliderGreen;
CSliderCtrl m_ctrSliderBlue;

 

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

//OnInitDialog에서

 CString str;

 

 //스크롤바

 m_pScrollRed = (CScrollBar *)GetDlgItem(IDC_SCROLLBAR_RED);
 m_pScrollGreen = (CScrollBar *)GetDlgItem(IDC_SCROLLBAR_GREEN);
 m_pScrollBlue = (CScrollBar *)GetDlgItem(IDC_SCROLLBAR_BLUE);

 

 m_pScrollRed->SetScrollRange( 0, 255 );
 m_pScrollGreen->SetScrollRange( 0, 255 );
 m_pScrollBlue->SetScrollRange( 0, 255 );

 

 SetDlgItemInt( IDC_EDIT_SCROLL_RED, m_pScrollRed->SetScrollPos( 0 ) );
 SetDlgItemInt( IDC_EDIT_SCROLL_GREEN, m_pScrollGreen->SetScrollPos( 0 ) );
 SetDlgItemInt( IDC_EDIT_SCROLL_BLUE, m_pScrollBlue->SetScrollPos( 0 ) );

 

 //슬라이더바

 m_ctrSliderRed.SetRange( 0, 255 );
 m_ctrSliderGreen.SetRange( 0, 255 );
 m_ctrSliderBlue.SetRange( 0, 255 );

 

 m_ctrSliderRed.SetPos(0);
 m_ctrSliderGreen.SetPos(0);
 m_ctrSliderBlue.SetPos(0);

 

 str.Format( "%d", m_ctrSliderRed.GetPos() );
 m_ctrSliderEditRed.SetWindowText( str );

 

 str.Format( "%d", m_ctrSliderGreen.GetPos() );
 m_ctrSliderEditGreen.SetWindowText( str );

 

 str.Format( "%d", m_ctrSliderBlue.GetPos() );
 m_ctrSliderEditBlue.SetWindowText( str );

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

 

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

//OnHScroll에서

switch( nSBCode )
{
case SB_LINELEFT:
    pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1);

    break;

 

case SB_LINERIGHT:
    pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1);

    break;
  
case SB_PAGELEFT:
    pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 10);

    break;
  
case SB_PAGERIGHT:
    pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 10);

    break; 

 

case SB_THUMBTRACK:
    pScrollBar->SetScrollPos( nPos );
    break;

 

//슬라이더바는 스위치문 필요없음

}


m_ctrProgress.SetRange(0, 100);
m_ctrProgress.SetPos(0);
m_ctrProgress.SetStep(1);

for( int count = 0; count < 100; count++ )
{
    m_ctrProgress.StepIt();
  
    Sleep(10);
}



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

//OnInitDialog에서

 CRect rt;

 m_BigImage.Create( IDB_SMALL, 32, 1, RGB(255,255,255) );


 m_ctrList.SetImageList( &m_BigImage, LVSIL_NORMAL );
 m_ctrList.SetImageList( &m_imageTree, LVSIL_SMALL );

 

 m_ctrList.GetClientRect( &rt );


 m_ctrList.InsertColumn(0, "캐릭터 이름", LVCFMT_CENTER, 100 );
 m_ctrList.InsertColumn(1, "타입", LVCFMT_CENTER, 50 );
 m_ctrList.InsertColumn(2, "HP", LVCFMT_CENTER, 50 );
 m_ctrList.InsertColumn(3, "MP", LVCFMT_CENTER, rt.Width() - 120 );
 
 //아이템 초기화
 CString str;
 
 m_ctrList.InsertItem( 0, "루시안칼츠", 0 );
 m_ctrList.SetItemText( 0, 1, "전사" );
 m_ctrList.SetItemText( 0, 2, "1000" );
 m_ctrList.SetItemText( 0, 3, "200" );

 

 m_ctrList.InsertItem( 1, "이스핀샤를", 1 );
 m_ctrList.SetItemText( 1, 1, "마법사" );
 m_ctrList.SetItemText( 1, 2, "500" );
 m_ctrList.SetItemText( 1, 3, "1000" );

 

 m_ctrList.InsertItem( 2, "나야트레이", 2 );
 m_ctrList.SetItemText( 2, 1, "엘프" );
 m_ctrList.SetItemText( 2, 2, "600" );
 m_ctrList.SetItemText( 2, 3, "500" );

 

 m_ctrList.InsertItem( 3, "보리스진네만", 3 );
 m_ctrList.SetItemText( 3, 1, "다크엘크" );
 m_ctrList.SetItemText( 3, 2, "700" );
 m_ctrList.SetItemText( 3, 3, "300" );
 
 //리스트 컨트롤의 다양한 스타일 지원
 m_ctrList.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
 m_ctrList.ModifyStyle( LVS_TYPEMASK, LVS_REPORT );

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

 

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

//OnClickList에서

POSITION pos;
CString str;

 

pos = m_ctrList.GetFirstSelectedItemPosition();

str = m_ctrList.GetItemText( m_ctrList.GetNextSelectedItem(pos), 0 );

 

SetDlgItemText( IDC_EDIT_LIST, str );

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

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

//OnInitDialog에서

//인자 설명 : InsertItem( 노드이름, 선택되지 않은 경우 노드 이미지, 선택된 경우 노드이미지, 부모윈도의 노드 );

 

 CImageList m_imageTree.Create( IDB_SMALL, 16, 1, RGB(255,255,255) );
 

 m_ctrTree.SetImageList( &m_imageTree, TVSIL_NORMAL );

 HTREEITEM hSub = m_ctrTree.InsertItem( "검", 0, 1 );
 m_ctrTree.InsertItem( "단검", 2, 1, hSub );
 m_ctrTree.InsertItem( "장검", 2, 1, hSub );

 hSub = m_ctrTree.InsertItem( "신발", 0, 1 );
 hSub = m_ctrTree.InsertItem( "장화", 2, 1, hSub );

 m_ctrTree.InsertItem( "가죽신", 3, 1, hSub );

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

 

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

//OnSelchangedTree에서 현재 선택된 노드의 값을 에디트박스에 집어넣기

HTREEITEM hSel = pNMTreeView->itemNew.hItem;
 
if( hSel != NULL )
{
    CString str = m_ctrTree.GetItemText( hSel );

    SetDlgItemText( IDC_EDIT_TREE, str );
}


+ Recent posts