성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • MFC
  • WINAPI
  • ARM Reverse Engineering
  • Boot Code 분석
  • 문자열 나누기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

MFC

[MFC] List Control Editing ( 클릭시 수정 / 에디트박스로 출력 )

2014. 2. 21. 10:47

1. 리스트 컨트롤 변수, 위치기억 변수 생성
   - CListCtrl m_editListCtrl;
   - int iSavedItem, iSavedSubitem;
  
2. 에디트 컨트롤 생성
   - ID : IDC_EDIT_MODIFY
  
3. OnInitDialog에서 샘플 데이터를 넣어놓고, 2번에서 만든 에디트 컨트롤을 숨신다

BOOL CxxxxDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
 
  ..........................
  m_editListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

 m_editListCtrl.InsertColumn(0,  _T("FIELD1"),  LVCFMT_LEFT, 100);
 m_editListCtrl.InsertColumn(1,  _T("FIELD2"),  LVCFMT_LEFT, 100);
 m_editListCtrl.InsertColumn(2,  _T("FIELD3"),  LVCFMT_LEFT, 100);

 m_editListCtrl.InsertItem(0, _T("1111"));
 m_editListCtrl.SetItem(0, 1, LVIF_TEXT, _T("2222"), 0, NULL, NULL, NULL);
 m_editListCtrl.SetItem(0, 2, LVIF_TEXT, _T("3333"), 0, NULL, NULL, NULL);
 
 

}

4. 더블클릭시에
  1) 클릭한 위치가 리스트컨트롤에서 유효한 행, 열이면 에디트 박스를 위치시킨다
  2) subitem의 위치가 0번이면 따로 계산을 한다(전체행을 가리키는 위치가 나오므로)
 
void CxxxxDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMITEMACTIVATE pNMITEM = (LPNMITEMACTIVATE) pNMHDR;

 iSavedItem = pNMITEM->iItem;
 iSavedSubitem = pNMITEM->iSubItem;

 if(pNMITEM->iItem != -1)
 {
  CRect rect;

  if(pNMITEM->iSubItem == 0)
  {
   m_editListCtrl.GetItemRect(pNMITEM->iItem, rect, LVIR_BOUNDS);
   rect.right = rect.left + m_editListCtrl.GetColumnWidth(0);
  }
  else
  {
   m_editListCtrl.GetSubItemRect(pNMITEM->iItem, pNMITEM->iSubItem, LVIR_BOUNDS, rect);
  }

  m_editListCtrl.ClientToScreen(rect);
  this->ScreenToClient(rect);

  GetDlgItem(IDC_EDIT_MOD)->SetWindowText(m_editListCtrl.GetItemText(pNMITEM->iItem, pNMITEM->iSubItem));
  GetDlgItem(IDC_EDIT_MOD)->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW );
  GetDlgItem(IDC_EDIT_MOD)->SetFocus();
 }
 *pResult = 0;
}

5. 클릭시에는 위치만 기억해놓는다

void CxxxxDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMITEMACTIVATE pNMITEM = (LPNMITEMACTIVATE) pNMHDR;

 iSavedItem = iSavedSubitem = -1;
 GetDlgItem(IDC_EDIT_MOD)->SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW );

 if(pNMITEM->iItem != -1)
 {
  iSavedItem = pNMITEM->iItem;
  iSavedSubitem = pNMITEM->iSubItem;
 }
 *pResult = 0;
}

6. F2키를 누르면, 마지막에 선택되었던 위치의 행, 열 값을 수정한다

void CxxxxDlg::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);

 if(pLVKeyDow->wVKey == VK_F2)
 {
  if( iSavedItem != -1 )
  {
   CRect rect;

   if(iSavedSubitem == 0)
   {
    m_editListCtrl.GetItemRect(iSavedItem, rect, LVIR_BOUNDS);
    rect.right = rect.left + m_editListCtrl.GetColumnWidth(0);
   }
   else
   {
    m_editListCtrl.GetSubItemRect(iSavedItem, iSavedSubitem, LVIR_BOUNDS, rect);
   }

   m_editListCtrl.ClientToScreen(rect);
   this->ScreenToClient(rect);

   GetDlgItem(IDC_EDIT_MOD)->SetWindowText(m_editListCtrl.GetItemText(iSavedItem, iSavedSubitem));

   GetDlgItem(IDC_EDIT_MOD)->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW );
   GetDlgItem(IDC_EDIT_MOD)->SetFocus();
  }
 }
 *pResult = 0;
}

7. 에디트박스에서 엔터키를 누르면, 리스트컨트롤에 값을 적용한다

BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 if(pMsg->message == WM_KEYDOWN){
  if(pMsg->wParam == VK_RETURN){

   if(pMsg->hwnd == GetDlgItem(IDC_EDIT_MOD)->GetSafeHwnd())
   {
    CString str;
    GetDlgItemText(IDC_EDIT_MOD, str);
    m_editListCtrl.SetItemText(iSavedItem, iSavedSubitem, str);
   
    GetDlgItem(IDC_EDIT_MOD)->SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW );
   }

   return TRUE;
  }

  if(pMsg->wParam == VK_ESCAPE)
  {
   return TRUE;
  }
 }

 return CDialog::PreTranslateMessage(pMsg);
}

 

 

:> 유용하구만 이거 ㅎㅎ

저작자표시 (새창열림)

'MFC' 카테고리의 다른 글

[MFC] 2014.02.26 _ get(), getline() 함수 비교  (0) 2014.02.26
[MFC] 셋업파일 출력하기  (0) 2014.02.21
[MFC] List Control 에 List 더블클릭시 해당 칼럼 가져오기  (0) 2014.02.13
[MFC]MFC Yes/No 메시지 박스 선택 후 실행하기  (2) 2014.02.13
[MFC] OnInitDialog 추가하기 (다이얼로그 초기화)  (0) 2014.02.13
    'MFC' 카테고리의 다른 글
    • [MFC] 2014.02.26 _ get(), getline() 함수 비교
    • [MFC] 셋업파일 출력하기
    • [MFC] List Control 에 List 더블클릭시 해당 칼럼 가져오기
    • [MFC]MFC Yes/No 메시지 박스 선택 후 실행하기
    성엽이
    성엽이

    티스토리툴바