반응형
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()
};
{
// 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
// 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);
}
{
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);
}
{
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이 나타나게 하는 것을 쉽게 구현 할 수 있을 것이다.
반응형
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Tree] CTreeCtrl 에 디렉토리 표시하기 (0) | 2011.03.29 |
---|---|
[MessageBox] 메시지 상자 사용법 (0) | 2011.03.27 |
[Tip] Winamp 처럼 TaskBar와 SystemTray 가지고 놀기 (0) | 2011.03.27 |
[공통] 컨트롤에 ToolTip 넣기 (0) | 2011.03.27 |
[Edit] 한글입력을 받고싶지 않을때 (0) | 2011.03.27 |
댓글