InPlaceEdit.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:3k
- // InPlaceEdit.cpp : implementation file
- //
- // Zafir Anjum
- #include "stdafx.h"
- #include "InPlaceEdit.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CInPlaceEdit
- 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()
- /////////////////////////////////////////////////////////////////////////////
- // 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);
- }
- void CInPlaceEdit::OnKillFocus(CWnd* pNewWnd)
- {
- CEdit::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 );
- 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);
- // 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 );
- }
- }
- int CInPlaceEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CEdit::OnCreate(lpCreateStruct) == -1)
- return -1;
- // Set the proper font
- CFont* font = GetParent()->GetFont();
- SetFont(font);
- SetWindowText( m_sInitText );
- SetFocus();
- SetSel( 0, -1 );
- return 0;
- }