ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MFC]ListBox 컨트롤 및 DB연동(SQLite3)
    💻 프로그래밍/C, C++ 2017. 11. 12. 18:43

    안녕하세요! 코딩하는 JAY입니다. 


    이번에는 MFC 도구상자에 있는 ListBox 를 컨트롤하고 SQLite3와 연동해보도록 하겠습니다!!*_*


    이번 포스팅에서 다룰 내용을 요약하면,


    1. 두개의 ListBox를 만든다.

    2. ListBox1에 DB내용을 불러와 뿌려준다.

    3. 버튼과 DB의 아이템을 클릭하면 ListBox2에 클릭한 아이템이 추가된다.(반대로 삭제도 가능)

    4. 버튼을 클릭하여 ListBox2에 추가한 내용을 새로운 DB로 저장한다.


    대략 이렀습니다!! 자 이제 시작해보도록 하겠습니다.


    1. 대화상자 기반 프로젝트 만들기



    처음 MFC 프로젝트 만들때, '대화 상자 기반'으로 프로젝트를 생성해 줍니다.



    리소스 뷰에 들어가 위와같이 다이얼로그 박스를 구성해주시면 됩니다. 

    도구상자에 보시면 ListBoxButton이 있는데, 이 두가지를 이용하시면 됩니다.

    다이얼로그 박스를 다 구성하셨으면, 각 버튼들에 대한 함수를 만듭니다.(더블클릭하면 Dlg.cpp에 자동생성 됩니다.)

    ListBox의 경우아래 사진과 같이 오른쪽 클릭 후, 변수추가를 클릭하여 리스트변수를 만들어 줍니다.


       



    2. DB 만들기, DB내용 리스트에 저장하기


    DB는 SQLite Expert Personal 이라는 Tool을 이용해 볼수도 있고 만들수도 있습니다. 

    아니면 C++이나 파이썬으로 만들 수 있으며, C++로 만드는 건 이번 포스팅 후반 정도에 ListBox의 원소를 DB로 저장시키는 버튼을 구현할 때 나옵니다. 파이썬이 설치되어 있으신 분들은 다음 포스팅을 참고하시면 됩니다.  


    Python과 SQLite3로 DB만들기 : http://jay-ji.tistory.com/15


    MFC에서 SQLite3를 다루기 위한 기본 환경설정과 내용은 아래 포스팅을 참고하시길 바랍니다. 아래포스팅에 이어서 진도를 나가시면 됩니다.


    SQLite 환경설정 및 DB 컨트롤 : http://jay-ji.tistory.com/17



    3. 리스트에 아이템 추가, 삭제, DB 저장 구현


    DB에 있는 내용을 불러온 ListBox(m_name_list)에서 아무내용이 없는 ListBoxt(m_move_list)로 아이템을 추가하는 방법은 오른쪽 화살표 버튼을 눌러서 추가하는 방법과 아이템을 더블클릭해서 추가하는 방법 두가지로 구현해보도록 하겠습니다. 삭제기능도 동일하게 구현하겠습니다. 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 클릭한 아이템을 추가하는 버튼
    void CMFC_Listbox_test2Dlg::OnBnClickedInsertBtn()
    {
        CString sTmp;
        if(m_name_list.GetCurSel() < 0return;
     
        // 마우스 커서를 모래시계로 변환
        BeginWaitCursor();
     
        try {
            m_name_list.GetText(m_name_list.GetCurSel(), sTmp);
            m_move_list.AddString(sTmp);
        }catch (CppSQLite3Exception& e) {
            m_move_list.AddString(_T("에러"));
        }
     
        // 마우스 커서를 기본 커서로 변환
        EndWaitCursor();
    }


    코드를 보시면 첫번째로 m_name_list의 커서가 선택되어 있는지를 체크합니다. try-catch문에서 GetText()함수를 이용해 선택된 아이템의 내용을 문자열에 저장합니다. 그다음 m_move_listAddString()함수를 이용해 문자열을 저장하면 끝! 참 쉽쥬~

    아! 그리고 BeginWaitCursor(), EndWaitCursor() 함수들은 어떤 동작이 실행되고 있을때 마우스 커서모양을 모래시계로 바꿔줬다가 되돌려 주는 함수입니다. 동작이 실행되고 있는 중이라는 것을 보여주기 위한 API입니다.


    이제 더블클릭으로 아이템을 추가하는 함수를 구현해 볼 건데요. 그 전에 ListBox 관련 함수들을 보고 넘어가겠습니다. 


    - AddString (L “ 문자열 ”) : 문자열을 추가하는 함수.

    - InsertString(-1, L“문자열”) : 문자열을 추가하고, 위치도 지정할 수 있는 함수.

    - SetCurSel(위치값) : 원하는 위치에 커서를 가르키는 함수.

    - GetCurSel() : 클릭한 문자열의 위치를 반환하는 함수.

    - DeleteString(위치값) : 해당 위치의 문자열을 지우는 함수

    - GetText(위치값, str(문자열을 저장하는 함수)) : 해당 위치의 문자열을 받아오는 함수

    - FindString(찾기시작하는 위치, 문자열) : 문자열의 위치를 반환하는 함수.

    - FindStringExact(찾기시작하는 위치, 문자열) : 문자열이 정확히 일치할때만 위치를 찾아낸다.

    - GetCount : 문자열 리스트 개수를 알아내는 함수

    - ResetContent : 모든 문자열을 지우는 함수.


    아이템을 더블클릭으로 추가하기 위해서는 더블클릭하는 이벤트 함수를 만들어줘야 합니다.


      


    ListBox를 오른쪽 클릭하면 이벤트 처리기 추가를 클릭하면 이벤트 처리기 마법사가 나옵니다. 여기서 LBN_DBLCLK 를 선택한 후 추가 및 편집을 누르면 더블클릭 이벤트 처리 함수가 추가 됩니다. 그리고 함수안에 위에서 구현한 아이템 추가 함수를 넣어주면 끝!!

    1
    2
    3
    4
    5
    // 왼쪽 리스트뷰 더블클릭 이벤트
    void CMFC_Listbox_test2Dlg::OnLbnDblclkList1()
    {
        OnBnClickedInsertBtn();
    }


    마찬가지로 아이템을 삭제하는 기능은 비슷하게 구현하면 되겠죠? ListBox의 함수중 어떤함수를 이용하면 됩니다!

    이것은 여러분께서 한번 해보세요:D


    4. 리스트에 저장된 아이템 순서 변경하는 기능 구현


    이왕 ListBox관련된 기능들을 구현해 보는김에 List에 저장된 아이템들의 순서를 변경하는 기능을 구현해보도록 하겠습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // 아이템의 순서를 위로 올려주는 버튼
    void CMFC_Listbox_test2Dlg::OnBnClickedUpBtn()
    {
        CString sTmp, tmpText;
        if(m_move_list.GetCurSel() < 0return;
        int curSelPos = m_move_list.GetCurSel(); // 커서 위치 저장
     
        BeginWaitCursor();
     
        try {
            if(curSelPos > 0) {
                m_move_list.GetText(m_move_list.GetCurSel() - 1, tmpText);
                m_move_list.GetText(m_move_list.GetCurSel(), sTmp);
     
                m_move_list.DeleteString(curSelPos - 1);
                m_move_list.InsertString(curSelPos - 1, sTmp);
     
                m_move_list.DeleteString(curSelPos);
                m_move_list.InsertString(curSelPos, tmpText);
            }
        } catch (CppSQLite3Exception& e) {
            m_move_list.AddString(_T("에러"));
        }
     
        if(curSelPos != 0) m_move_list.SetCurSel(curSelPos - 1); // 커서셀 한 칸 위로이동
        EndWaitCursor();
    }


    코드를 보시면 아시겠지만 어려운 내용이 아닙니다.ㅎㅎ 단지 순서를 변경하기 위해 임시변수에 내용을 저장하고 다시 다른곳에 저장하고 하는 동작이죠!! 


    5. 추가한 아이템들을 새로운 DB로 저장하기


    LisbBox의 내용을 DB로 저정하기 위해서는 몇가지 SQL쿼리문을 알아야 합니다. 테이블을 만들어주는 CREATE, 데이터를 추가해주는 INSERT문입니다. SQL쿼리에 대한내용은 한번 검색해 보시길 바랍니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // 리스트 내용 DB로 저장하기
    void CMFC_Listbox_test2Dlg::OnBnClickedSavebtn()
    {
        sqlite3 *db;
        int retv;
     
        CString db_path = _T("saveDB.db") ;
        // LPSTR(LPCTSTR(db_path) CString을 char*로 변환해주는 코드(내용 찾아보기)
        retv = sqlite3_open(LPSTR(LPCTSTR(db_path)), &db);// open database            
     
        CppSQLite3DB sdb;
        try {
            sdb.open(_T("saveDB.db"));
            sdb.execDML(_T("CREATE TABLE IF NOT EXISTS People(name VARCHAR(20));"));    
     
            CString sTmp, sList;
            CppSQLite3Query q;
            for(int i = 0; i < m_move_list.GetCount(); i++) {
                m_move_list.GetText(i, sList);
                sTmp.Format(_T("insert into People (name) values ('%s');"), sList);
                q = sdb.execQuery(sTmp);
            }
        } catch(CppSQLite3Exception & e) {
     
        }        
    }
     


        

    지금까지 ListBox를 컨트롤하는 법과 간단한 DB, SQL쿼리를 다뤄보았습니다. 간단한 내용이지만 처음 MFC를 접하시는 분들에게 조금이나마 도움이 되었으면 좋겠습니다. 이상으로 오늘의 포스팅을 마치겠습니다. 여러분 즐거운 코딩, 재밌는 코드 생산하세요~


    직장 이모티콘에 대한 이미지 검색결과

    (아디오스~:D)


    전체 소스코드 : https://github.com/JAY-Chan9yu/StudyProgramming/tree/master/MFC_Listbox_test2

    댓글

운동하는 개발자 JAY-JI