// InPlaceEdit.cpp : implementation file // #include "stdafx.h" #include "InPlace.h" #include "cpanel.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAX_STR_LEN 255 extern HWND hAdvListCtrl; ///////////////////////////////////////////////////////////////////////////// // CInPlaceEdit CInPlaceEdit::CInPlaceEdit(BYTE iItem, BYTE iSubItem):m_iItem(iItem),m_iSubItem(iSubItem) //,m_bESC(FALSE),m_sInitText(sInitText) { m_iItem = iItem; m_iSubItem = iSubItem; m_bESC = FALSE; // _tcscpy(m_sInitText, sInitText); } CInPlaceEdit::~CInPlaceEdit() { } BEGIN_MESSAGE_MAP(CInPlaceEdit, CEdit) //{{AFX_MSG_MAP(CInPlaceEdit) ON_WM_KILLFOCUS() ON_WM_CHAR() ON_WM_CREATE() ON_WM_MOUSEWHEEL() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInPlaceEdit message handlers /* 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; // DO NOT process further } } return CEdit::PreTranslateMessage(pMsg); } */ BOOL CInPlaceEdit::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { OnKillFocus(this); return TRUE; } void CInPlaceEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); if (LineLength()) { ::GetWindowText(this->GetSafeHwnd(), m_sInitText, MAX_STR_LEN); // No point sending the message if the text hasn't changed! // OR if there's nothing to add! // Send Notification to parent of ListView ctrl LV_DISPINFO *lpDispinfo = new (LV_DISPINFO); ASSERT (lpDispinfo); lpDispinfo->hdr.hwndFrom = GetParent()->m_hWnd; lpDispinfo->hdr.idFrom = GetDlgCtrlID(); lpDispinfo->hdr.code = LVN_ENDLABELEDIT; lpDispinfo->item.mask = LVIF_TEXT; lpDispinfo->item.iItem = m_iItem; lpDispinfo->item.iSubItem = m_iSubItem; lpDispinfo->item.pszText = m_bESC ? NULL : m_sInitText; lpDispinfo->item.cchTextMax = MAX_STR_LEN; GetParent()->GetParent()->SendMessage( WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM)lpDispinfo ); if (lpDispinfo) delete (lpDispinfo); } if (m_sInitText) delete[] (m_sInitText); PostMessage(WM_CLOSE); } void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CEdit::OnChar(nChar, nRepCnt, nFlags); // Get text extent BYTE nLen = (BYTE)SendMessage(LB_GETTEXTLEN, (WPARAM)0, 0); if (nLen == 255) return; LPTSTR lpStr = new (TCHAR[nLen+1]); ASSERT (lpStr); SendMessage(LB_GETTEXT, (WPARAM)0, (LPARAM)(LPCTSTR)lpStr); // Resize edit control if needed HDC hDC = this->GetDC()->m_hDC; SIZE size; ::GetTextExtentPoint(hDC, lpStr, nLen+1, &size); ::ReleaseDC(this->m_hWnd, hDC); if (lpStr) delete[] (lpStr); size.cx += 5; // add some extra buffer // Get client rect RECT 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.right-rect.left) ) { rect.right = ( size.cx + rect.left < parentrect.right ) ? rect.left + size.cx : parentrect.right; MoveWindow( &rect ); } } int CInPlaceEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CEdit::OnCreate(lpCreateStruct) == -1) return -1; // Allocate the string buffer m_sInitText = new (TCHAR[MAX_STR_LEN+1]); ASSERT (m_sInitText); GetItemText(hAdvListCtrl, m_iItem, m_iSubItem, m_sInitText, MAX_STR_LEN); // Set the proper font // If you don't, the font is a bold version of the dialog font! ::SendMessage(this->m_hWnd, WM_SETFONT, ::SendMessage(::GetParent(this->m_hWnd), WM_GETFONT, 0, 0), 0); SendMessage(WM_SETTEXT, 0, (LPARAM)(LPCTSTR)m_sInitText); SetFocus(); SendMessage(EM_SETSEL, (WPARAM)0, (LPARAM)-1); SendMessage(EM_LIMITTEXT, (WPARAM)MAX_STR_LEN, 0); return 0; }