티스토리 뷰


이번에 하고자 하는 것은 ListControl에 특정한 칸을 더블 클릭하면

특정한 다이얼로그를 띄우는 것이다.

다이얼로그에는 이전에 만들었던 동적으로 그려지는 데이터이고..

이 다이얼로그에도 따로 timer가 들어가서 센서 데이터를 가져와서 뿌려주는 역할을 할 것이다.

ListControl의 property 창에서 메세지 명이 조금 독특하다..

HDN_ITEM_DBL_cLICK 메세지인줄 알았는데...

테스트해보니 이거는 리스트 컨트롤의 헤더에 해당하는 더블 클릭 이벤트를 캐치하는거고..

NM_DBL_CLICK 뭐 대충 이런 이름의 이벤트를 선택하면 된다..

함수를 생성하면 다음과 같은 프로토 타입이 생긴다..

void CSensorMonitoringDlg::OnNMDblclkSensorlist(NMHDR *pNMHDR, LRESULT *pResult)
{
//TODO : 어쩌고
 *pResult = 0;
}

그럼 여기서 어떠한 아이템이 선택 되었는지 어떻게 알아낼까...

방법은 두가지이다..

POSITION pos = m_ctlList.GetFirstSelectedItemPosition();


이란 함수와

LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

int row = pNMIA->iitem;
int col = pNMIA->iSubItem;

이란 방법이 있다..뭐, 더블클릭 이벤트 함수 안에서 아래쪽에 있는 것이 더 편할 것 같다..

그럼 새로운 창 띄우는거는 어떻게 할까...

그냥 local variable로 선언하면 창이 그 함수를 빠져 나오면서 닫히게 된다...

그러므로 동적 할당으로 배열에 추가해 놓고 필요할 때 수정하는 방식으로 하자...

CArray<CGraphDialog*> m_arrpGraphDlg 변수를 추가하고

::OnDestroy에서 메모리 해제하는 부분도 미리 추가하자..생성하면서 메모리 해제도 미리 짜는건 나중에 귀차니즘을 방지할 수 있는 좋은 습관이다..

 for(int loop = 0 ; loop < this->m_arrpGraphDialog.GetSize() ; loop++)
 {
  this->m_arrpGraphDialog.GetAt(loop)->DestroyWindow();
  delete this->m_arrpGraphDialog.GetAt(loop);
 }

그럼 이제 더블클릭 이벤트로 생성된 함수 안에서 다이얼로그를 생성하자..


void CSensorMonitoringDlg::OnNMDblclkSensorlist(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMITEMACTIVATE pnmia = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);


 if(pnmia->iItem >= 0)
 {
  CGraphDialog* pGraphDlg = new CGraphDialog();

  pGraphDlg->m_nSensorDataIndex = pnmia->iItem;
  pGraphDlg->Create(CGraphDialog::IDD , this);
  pGraphDlg->ShowWindow(SW_SHOW);

  this->m_arrpGraphDialog.Add(pGraphDlg);
 }
 *pResult = 0;
}

결과적으로는 이렇게 되었다..

pnmia->iItem가 -1이 될 경우에는 어떠한 선택된 아이템 없이 더블클릭 된 것이니까 특정한 리스트가 클릭 되었을 때에만 추가하면 된다.

Create함수의 경우는 첫번째가 참조할 resource id로 resource에서 생성한 IDD_???를 넣어도 되고 위와 같이 다이얼로그에 해당하는 클래스를 생성한 경우 Dlg::IDD 로 얻어올 수 있다. IDD로 얻어오는 것이 좀더 멋져 보이기도 하고;; ID가 수정 될 경우를 대비해서 매번 수정안해줘도 된다는 편리함이 있다. 두번째 인자는 parent를 설정하는 것으로 일단은 parent가 닫히면 같이 닫히는 정도로 이해해도 될 것이다.

그리고 ShowWindow함수를 통해서 윈도우를 보여주게 되는 것이고, 아까 생성한 배열에 이 다이얼로그의 포인터를 추가해서 메모리 해제도 편리하게 해줄 수 있도록 하는 것이다. 그럼 테스트를 해보자!

사용자 삽입 이미지

더블클릭하니 잘 뜬다! 이제 할거는 자식창과 부모창 사이의 통신을 통해서 그래프 등의 정보를 넣는것! 뭐, 그런거는 포인터의 함수를 통해서 쉽게 할 수 있을 거라 생각한다..










 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
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 28 29 30
31
글 보관함