// PropertyGridInPlaceEdit.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "PropertyGridInPlaceEdit.h" // CPropertyGridInPlaceEdit IMPLEMENT_DYNAMIC(CPropertyGridInPlaceEdit, CEdit) CPropertyGridInPlaceEdit::CPropertyGridInPlaceEdit(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID, CString sInitText) { m_sInitText = sInitText; m_bExitOnArrows = FALSE; m_Rect = rect; // For bizarre CE bug. DWORD dwEditStyle = /*WS_BORDER|*/WS_CHILD|/*WS_VISIBLE|*/ES_AUTOHSCROLL|dwStyle; if (!Create(dwEditStyle, rect, pParent, nID)) return; m_clrBack = GetSysColor(COLOR_WINDOW); m_clrText = GetSysColor(COLOR_WINDOWTEXT); m_Brush.CreateSolidBrush(m_clrBack); SetFont(pParent->GetFont()); SetWindowText(m_sInitText); SetFocus(); SetSel(0, -1); SetSel(-1, 0); } CPropertyGridInPlaceEdit::~CPropertyGridInPlaceEdit() { } void CPropertyGridInPlaceEdit::SetColors(COLORREF clrBack, COLORREF clrText) { m_clrBack = clrBack; m_clrText = clrText; m_Brush.DeleteObject(); m_Brush.CreateSolidBrush(m_clrBack); } BEGIN_MESSAGE_MAP(CPropertyGridInPlaceEdit, CEdit) //{{AFX_MSG_MAP(CPropertyGridInPlaceEdit) ON_WM_KILLFOCUS() ON_WM_CHAR() ON_WM_KEYDOWN() ON_WM_GETDLGCODE() ON_WM_CREATE() ON_WM_CTLCOLOR_REFLECT( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() // CPropertyGridInPlaceEdit ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù. void CPropertyGridInPlaceEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if ((nChar == VK_PRIOR || nChar == VK_NEXT || nChar == VK_DOWN || nChar == VK_UP || nChar == VK_RIGHT || nChar == VK_LEFT) && (m_bExitOnArrows || GetKeyState(VK_CONTROL) < 0)) { GetParent()->SetFocus(); return; } CEdit::OnKeyDown(nChar, nRepCnt, nFlags); } // As soon as this edit loses focus, kill it. void CPropertyGridInPlaceEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); EndEdit(); } void CPropertyGridInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB || nChar == VK_RETURN) { GetParent()->SetFocus(); // This will destroy this window return; } if (nChar == VK_ESCAPE) { CancelEdit(); return; } CEdit::OnChar(nChar, nRepCnt, nFlags); //// Resize edit control if needed // //// Get text extent //CString str; //GetWindowText( str ); //// add some extra buffer //str += _T(" "); // //CWindowDC dc(this); //CFont *pFontDC = dc.SelectObject(GetFont()); //CSize size = dc.GetTextExtent( str ); //dc.SelectObject( pFontDC ); // //// Get client rect //CRect ParentRect; //GetParent()->GetClientRect( &ParentRect ); // //// Check whether control needs to be resized //// and whether there is space to grow //if (size.cx > m_Rect.Width()) //{ // if( size.cx + m_Rect.left < ParentRect.right ) // m_Rect.right = m_Rect.left + size.cx; // else // m_Rect.right = ParentRect.right; // MoveWindow( &m_Rect ); //} } UINT CPropertyGridInPlaceEdit::OnGetDlgCode() { return DLGC_WANTALLKEYS; } //////////////////////////////////////////////////////////////////////////// // CPropertyGridInPlaceEdit overrides // Stoopid win95 accelerator key problem workaround - Matt Weagle. BOOL CPropertyGridInPlaceEdit::PreTranslateMessage(MSG* pMsg) { // Catch the Alt key so we don't choke if focus is going to an owner drawn button if (pMsg->message == WM_SYSCHAR) return TRUE; return CEdit::PreTranslateMessage(pMsg); } //////////////////////////////////////////////////////////////////////////// // CPropertyGridInPlaceEdit implementation void CPropertyGridInPlaceEdit::CancelEdit() { // restore previous text if (IsWindow(GetSafeHwnd())) { SetWindowText(m_sInitText); SendMessage(WM_CLOSE, 0, 0); } } void CPropertyGridInPlaceEdit::EndEdit() { CString str; // EFW - BUG FIX - Clicking on a grid scroll bar in a derived class // that validates input can cause this to get called multiple times // causing assertions because the edit control goes away the first time. static BOOL bAlreadyEnding = FALSE; if(bAlreadyEnding) return; bAlreadyEnding = TRUE; GetWindowText(str); CWnd* pOwner = GetOwner(); if (pOwner) pOwner->SendMessage(WM_PG_ENDLABELEDIT, (WPARAM) LPCTSTR(str), NULL ); // Close this window (PostNcDestroy will delete this) if (IsWindow(GetSafeHwnd())) SendMessage(WM_CLOSE, 0, 0); bAlreadyEnding = FALSE; } HBRUSH CPropertyGridInPlaceEdit::CtlColor ( CDC* pDC, UINT nCtlColor ) { pDC->SetTextColor(m_clrText); pDC->SetBkColor(m_clrBack); return m_Brush; }