레이블이 List box인 게시물을 표시합니다. 모든 게시물 표시
레이블이 List box인 게시물을 표시합니다. 모든 게시물 표시

2010년 2월 4일 목요일

MFC practice #7

Interconnection btw event of Listbox and behavior of Edit box.

 1.LBN_SELCHANGE통지 메세지: Listbox에서 항목 선택이 변경되었음을 알려주는 메세지 (p.439)
   - value category의 멤버변수 추가.
   - CxDlg class의 속성창의 event버튼 클릭.
   - LBN_SELCHANGE통지 메시지의 핸들러 함수(OnLbnSelchangex)등록.
 2.GetCurSel() 함수: 현재 선택된 항목의 index 알아냄.
    int nIndex;
nIndex=test.GetCurSel();
 3.switch/case이용하여 index값에 따라 임의의 string을 edit box에 출력.
   - value category로 m_edit1 멤버 변수를 edit box에 추가
   - edit box에서는 AddString(), InsertString()이 쓰이지 않음(?), so x.Format()으로 출력.
   - 다음과 같이 OnLbnSelchangeList1()의 case문 안에 코딩
        m_edit1.Format(_T("index 0"));
UpdateData(FALSE);

Result
 - Ok, it works.
 - Bug: OGF1,OGF2에 관계 없이 첫번째 명령어는 무조건 'index0'가 발생함.
        OGF를 구분하는 조건이 하나가 더 추가 되어야 함. How?

Summary
 - LBN_SELCHANGE(OnLbnSelchange()) 통지 메시지:
   .목록상자(ListBox)에서 항목 선택이 변경되었음을 알려줌.
   .키보드를 이용했든 마우스를 이용했든 항목 선택이 변경되면 이 메시지가 발생함.
 - GetCurSel():
   .List box내의 항목 선택했을시 항목의 index를 int형으로 반환하는 함수. (see p.440)
 - Edit box에서 화면 출력하고자 할때는 'AddStrig()'이나 'InsertString()'이 쓰이지 않고,
   'Format()' 함수 사용.

TODO next is
 - Debug: 전역 static으로 변수 하나 할당한 후 button click 마지막 란에 OGF구분용 flag 추가
          ex) OGF_flag=0
          OnLbnSelchange()함수 안에 위의 flag를 이용한 if문 구현하여 돌려보자.




2010년 1월 26일 화요일

MFC practice #4

Dialog Box example

 - Function description:
    Dropdown menu(Combo Box)의 3개 항목중 하나를 선택시 이와 연동된 List Box내의 항목이 변경된다.
 - Procedure
  1) Dialog Box solution setting.
  2) Tool box를 이용하여 전반적인 Dialog Box를 design한다.(place combo box and list box)
  3) Property 수정(of each box)
     -Combo Box
       .Appearance>Type>을 Drop List 로 변경:Edit 불가능한 List box로 설정
        (즉, edit control의 속성이 사라짐. cf) 'Drop Down' type은 편집가능한 List box)
       .ID변경: 'IDC_COMBO_Address'등 임의로 변경.
       .Add variable>category중 'control'혹은 'value' 선택 => 둘의 차이를 아직 명확히 모르겠음..
       .variable name 입력(ex. m_Combo_Address)
       .OnInitDialog()함수에서 AddString()을 사용하여 문자열 항목 추가.
         ex) m_Combo_Address.AddString(_T("A"));
       .목록상자에서 선택한 항목이 변경되었을 때 발생하는 '통지메시지'등록:
        CBN_SELCHANGE->OnCbnSelChangeComboAddress()함수 등록
       .위의 함수내에 GetCurSel()함수 이용하여, 현재 선택된 항목의 Index를 읽어옴.
        ex)int nIndex=m_Combo_Address.GetCurSel();
       .switch/case문을 이용하여 nIndex값에 따라 List Box에 항목 도시
        ex)switch(nIndex)
            {
               case 0:
             m_List.AddString(_T("A"));
                         ..
                    ..



 -분석:
   1. 이경우 문제점 발생: Combo box에서 항목 선택시, List box에, 이전 항목 아래에 List가 계속 추가됨.
       화면이 업데이트가 되도록 하거나(refresh), 'AddString()'이 아닌(더하는 것이 아닌) 단순히 출력하는          함수로 구현해야 함. -> 근데 그게 뭔지 모르겠음.

 -주요 function
   1.UpdateData(): 특정 변수와 컨트롤 윈도우간에 정보교환이 일어나도록 하는 함수(p.392)
   2.CBN_SELCHANGE 통지 메시지: OnCbnSelChangexxx() 함수
     combo box에서 항목 선택 변경이 일어났을 때 발생하는 메시지로
     On CbnSelChange()함수 호출. (List Box에서는 LBN_SELCHANGE 메시지)
   3.GetCurSel(): 마우스로 선택된 항목을 int형 index로 읽어옴.(0번부터 시작됨).

 -TODO
   1.Add variable시 category의 'controll'과 'value'의 의미를 명확히 파악하라
     control로 하면 variable type은 "CComboBox"
     variable로 하면 variable type은 "CString"
   2.ListBox에 문자열 출력하는 방법은 무엇인가.(AddString, InsertSting말고)