www.pudn.com > SNMP_vc.rar > ListCellEdit.cpp


// ListCellEdit.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "ListCellEdit.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CListCellEdit 
 
CListCellEdit::	CListCellEdit(int nItem, int nSubItem, CString strInitText) 
:m_bEscape (FALSE) 
{ 
    m_nItem = nItem; 
    m_nSubItem = nSubItem; 
    m_strInitText = strInitText; 
} 
 
CListCellEdit::~CListCellEdit() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CListCellEdit, CEdit) 
	//{{AFX_MSG_MAP(CListCellEdit) 
	ON_WM_KILLFOCUS() 
	ON_WM_NCDESTROY() 
	ON_WM_CHAR() 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CListCellEdit message handlers 
 
void CListCellEdit::OnKillFocus(CWnd* pNewWnd)  
{ 
	CEdit::OnKillFocus(pNewWnd); 
	 
	// TODO: Add your message handler code here 
	SetListItemText(); 
 
    DestroyWindow(); 
} 
 
void CListCellEdit::OnNcDestroy()  
{ 
	CEdit::OnNcDestroy(); 
	 
	// TODO: Add your message handler code here 
    delete this; 
} 
 
BOOL CListCellEdit::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 
			|| pMsg->wParam == VK_DELETE 
			|| pMsg->wParam == VK_ESCAPE 
			|| GetKeyState( VK_CONTROL) 
			) 
		{ 
			::TranslateMessage(pMsg); 
			::DispatchMessage(pMsg); 
			return TRUE;		    	// DO NOT process further 
		} 
	} 
	 
	return CEdit::PreTranslateMessage(pMsg); 
} 
 
void CListCellEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if( nChar == VK_ESCAPE || nChar == VK_RETURN) 
	{ 
		if( nChar == VK_ESCAPE ) 
			m_bEscape = TRUE; 
		GetParent()->SetFocus(); 
 
		return; 
	} 
 
	// Resize edit control if needed 
	// Get text extent 
	CString str; 
 
	GetWindowText( str ); 
	CWindowDC dc(this); 
	CFont *pFont = GetParent()->GetFont(); 
	CFont *pFontDC = dc.SelectObject( pFont ); 
	CSize size = dc.GetTextExtent( str ); 
	dc.SelectObject( pFontDC ); 
	size.cx += 5;			   	// add some extra buffer 
 
	// Get client rect 
	CRect rect, parentrect; 
	GetClientRect( &rect ); 
	GetParent()->GetClientRect( &parentrect ); 
 
	// Transform rect to parent coordinates 
	ClientToScreen( &rect ); 
	GetParent()->ScreenToClient( &rect ); 
 
	// Check whether control needs to be resized 
	// and whether there is space to grow 
	if( size.cx > rect.Width() ) 
	{ 
		if( size.cx + rect.left < parentrect.right ) 
			rect.right = rect.left + size.cx; 
		else 
			rect.right = parentrect.right; 
		MoveWindow( &rect ); 
	} 
	 
	CEdit::OnChar(nChar, nRepCnt, nFlags); 
} 
 
int CListCellEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CEdit::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	// Set the proper font 
	CFont* font = GetParent()->GetFont(); 
	SetFont(font); 
 
	SetWindowText( m_strInitText ); 
	SetFocus(); 
	SetSel( 0, -1 ); 
	 
	return 0; 
} 
 
void CListCellEdit::SetListItemText() 
{ 
    CString Text; 
    GetWindowText (Text); 
	return; 
	//AfxMessageBox("SetListItemText = "+ Text); 
    // Send Notification to parent of ListView ctrl 
    LV_DISPINFO dispinfo; 
    dispinfo.hdr.hwndFrom = GetParent()->m_hWnd; 
    dispinfo.hdr.idFrom = GetDlgCtrlID(); 
    dispinfo.hdr.code = LVN_ENDLABELEDIT; 
 
    dispinfo.item.mask = LVIF_TEXT; 
    dispinfo.item.iItem = m_nItem; 
    dispinfo.item.iSubItem = m_nSubItem; 
    dispinfo.item.pszText = m_bEscape ? NULL : LPTSTR ((LPCTSTR) Text); 
    dispinfo.item.cchTextMax = Text.GetLength(); 
 
    GetParent()->GetParent()->SendMessage (WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM) &dispinfo); 
}