// InPlaceList.cpp : implementation file // #include "InPlaceList.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CInPlaceList CInPlaceList::CInPlaceList(int iItem, int iSubItem, CStringList *plstItems, int nSel) { m_iItem = iItem; m_iSubItem = iSubItem; m_lstItems.AddTail( plstItems ); m_nSel = nSel; m_bESC = FALSE; } CInPlaceList::~CInPlaceList() { } BEGIN_MESSAGE_MAP(CInPlaceList, CComboBox) //{{AFX_MSG_MAP(CInPlaceList) ON_WM_CREATE() ON_WM_KILLFOCUS() ON_WM_CHAR() ON_WM_NCDESTROY() ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInPlaceList message handlers int CInPlaceList::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CComboBox::OnCreate(lpCreateStruct) == -1) return -1; // Set the proper font CFont* font = GetParent()->GetFont(); SetFont(font); for( POSITION pos = m_lstItems.GetHeadPosition(); pos != NULL; ) { AddString( (LPCTSTR) (m_lstItems.GetNext( pos )) ); } SetCurSel( m_nSel ); SetFocus(); return 0; } BOOL CInPlaceList::PreTranslateMessage(MSG* pMsg) { if( pMsg->message == WM_KEYDOWN ) { if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE ) { ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; // DO NOT process further } } return CComboBox::PreTranslateMessage(pMsg); } void CInPlaceList::OnKillFocus(CWnd* pNewWnd) { CComboBox::OnKillFocus(pNewWnd); CString str; GetWindowText(str); // 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_iItem; dispinfo.item.iSubItem = m_iSubItem; dispinfo.item.pszText = m_bESC ? NULL : LPTSTR((LPCTSTR)str); dispinfo.item.cchTextMax = str.GetLength(); GetParent()->GetParent()->SendMessage( WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM)&dispinfo ); PostMessage( WM_CLOSE ); } void CInPlaceList::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if( nChar == VK_ESCAPE || nChar == VK_RETURN) { if( nChar == VK_ESCAPE ) m_bESC = TRUE; GetParent()->SetFocus(); return; } CComboBox::OnChar(nChar, nRepCnt, nFlags); } void CInPlaceList::OnNcDestroy() { CComboBox::OnNcDestroy(); delete this; } void CInPlaceList::OnCloseup() { GetParent()->SetFocus(); }