#include "stdafx.h" #include // WM_IDLEUPDATECMDUI definition #include "InPlaceCtrls.h" // Registered messages static unsigned int const CT_IPCMsg = RegisterWindowMessage(IPCMSGSTRING); #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////////// // CInPlaceEdit class // ////////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP( CInPlaceEdit, CEdit ) //{{AFX_MSG_MAP(CInPlaceEdit) ON_WM_CREATE() ON_WM_KILLFOCUS() ON_CONTROL_REFLECT(EN_CHANGE, OnChange) ON_WM_CHAR() //}}AFX_MSG_MAP END_MESSAGE_MAP() IMPLEMENT_DYNCREATE( CInPlaceEdit, CEdit ) CInPlaceEdit::CInPlaceEdit() { m_hParent = NULL; m_bIsNum = FALSE; m_bReal = FALSE; } // CInPlaceEdit::CInPlaceEdit CInPlaceEdit::~CInPlaceEdit() { } // CInPlaceEdit::~CInPlaceEdit void CInPlaceEdit::CreateCtrl(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent, CString sValue, BOOL bIsNum, BOOL bReal) { CInPlaceEdit* pEdit; rect.bottom -= 1; rect.left += 4; if(pWndCtrl != NULL && pWndCtrl->IsKindOf(RUNTIME_CLASS(CInPlaceEdit))) { pEdit = (CInPlaceEdit*)pWndCtrl; pEdit->SetReal(bReal); if( bIsNum && pEdit->IsNum() || !bIsNum && !pEdit->IsNum() ) { pWndCtrl->SetWindowText(sValue); pWndCtrl->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); ((CInPlaceEdit*)pWndCtrl)->SetSel(0, -1); return; } } if(pWndCtrl != NULL) delete pWndCtrl; pEdit = new CInPlaceEdit();//| ES_MULTILINE DWORD dStyle = WS_VISIBLE | WS_CHILD | ES_WANTRETURN | ES_NOHIDESEL | ES_AUTOHSCROLL ;//| WS_BORDER; if( bIsNum ) dStyle |= ES_NUMBER; pEdit->Create( dStyle, rect, pWndParent, 0);//| WS_CHILD | ES_AUTOHSCROLL | pEdit->SetNum(bIsNum); pEdit->SetReal(bReal); pEdit->SetWindowText(sValue); pEdit->SetSel(0, -1); pWndCtrl = pEdit; } void CInPlaceEdit::CreateCtrl1(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent, CString sValue, BOOL bNum, BOOL bReal) { rect.DeflateRect(3, 2, 1, 0); CInPlaceEdit* pEdit; if(pWndCtrl != NULL && pWndCtrl->IsKindOf(RUNTIME_CLASS(CInPlaceEdit))) { pEdit = (CInPlaceEdit*)pWndCtrl; pEdit->SetReal(bReal); if( bNum && pEdit->IsNum() || !bNum && !pEdit->IsNum() ) { pWndCtrl->SetWindowText(sValue); pWndCtrl->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); pEdit->SetSel(0, -1); return; } } if(pWndCtrl != NULL) delete pWndCtrl; pEdit = new CInPlaceEdit(); DWORD dStyle = WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL; if( bNum ) dStyle |= ES_NUMBER; pEdit->Create(dStyle, rect, pWndParent, 0); pEdit->SetNum(bNum); pEdit->SetReal(bReal); pEdit->SetWindowText(sValue); pEdit->SetSel(0, -1); pWndCtrl = pEdit; } int CInPlaceEdit::OnCreate( LPCREATESTRUCT lpCreateStruct ) { if ( CEdit::OnCreate(lpCreateStruct) == -1 ) { return -1; } SetFont(GetParent()->GetFont()); m_hParent = lpCreateStruct->hwndParent; return 0; } // CInPlaceEdit::OnCreate void CInPlaceEdit::OnChange() { GetParent()->SendMessage(WM_USER_CHILDVALUECHANGED, 0, 0); } BOOL CInPlaceEdit::PreTranslateMessage( MSG *pMsg ) { IPCENDINFO ipeEditInfo; switch ( pMsg->message ) { case WM_KEYDOWN: if ( (int)pMsg->wParam == VK_ESCAPE || (int)pMsg->wParam == VK_RETURN || (int)pMsg->wParam == VK_TAB || (int)pMsg->wParam == VK_UP || (int)pMsg->wParam == VK_DOWN ) { ZeroMemory( &ipeEditInfo, sizeof( ipeEditInfo ) ); ipeEditInfo.hwndSrc = m_hWnd; ipeEditInfo.uKind = IPEK_KEY; ipeEditInfo.nVirtKey = (int)pMsg->wParam; ipeEditInfo.pt = pMsg->pt; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipeEditInfo ); return TRUE; } break; } return CEdit::PreTranslateMessage(pMsg); } // CInPlaceEdit::PreTranslateMessage void CInPlaceEdit::OnKillFocus( CWnd *pNewWnd ) { // If the window is still visible, signal the parent CEdit::OnKillFocus( pNewWnd ); GetParent()->SendMessage(WM_USER_CHILDVALUECHANGED, 0, 1); if( pNewWnd && (pNewWnd->IsKindOf(RUNTIME_CLASS(CInPlaceButton)) || pNewWnd->GetParent() == this->GetParent() || pNewWnd == this->GetParent() || (pNewWnd->IsKindOf(RUNTIME_CLASS(CSpinButtonCtrl)) && ((CSpinButtonCtrl*)pNewWnd)->GetBuddy() == this)) ) return; IPCENDINFO ipeEditInfo; ZeroMemory( &ipeEditInfo, sizeof( ipeEditInfo ) ); if( pNewWnd ) { ipeEditInfo.hNewWnd = pNewWnd->m_hWnd; } else ipeEditInfo.hNewWnd = NULL; ipeEditInfo.hwndSrc = m_hWnd; ipeEditInfo.uKind = IPEK_KILLFOUCE; ipeEditInfo.nVirtKey = 0; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipeEditInfo ); } // CInPlaceEdit::OnKillFocus void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if(m_bReal) { int iSt, iEd; CString sText; GetWindowText(sText); GetSel(iSt, iEd); sText = sText.Left(iSt) + sText.Mid(iEd); if(sText.IsEmpty()) sText = _T("A"); CPoint point = GetCaretPos(); if(!isprint(nChar) || isdigit(nChar) && (point.x < 1 && sText[0] != '+' && sText[0] != '-' || point.x > 1) || nChar == '.' && sText.Find('.') < 0 && (point.x < 1 && sText[0] != '+' && sText[0] != '-' || point.x > 1) || (nChar == '+' || nChar == '-') && point.x < 1 && sText[0] != '+' && sText[0] != '-') CEdit ::OnChar(nChar, nRepCnt, nFlags); } else CEdit ::OnChar(nChar, nRepCnt, nFlags); } ////////////////////////////////////////////////////////////////////////////// // CInPlaceButton class // ////////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP( CInPlaceButton, CButton ) //{{AFX_MSG_MAP(CInPlaceButton) ON_WM_CREATE() ON_WM_KILLFOCUS() ON_CONTROL_REFLECT(BN_CLICKED, OnClick) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() IMPLEMENT_DYNCREATE( CInPlaceButton, CButton ) CInPlaceButton::CInPlaceButton() { m_bMouseUp = TRUE; m_hParent = NULL; m_bInAction = FALSE; } // CInPlaceButton::CInPlaceButton CInPlaceButton::~CInPlaceButton() { } // CInPlaceButton::~CInPlaceButton void CInPlaceButton::CreateCtrl(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent, CString sValue) { rect.left = rect.right - rect.Height(); if(pWndCtrl != NULL && pWndCtrl->IsKindOf(RUNTIME_CLASS(CInPlaceButton))) { pWndCtrl->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); return; } if(pWndCtrl != NULL) delete pWndCtrl; CInPlaceButton* pButton = new CInPlaceButton(); pButton->Create(_T("..."), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW, rect, pWndParent, 0);//BS_OWNERDRAW pWndCtrl = pButton; } void CInPlaceButton::CreateCtrl1(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent) { if (rect.Width() > rect.Height() + 4) rect.left = rect.right - rect.Height(); else { rect.left += 4; rect.right = rect.left + rect.Height(); } rect.InflateRect(2, 1, 0, 1); if(pWndCtrl != NULL) { pWndCtrl->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); pWndCtrl->Invalidate(); return; } if(pWndCtrl != NULL) delete pWndCtrl; CInPlaceButton* pButton = new CInPlaceButton(); pButton->Create(_T("..."), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW, rect, pWndParent, 0); pWndCtrl = pButton; } int CInPlaceButton::OnCreate( LPCREATESTRUCT lpCreateStruct ) { if ( CButton::OnCreate(lpCreateStruct) == -1 ) { return -1; } SetFont(GetParent()->GetFont()); m_hParent = lpCreateStruct->hwndParent; return 0; } // CInPlaceButton::OnCreate void CInPlaceButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC dc; dc.Attach(lpDrawItemStruct->hDC); CRect rect; GetClientRect(rect); CString sText; GetWindowText(sText); dc.DrawText(sText, rect, DT_SINGLELINE|DT_VCENTER); dc.DrawEdge(rect, m_bMouseUp ? EDGE_RAISED : EDGE_SUNKEN, BF_RECT); } BOOL CInPlaceButton::PreTranslateMessage( MSG *pMsg ) { IPCENDINFO ipcInfo; switch ( pMsg->message ) { case WM_KEYDOWN: if ( (int)pMsg->wParam == VK_ESCAPE || (int)pMsg->wParam == VK_TAB ) { ZeroMemory( &ipcInfo, sizeof( ipcInfo ) ); ipcInfo.hwndSrc = m_hWnd; ipcInfo.uKind = IPEK_KEY; ipcInfo.nVirtKey = (int)pMsg->wParam; ipcInfo.pt = pMsg->pt; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipcInfo ); return TRUE; } break; } return CButton::PreTranslateMessage(pMsg); } // CInPlaceButton::PreTranslateMessage void CInPlaceButton::OnKillFocus( CWnd *pNewWnd ) { // If the window is still visible, signal the parent CButton::OnKillFocus( pNewWnd ); if(pNewWnd && (pNewWnd == this->GetParent() || pNewWnd->GetParent() == this->GetParent())) return; IPCENDINFO ipeEditInfo; ZeroMemory( &ipeEditInfo, sizeof( ipeEditInfo ) ); if( pNewWnd ) ipeEditInfo.hNewWnd = pNewWnd->m_hWnd; else ipeEditInfo.hNewWnd = NULL; ipeEditInfo.hwndSrc = m_hWnd; ipeEditInfo.uKind = IPEK_KILLFOUCE; ipeEditInfo.nVirtKey = 0; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipeEditInfo ); } // CInPlaceButton::OnKillFocus void CInPlaceButton::OnLButtonDown(UINT nFlags, CPoint point) { CButton::OnLButtonDown(nFlags, point); m_bMouseUp = FALSE; Invalidate(); } void CInPlaceButton::OnLButtonUp(UINT nFlags, CPoint point) { CButton::OnLButtonUp(nFlags, point); m_bMouseUp = TRUE; Invalidate(); } void CInPlaceButton::OnClick() { GetParent()->SendMessage(WM_USER_CHILDVALUECHANGED, 2, 0); IPCENDINFO ipcEventInfo; TRACE( "IPB: BN_CLICK\n" ); ZeroMemory( &ipcEventInfo, sizeof( ipcEventInfo ) ); ipcEventInfo.uKind = IPEK_ACTION; ipcEventInfo.uID = GetWindowLong( m_hWnd, GWL_ID ); ipcEventInfo.pt.x = LOWORD( GetMessagePos() ); ipcEventInfo.pt.y = HIWORD( GetMessagePos() ); m_bInAction = TRUE; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipcEventInfo ); m_bInAction = FALSE; } // CInPlaceButton::OnClick ////////////////////////////////////////////////////////////////////////// // CInPlaceComboBox // ////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE( CInPlaceComboBox, CComboBox ) CInPlaceComboBox::CInPlaceComboBox() { m_bDrop = FALSE; m_bList = FALSE; m_rect = CRect(0, 0, 0, 0); } CInPlaceComboBox::~CInPlaceComboBox() { } BEGIN_MESSAGE_MAP(CInPlaceComboBox, CComboBox) //{{AFX_MSG_MAP(CInPlaceComboBox) ON_WM_CREATE() ON_WM_KILLFOCUS() ON_WM_PAINT() ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown) ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup) ON_CONTROL_REFLECT(CBN_SELENDOK, OnSelendok) ON_CONTROL_REFLECT(CBN_EDITCHANGE, OnEditchange) ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInPlaceComboBox message handlers BOOL CInPlaceComboBox::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class IPCENDINFO ipcInfo; switch ( pMsg->message ) { case WM_KEYDOWN: if ( (int)pMsg->wParam == VK_ESCAPE || (int)pMsg->wParam == VK_RETURN || (int)pMsg->wParam == VK_TAB ) { ZeroMemory( &ipcInfo, sizeof( ipcInfo ) ); ipcInfo.hwndSrc = m_hWnd; ipcInfo.uKind = IPEK_KEY; ipcInfo.nVirtKey = (int)pMsg->wParam; ipcInfo.pt = pMsg->pt; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipcInfo ); return TRUE; } break; } return CComboBox::PreTranslateMessage(pMsg); } void CInPlaceComboBox::CreateCtrl(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent, CString sValue, CStringArray &strArr, UINT nHeight, BOOL bList) { int iIndex; rect.InflateRect(0, 2, 0, 0); CRect rcTemp = rect; rcTemp.bottom += nHeight; CInPlaceComboBox* pCombo; rcTemp.top--; if(pWndCtrl != NULL && pWndCtrl->IsKindOf(RUNTIME_CLASS(CInPlaceComboBox))) { pCombo = (CInPlaceComboBox*)pWndCtrl; if(bList && pCombo->IsList() || !bList && !pCombo->IsList()) { pCombo->ResetContent(); if( &strArr != NULL ) { for(int i = 0; i < strArr.GetSize(); i++) { pCombo->AddString(strArr[i]); } } //if( !sValue.IsEmpty() ) //{ if((iIndex = pCombo->FindStringExact( -1, sValue )) < 0 && !sValue.IsEmpty()) { pCombo->InsertString( 0, sValue ); iIndex = 0; } //} //else // iIndex = 0; pCombo->SetCurSel( iIndex ); if(!bList) pCombo->SetEditSel(-1, 0); pWndCtrl->SetWindowPos(NULL, rcTemp.left, rcTemp.top, rcTemp.Width(), rcTemp.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); pWndParent->ClientToScreen(rect); pCombo->ScreenToClient(rect); pCombo->SetFrameRect(rect, bList); return; } } if(pWndCtrl != NULL) delete pWndCtrl; DWORD dwStyle = WS_VISIBLE | WS_CHILD | CBS_AUTOHSCROLL | WS_VSCROLL ; if(bList) dwStyle |= CBS_DROPDOWNLIST; else dwStyle |= CBS_DROPDOWN; pCombo = new CInPlaceComboBox(); pCombo->Create(dwStyle, rcTemp, pWndParent, 0); pCombo->ResetContent(); if( &strArr != NULL ) { for(int i = 0; i < strArr.GetSize(); i++) { pCombo->AddString(strArr[i]); } } //if( !sValue.IsEmpty() ) //{ if((iIndex = pCombo->FindStringExact( -1, sValue )) < 0 && !sValue.IsEmpty()) { pCombo->InsertString( 0, sValue ); iIndex = 0; } //} //else // iIndex = 0; pCombo->SetCurSel( iIndex ); if(!bList) pCombo->SetEditSel(-1, 0); pWndCtrl = pCombo; pWndParent->ClientToScreen(rect); pCombo->ScreenToClient(rect); pCombo->SetFrameRect(rect, bList); } void CInPlaceComboBox::CreateCtrl1(CWnd *&pWndCtrl, CRect rect, CWnd *pWndParent, CString sValue, CStringList* pStrList, UINT nHeight, BOOL bList) { rect.InflateRect(1, 1, 0, 0); CRect rcTemp = rect; rcTemp.bottom += nHeight; CInPlaceComboBox* pCombo; rcTemp.top--; if(pWndCtrl != NULL && pWndCtrl->IsKindOf(RUNTIME_CLASS(CInPlaceComboBox))) { pCombo = (CInPlaceComboBox*)pWndCtrl; if(bList && pCombo->IsList() || !bList && !pCombo->IsList()) { pCombo->ResetContent(); if(pStrList != NULL) { POSITION pos = pStrList->GetHeadPosition(); while(pos != NULL) { CString sText = pStrList->GetNext(pos); pCombo->AddString(sText); } } int iIndex = pCombo->FindStringExact(-1, sValue); if(iIndex < 0 && !sValue.IsEmpty()) {iIndex = 0; pCombo->InsertString(0, sValue);} pCombo->SetCurSel(iIndex); pWndCtrl->SetWindowPos(NULL, rcTemp.left, rcTemp.top, rcTemp.Width(), rcTemp.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); pWndParent->ClientToScreen(rect); pCombo->ScreenToClient(rect); pCombo->SetFrameRect(rect, bList); return; } } if(pWndCtrl != NULL) delete pWndCtrl; DWORD dwStyle = WS_VISIBLE|WS_CHILD|CBS_AUTOHSCROLL | WS_VSCROLL ; if(bList) dwStyle |= CBS_DROPDOWNLIST; else dwStyle |= CBS_DROPDOWN; pCombo = new CInPlaceComboBox(); pCombo->Create(dwStyle, rcTemp, pWndParent, 0); pWndCtrl = pCombo; if(pStrList != NULL) { POSITION pos = pStrList->GetHeadPosition(); while(pos != NULL) { CString sText = pStrList->GetNext(pos); pCombo->AddString(sText); } } int iIndex = pCombo->FindStringExact(-1, sValue); if(iIndex < 0 && !sValue.IsEmpty()) {iIndex = 0; pCombo->InsertString(0, sValue);} pCombo->SetCurSel(iIndex); pWndParent->ClientToScreen(rect); pCombo->ScreenToClient(rect); pCombo->SetFrameRect(rect, bList); } int CInPlaceComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CComboBox::OnCreate(lpCreateStruct) == -1) return -1; SetFont(GetParent()->GetFont()); m_hParent = lpCreateStruct->hwndParent; // TODO: Add your specialized creation code here return 0; } void CInPlaceComboBox::OnKillFocus(CWnd* pNewWnd) { CComboBox::OnKillFocus(pNewWnd); /* IPCENDINFO ipeEditInfo; ZeroMemory( &ipeEditInfo, sizeof( ipeEditInfo ) ); if( pNewWnd ) ipeEditInfo.hNewWnd = pNewWnd->m_hWnd; else ipeEditInfo.hNewWnd = NULL; ipeEditInfo.hwndSrc = m_hWnd; ipeEditInfo.uKind = IPEK_KILLFOUCE; ipeEditInfo.nVirtKey = 0; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipeEditInfo ); Invalidate();*/ } void CInPlaceComboBox::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect, rectText; GetClientRect(rect); int iHeight = rect.Height() - 2; rectText = rect; CString sText; GetWindowText(sText); rect.DeflateRect(2, 2, 2, 2); //rectText.DeflateRect(4, 4, iHeight-2, 4); rectText.DeflateRect(4, 4, 4, 4); COLORREF crOldTextColor = dc.GetTextColor(); COLORREF crOldBkColor = dc.GetBkColor(); dc.SetBkColor(::GetSysColor(COLOR_WINDOW)); if(GetFocus() == this) { dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); dc.ExtTextOut(rect.left, rect.top, ETO_OPAQUE, rect, _T(""), 0, NULL); } CFont* pOldFont = dc.SelectObject(GetFont()); dc.DrawText(sText, rectText, DT_SINGLELINE|DT_VCENTER); dc.SelectObject(pOldFont); dc.SetTextColor(crOldTextColor); dc.SetBkColor(crOldBkColor); //rect = m_rect; GetClientRect(rect); rect.top += 1; rect.bottom = rect.top + m_rect.Height(); //CPen pen(PS_SOLID, 1, RGB(198, 198, 198)); CPen pen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNFACE)); CPen* pOldPen = dc.SelectObject(&pen); dc.MoveTo(rect.right, rect.top); dc.LineTo(rect.TopLeft()); dc.LineTo(rect.left, rect.bottom); dc.LineTo(rect.BottomRight()); dc.SelectObject(pOldPen); if (rect.Width() > iHeight + 4) rect.left = rect.right - iHeight; else { rect.left += 4; rect.right = rect.left + iHeight; } dc.DrawFrameControl(rect, DFC_SCROLL, m_bDrop ? DFCS_SCROLLDOWN|DFCS_PUSHED : DFCS_SCROLLDOWN); } void CInPlaceComboBox::OnDropdown() { // TODO: Add your control notification handler code here m_bDrop = TRUE; CRect rect; GetClientRect(rect); rect.left = rect.right - rect.Height(); InvalidateRect(rect, FALSE); } void CInPlaceComboBox::OnCloseup() { // TODO: Add your control notification handler code here m_bDrop = FALSE; CRect rect; GetClientRect(rect); rect.left = rect.right - rect.Height(); InvalidateRect(rect, FALSE); } void CInPlaceComboBox::SetFrameRect(CRect rect, BOOL bList) { m_rect = rect; m_bList = bList; } void CInPlaceComboBox::OnEditchange() { GetParent()->SendMessage(WM_USER_CHILDVALUECHANGED, 1, 0); } void CInPlaceComboBox::OnSelendok() { SetCurSel(GetCurSel()); GetParent()->SendMessage(WM_USER_CHILDVALUECHANGED, 1, 1); } void CInPlaceComboBox::OnKillfocus() { IPCENDINFO ipeEditInfo; ZeroMemory( &ipeEditInfo, sizeof( ipeEditInfo ) ); ipeEditInfo.hNewWnd = NULL; ipeEditInfo.hwndSrc = m_hWnd; ipeEditInfo.uKind = IPEK_KILLFOUCE; ipeEditInfo.nVirtKey = 0; ::SendMessage( m_hParent, CT_IPCMsg, 0, (LPARAM)&ipeEditInfo ); Invalidate(); }