Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
4.1 KiB

// 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;
}