///////////////////////////////////////////////////////////////////////////////
//STL( list )
//이중 링크드 리스트처럼 임의의 위치에 삽입과 삭제가 빠름
//임의의 위치에 엑세스 할 수 없으며, 순차적으로 엑세스 하여 검색할 수 있다.
//순차 컨테이너
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <list>

 

using namespace std;

 

void main()
{
    list<int> List;
    list<int>::iterator it;

 

    List.push_back(10);
    List.push_back(9);
    List.push_back(8);
    List.push_back(7);
    List.push_back(6);

 

    cout << "List크기" << List.size() << endl;

 

    for( it = List.begin(); it != List.end(); it++ )

    {
        cout << *it << endl;
    }

 

    List.push_front(11);
    List.push_front(12);

 

    cout << "List크기" << List.size() << endl;

 

    for( it = List.begin(); it != List.end(); it++ )

    {
        cout << *it << endl;
    }
}

 

 

 

///////////////////////////////////////////////////////////////////////////////
//STL( list )
//list를 이용하여 링크드 리스트 구현하기.
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <list>
#include <algorithm>

 

using namespace std;

enum { INPUT = 1, DELETE, OUTPUT, EXIT };

 

void main()
{
    int select;
    int val;

 

    list<int> list1;
    list<int>::iterator it;

 

    while(1)

    {
        cout << "선택하세요( [1]:입력, [2]:삭제, [3]:출력, [4]:나가기 ) : ";
        cin >> select;

 

        switch( select )

        {
        case INPUT:
            cout << "입력할 값을 입력하세요 : ";
            cin >> val;

 

            list1.push_back(val);

 

            break;

 

        case DELETE:
            cout << "삭제할 값을 입력하세요 : ";
            cin >> val;

 

            it = find( list1.begin(), list1.end(), val ); //입력한 값을 찾아서 이터레이터를 리턴.

            list1.erase(it);

 

            break;

 

        case OUTPUT:
            for( it = list1.begin(); it != list1.end(); it++ )

            {
                 cout << *it << endl;
            }    

 

            break;

 

        case EXIT:
            cout << "Bye~" << endl;

 

            return;

        }
    }
}

 

 

 

///////////////////////////////////////////////////////////////////////////////
//STL( list )
//구조체 변수를 사용하기.
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <list>

 

using namespace std;

 

typedef struct tag_Number {
    char name[10];
    int num;
}NUMBER;

 

NUMBER *pNum = NULL;


list<NUMBER*> list1;
list<NUMBER*>::iterator it;

 

void Input();
void Output();

 

void main()
{
    Input();
    Output();
    delete pNum;
}

 

void Input()
{
    int sel;

 

    while(1)
    {
        cout << "[1] : 입력, [5] : 나가기";
        cin >> sel;

 

        if( sel == 5 ) break;

        else if( sel == 1 )

        {
            pNum = new NUMBER;

            cout << "이름을 입력하세요 : ";
            cin >> pNum->name;

            cout << "전화번호를 입력하세요 : ";
            cin >> pNum->num;

 

            list1.push_back( pNum );   //리스트가 동적으로 할당하는 pNum을 가지고 있는다.
                                                  //구조체를 가지게 하지말고 주소값을 가지게 할것.
        }
    }
}

 

void Output()
{
    for( it = list1.begin(); it != list1.end(); it++ )

    {
        cout << (*it)->name << endl;
        cout << (*it)->num << endl;
    }
}


///////////////////////////////////////////////////////////////////////////////
//STL( map )
//map의 index에 의해서 정렬되어 값이 출력됨.
//index키값을 이용해 신속하게 값을 찾을 수 있다.
//중복된 index를 허용하지 않는다.
//정력컨테이너 : 키값을 이용해서 데이터를 신속하게 찾을 수 있다.
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <map>

 

using namespace std;

 

void main()
{
    map<int, char*> map1;
    map<int, char*>::iterator it;

    map1[3] = "yi";
    map1[2] = "ki";
    map1[1] = "ho";

 

    for( it = map1.begin(); it != map1.end(); it++ )

    {
        cout << it->first << it->second << endl;
    }

 

    map1[1] = "wow";
    map1[3] = "hi";

 

    for( it = map1.begin(); it != map1.end(); it++ )

    {
        cout << it->first << it->second << endl;
    }

 

    map1.erase(3);  //index키값을 이용해 쉽게 자료를 삭제할 수도 있다.

   

    for( it = map1.begin(); it != map1.end(); it++ )

    {
        cout << it->first << it->second << endl;
    }
}


///////////////////////////////////////////////////////////////////////////////
//STL( set )
//렌덤하게 값을 집어 넣으면서 소트와 중복된 값을 뺀다.
//정렬컨테이너
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <set>
#include <ctime>

 

using namespace std;

 

void main()
{
    srand((unsigned)time(NULL));
    set<int> set1;
    set<int>::iterator it;

    int p[8] = { 5, 3, 2, 4, 1, 9, 8, 7 };

 

    for( int i = 0; i < 8; i++ )

    {
        int temp = rand() % 8;
        set1.insert(p[temp]);
    }

 

    for( it = set1.begin(); it != set1.end(); it++ )

    {
        cout << *it << endl;
    }
}


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

list  (0) 2010.11.16
map - map의 index에 의해 정렬되어 값이 출력  (0) 2010.11.16
stack  (0) 2010.11.16
vector - 가변길이의 순차적인 배열에 대한 임의의 접근 가능  (0) 2010.11.16

///////////////////////////////////////////////////////////////////////////////
//STL( stack )
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <stack>

 

using namespace std;

 

void main()
{
    stack<int> stack1;

 

    //추가
    stack1.push(5);
    stack1.push(3);
    stack1.push(7);

 

    //삭제
    cout << stack1.top() << endl;

    stack1.pop();

    cout << stack1.top() << endl;

    stack1.pop();

    cout << stack1.top() << endl;
}



///////////////////////////////////////////////////////////////////////////////
//STL( vector )
//가변길이의 순차적인 배열에 대한 임의의 접근 가능
//하지만 임의의 위치에 값을 넣을경우 효율이 떨어진다. 순차적이므로 밀려나기 때문
//순차 컨테이너
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <vector>

 

using namespace std;

 

void main()
{
    vector<int> vector1;
    vector<int>::iterator it;

    int array[5];

 

    for( int i = 0; i < 5; i++ )

    {
        array[i] = i;
        vector1.push_back(array[i]);
    }

 

    cout << "vector크기" << vector1.size() << endl;

 

    for( it = vector1.begin(); it != vector1.end(); it++ )

    {
        cout << *it << endl;
    }  
}

 

 

 

///////////////////////////////////////////////////////////////////////////////
//STL( vector복사 )
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <vector>

using namespace std;

void main()
{
    vector<int> vector1;
    vector<int>::iterator it;
    vector<int> vector2(5);

    int array[5];

 

    for( int i = 0; i < 5; i++ )

    {
        array[i] = i;
        vector1.push_back(array[i]);
    }

 

    cout << "vector크기" << vector1.size() << endl;

 

    for( it = vector1.begin(); it != vector1.end(); it++ )

    {
        cout << *it << endl;
    }

 

    for( i = 0; i < vector1.size(); i++ )

    {
        vector2[i] = vector1[i];
    }

 

 /*for( it = vector2.begin(); it != vector2.end(); it++ )

    {
        cout << *it << endl;
    }*/

 

    for( i = 0; i < vector2.size(); i++ )

    {
        cout << vector2[i] << endl;
    }
}

 

 

 

///////////////////////////////////////////////////////////////////////////////
//STL( vector값 삽입 및 삭제 )
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <vector>

using namespace std;

void main()
{
    vector<int> vector1;
    vector<int>::iterator it;
    vector<int>::reverse_iterator it2;  //역방향 출력을 위한 이터레이터

    vector<char> charVector;
    vector<char>::iterator charIt;

    vector<char*> stringVector;
    vector<char*>::iterator stringIt;

    char *p[3] = { "Hello", "Hi", "Ok" };

 

    /////////////////////////////////////////////////////////////////////////////
    //int형 값 입력 및 출력

    for( int i = 0; i < 5; i++ )

    {
        vector1.push_back(i);
    }

 

    cout << "vector크기" << vector1.size() << endl;
    cout << endl;

 

    for( it = vector1.begin(); it != vector1.end(); it++ )

    {
        cout << *it << endl;
    }

    cout << endl;

 

    vector1.insert( &vector1[3], 11 );

 

    for( it = vector1.begin(); it != vector1.end(); it++ )

    {
        cout << *it << endl;
    }

    cout << endl;

 

    vector1.erase( &vector1[4] );

 

    for( it2 = vector1.rbegin(); it2 != vector1.rend(); it2++ ) //역방향 출력
    {  

        cout << *it2 << endl;
    }
    /////////////////////////////////////////////////////////////////////////////

 

    /////////////////////////////////////////////////////////////////////////////
    //문자 입력 및 출력

    for( i = 0; i < 26; i++ )

    {
        charVector.push_back( 'A' + i );
    }

 

    for( charIt = charVector.begin(); charIt != charVector.end(); charIt++ )

    {
        cout << *charIt << endl;
    }
    /////////////////////////////////////////////////////////////////////////////

 

    /////////////////////////////////////////////////////////////////////////////
    //스트링 입력 및 출력
    for( i = 0; i < 3; i++ )

    {
        stringVector.push_back( p[i] );
    }

 

    for( stringIt = stringVector.begin(); stringIt != stringVector.end(); stringIt++ )

    {
        cout << *stringIt << endl;
    }
    /////////////////////////////////////////////////////////////////////////////
}

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

list  (0) 2010.11.16
map - map의 index에 의해 정렬되어 값이 출력  (0) 2010.11.16
set - 랜덤하게 값을 집어 넣으면서 중복값을 빼고 소팅  (0) 2010.11.16
stack  (0) 2010.11.16

CString m_strTime;

 

void CTestView::OnTimer(UINT nIDEvent)
{
    if( nIDEvent == 0 )
    {
        time_t now;

        time( &now );

        m_strTime = ctime(&now);

        Invalidate(FALSE);
    }

}


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

C# 소켓 예제 (Server, Client)  (0) 2010.11.29
MFC 쓰레드(thread) 예제  (0) 2010.11.22
Editbox 컨트롤 사용방법  (0) 2010.11.16
클래스들 간의 상호참조  (0) 2010.11.16
뷰 및 객체간의 상호참조  (0) 2010.11.16

int m_X;
int m_Y;
CString m_Str;

 

SetDlgItemInt( IDC_EDIT_X, m_X );
SetDlgItemInt( IDC_EDIT_Y, m_Y );
SetDlgItemText( IDC_EDIT_STR, m_Str );

 

m_X = GetDlgItemInt( IDC_EDIT_X );
m_Y = GetDlgItemInt( IDC_EDIT_Y );
GetDlgItemText( IDC_EDIT_STR, m_Str );

 

m_ctrEdit.EnableWindow( FALSE );      //비활성화
m_ctrEdit.EnableWindow( TURE );        //활성화

m_ctrEdit.EnableWindow( m_bCheck ); //체크박스 선택 유무에 따른 활성화/비활성화


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

MFC 쓰레드(thread) 예제  (0) 2010.11.22
현재 시간 얻어오기  (0) 2010.11.16
클래스들 간의 상호참조  (0) 2010.11.16
뷰 및 객체간의 상호참조  (0) 2010.11.16
모달리스 다이얼로그  (0) 2010.11.16


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

- 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);

}


+ Recent posts