#include "InPlaceEdit.h" CInPlaceEdit::CInPlaceEdit(int iItem, int iSubItem, CString sInitText) :m_sInitText( sInitText ) { m_iItem = iItem; m_iSubItem = iSubItem; m_bESC = FALSE; } CInPlaceEdit::~CInPlaceEdit() { } BEGIN_MESSAGE_MAP(CInPlaceEdit, CEdit) //{{AFX_MSG_MAP(CInPlaceEdit) ON_WM_KILLFOCUS() ON_WM_NCDESTROY() ON_WM_CHAR() ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CInPlaceEdit::PreTranslateMessage(MSG* pMsg) { 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; } } return CEdit::PreTranslateMessage(pMsg); } void CInPlaceEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); CString str; GetWindowText(str); 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); GetParent()->SendMessage(END_EDIT, m_iItem, (LPARAM)str.GetBuffer(0)); DestroyWindow(); } void CInPlaceEdit::OnNcDestroy() { CEdit::OnNcDestroy(); delete this; } void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if(nChar == VK_ESCAPE || nChar == VK_RETURN) { if(nChar == VK_ESCAPE) m_bESC = TRUE; GetParent()->SetFocus(); return; } CEdit::OnChar(nChar, nRepCnt, nFlags); 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; CRect rect, parentrect; GetClientRect(&rect); GetParent()->GetClientRect(&parentrect); ClientToScreen(&rect); GetParent()->ScreenToClient(&rect); 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); } } int CInPlaceEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CEdit::OnCreate(lpCreateStruct) == -1) return -1; CFont* font = GetParent()->GetFont(); SetFont(font); SetWindowText(m_sInitText); SetFocus(); SetSel(0, -1); return 0; }