본문 바로가기
C & C++/MFC 컨트롤

[List] 리스트 컨트롤에 다른 컨트롤 넣기

by izen8 2011. 3. 27.
반응형

1.요약

특정 Column에서 다른 Control 을 띄우는 방법 설명.
여기서 사용한 방법은 현재 Cursor가 있는 위치를 파악한후 그 위치에 적당한 크기의 Edit Control를 생성 시킨다.


2.본문

1) CListCtrl를 상속받는 CMyList라는 Class를 만든다.
2) Member변수로 CEdit m_ctrEdit를 선언한다.
3) Member함수로 OnLButtonDown()과 GetSubItemFromPt(point, nItem, nSubItem, rcClient)를 선언
OnLButtonDown() : Edit Control를 생성/삭제 시키는 역할
GetSubItemFromPt(): 현재 Cursor가 있는 곳의 List정보를 가져온다.
4) 함수 내용을 구성한 후(예제 참조) 사용은
CListCtrl m_ctrList에서 CListCtrl ---> CMyList로 바꿔 주면 된다.

3.예제

실제로 클래스를 구성하면 다음과 같다.

class CMyList : public COXGridList
{
   // Construction
public:
   CMyList();
  
   // Attributes
public:
   CEdit m_ctrEdit;
  
   // Operations
public:
   void GetSubItemFromPt(CPoint point, int &nItem, int &nSubItem, CRect &rect);
  
   // Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CMyList)
   //}}AFX_VIRTUAL
  
   // Implementation
public:
   virtual ~CMyList();
  
   // Generated message map functions
protected:
   //{{AFX_MSG(CMyList)
   afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
   //}}AFX_MSG
  
   DECLARE_MESSAGE_MAP()
};

CMyList::CMyList()
{
}
CMyList::~CMyList()
{
}

BEGIN_MESSAGE_MAP(CMyList, COXGridList)
//{{AFX_MSG_MAP(CMyList)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyList message handlers
void CMyList::OnLButtonDown(UINT nFlags, CPoint point)
{
   int nItem, nSubItem;
   CRect rcClient;
  
   // 현재 Point의 영역 정보를 가져온다.
   GetSubItemFromPt(point, nItem, nSubItem, rcClient);
  
   // 두번째 SubItem일(두번째 Column) 경우에만 나타나게 함.
   if (nSubItem == 1)  
   {
       if (m_ctrTimeEdit.m_hWnd == NULL)
       {
           // Mask Edit Control 생성
           m_ctrEdit.Create  
               (WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_HSCROLL,
               CRect(0, 0, 30, 10), this, 1);
          
           m_ctrEdit.MoveWindow(rcClient);
           m_ctrEdit.ShowWindow(SW_SHOW);
          
       }
       else
       {
           m_ctrTimeEdit.MoveWindow(rcClient);
           m_ctrTimeEdit.ShowWindow(SW_SHOW);
       }
   }
   else
   {
       if (m_ctrTimeEdit.m_hWnd != NULL)
       {
           m_ctrTimeEdit.ShowWindow(SW_HIDE);
       }
   }
  
   CListCtrl::OnLButtonDown(nFlags, point);
}
void CMyList::GetSubItemFromPt(CPoint point, int &nItem, int &nSubItem, CRect &rect)
{
   LVHITTESTINFO lvhti;
  
   // Clear the subitem text the user clicked on.
   lvhti.pt = point;
   SubItemHitTest(&lvhti);
  
   nItem = lvhti.iItem;
   nSubItem = lvhti.iSubItem;
   GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rect);
}

4.참고

마우스를 더블 클릭하는 순간에 나타나게 하고 싶다면 마우스 더블 클릭 함수에서 구현해 주면 된다.

몇가지 함수만 추가하면 특정 Column에서만 Control이 나타나게 하는 것을 쉽게 구현 할 수 있을 것이다.


반응형

댓글