/////////////////////////////////////////////////////////////////////////////// // OnKillFocus void XComboList::OnKillFocus(CWnd* pNewWnd) { //TRACE0("in XComboList::OnKillFocus\n"); CWnd::OnKillFocus(pNewWnd); m_nCount++; if (m_nCount > 2) { SendRegisteredMessage(WM_XCOMBOLIST_VK_ESCAPE, 0, 0); } }
/////////////////////////////////////////////////////////////////////////////// // OnChar void CXEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // handle escape and return, in case edit does NOT have focus if (m_pParent) { if (nChar == VK_ESCAPE) { SendRegisteredMessage(WM_XEDIT_VK_ESCAPE); return; } else if (nChar == VK_RETURN) { SendRegisteredMessage(WM_XEDIT_KILL_FOCUS); return; } } CEdit::OnChar(nChar, nRepCnt, nFlags); }
/////////////////////////////////////////////////////////////////////////////// // PreTranslateMessage BOOL CXEdit::PreTranslateMessage(MSG* pMsg) { // handle WM_KEYDOWN in case the edit has focus - otherwise // it will be sent to parent, bypassing WM_CHAR if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_RETURN) { SendRegisteredMessage(WM_XEDIT_KILL_FOCUS); return TRUE; } else if (pMsg->wParam == VK_ESCAPE) { SendRegisteredMessage(WM_XEDIT_VK_ESCAPE); return TRUE; } } return CEdit::PreTranslateMessage(pMsg); }
/////////////////////////////////////////////////////////////////////////////// // PreTranslateMessage BOOL XComboList::PreTranslateMessage(MSG* pMsg) { switch (pMsg->message) { case WM_KEYDOWN: { /////////////////////////////////////////////////////////////////// // we need to trap all cursor keys & alpha keys to reposition the // scroll bar /////////////////////////////////////////////////////////////////// //TRACE(" WM_KEYDOWN\n"); SCROLLINFO si = { sizeof(SCROLLINFO), SIF_ALL | SIF_DISABLENOSCROLL, }; m_wndSBVert.GetScrollInfo(&si); BOOL bSetScrollInfo = FALSE; int nIndex = 0; if (::IsWindow(m_ListBox.m_hWnd)) nIndex = m_ListBox.GetCurSel(); if (nIndex == LB_ERR || nIndex < 0) nIndex = 0; // use index from listbox, because scroll position cannot be relied // upon here switch (pMsg->wParam) { case VK_RETURN: SendRegisteredMessage(WM_XCOMBOLIST_VK_RETURN, 0, 0); break; case VK_ESCAPE: SendRegisteredMessage(WM_XCOMBOLIST_VK_ESCAPE, 0, 0); break; // handle scrolling messages case VK_DOWN: si.nPos = nIndex + 1; bSetScrollInfo = TRUE; break; case VK_END: si.nPos = si.nMax; bSetScrollInfo = TRUE; break; case VK_HOME: si.nPos = 0; bSetScrollInfo = TRUE; break; case VK_NEXT: // PAGE DOWN si.nPos = nIndex + (si.nPage-1); bSetScrollInfo = TRUE; break; case VK_PRIOR: // PAGE UP si.nPos = nIndex - (si.nPage - 1); bSetScrollInfo = TRUE; break; case VK_UP: si.nPos = nIndex - 1; bSetScrollInfo = TRUE; break; default: if (pMsg->wParam >= 0x41/*VK_A*/ && pMsg->wParam <= 0x5A/*VK_Z*/) { // this was an alpha key - try to find listbox index CString strAlpha; strAlpha = (_TCHAR) pMsg->wParam; int nIndex2 = 0; if (::IsWindow(m_ListBox.m_hWnd)) nIndex2 = m_ListBox.FindString(nIndex, strAlpha); if (nIndex2 != LB_ERR) { si.nPos = nIndex2; bSetScrollInfo = TRUE; } } break; } if (bSetScrollInfo) { // let parent know the selection has changed SendRegisteredMessage(WM_XCOMBOLIST_KEYDOWN, 0, 0); // update scrollbar if (si.nPos < 0) si.nPos = 0; if (si.nPos > si.nMax) si.nPos = si.nMax; m_wndSBVert.SetScrollInfo(&si); } break; } case WM_LBUTTONUP: SendRegisteredMessage(WM_XCOMBOLIST_LBUTTONUP, 0, 0); break; } return CWnd::PreTranslateMessage(pMsg); }
/////////////////////////////////////////////////////////////////////////////// // OnLButtonDown void XComboList::OnLButtonUp(UINT nFlags, CPoint point) { SendRegisteredMessage(WM_XCOMBOLIST_LBUTTONUP, 0, 0); CWnd::OnLButtonUp(nFlags, point); }
/////////////////////////////////////////////////////////////////////////////// // OnKillFocus void CXEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); SendRegisteredMessage(WM_XEDIT_KILL_FOCUS); }