rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // Copyright (C) 1998 by Thierry Maurel rlm@1: // All rights reserved rlm@1: // rlm@1: // Distribute freely, except: don't remove my name from the source or rlm@1: // documentation (don't take credit for my work), mark your changes (don't rlm@1: // get me blamed for your possible bugs), don't alter or remove this rlm@1: // notice. rlm@1: // No warrantee of any kind, express or implied, is included with this rlm@1: // software; use at your own risk, responsibility for damages (if any) to rlm@1: // anyone resulting from the use of this software rests entirely with the rlm@1: // user. rlm@1: // rlm@1: // Send bug reports, bug fixes, enhancements, requests, flames, etc., and rlm@1: // I'll try to keep a version up to date. I can be reached as follows: rlm@1: // tmaurel@caramail.com (or tmaurel@hol.fr) rlm@1: // rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // File : KeyboardEdit.cpp rlm@1: // Project : AccelsEditor rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // Version : 1.0 * Authors : A.Lebatard + T.Maurel rlm@1: // Date : 17.08.98 rlm@1: // rlm@1: // Remarks : implementation file rlm@1: // rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////////////// rlm@1: // modified by aquanull rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "KeyboardEdit.h" rlm@1: rlm@1: extern TCHAR *mapVirtKeysStringFromWORD(WORD wKey); rlm@1: rlm@1: IMPLEMENT_DYNAMIC(CKeyboardEdit, CEdit) rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // CKeyboardEdit rlm@1: rlm@1: CKeyboardEdit::CKeyboardEdit() rlm@1: { rlm@1: ResetKey(); rlm@1: } rlm@1: rlm@1: CKeyboardEdit::~CKeyboardEdit() rlm@1: {} rlm@1: rlm@1: BEGIN_MESSAGE_MAP(CKeyboardEdit, CEdit) rlm@1: //{{AFX_MSG_MAP(CKeyboardEdit) rlm@1: ON_CONTROL_REFLECT_EX(EN_CHANGE, &CKeyboardEdit::OnEnChange) rlm@1: ON_CONTROL_REFLECT_EX(EN_SETFOCUS, &CKeyboardEdit::OnEnSetfocus) rlm@1: ON_CONTROL_REFLECT_EX(EN_KILLFOCUS, &CKeyboardEdit::OnEnKillfocus) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // CKeyboardEdit message handlers rlm@1: BOOL CKeyboardEdit::PreTranslateMessage(MSG *pMsg) rlm@1: { rlm@1: if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) rlm@1: { rlm@1: int key = pMsg->wParam; rlm@1: m_keys[key] = true; rlm@1: switch (key) rlm@1: { rlm@1: case VK_CONTROL: rlm@1: case VK_MENU: rlm@1: case VK_SHIFT: rlm@1: m_bCtrlPressed = m_keys[VK_CONTROL]; rlm@1: m_bAltPressed = m_keys[VK_MENU];; rlm@1: m_bShiftPressed = m_keys[VK_SHIFT]; rlm@1: if (!m_keys[m_wVirtKey]) rlm@1: { rlm@1: if (m_keys[m_wJamKey]) rlm@1: { rlm@1: m_wVirtKey = m_wJamKey; rlm@1: m_wJamKey = 0; rlm@1: } rlm@1: else rlm@1: m_wVirtKey = 0; rlm@1: } rlm@1: if (!m_keys[m_wJamKey]) rlm@1: m_wJamKey = 0; rlm@1: break; rlm@1: default: rlm@1: m_bCtrlPressed = m_keys[VK_CONTROL]; rlm@1: m_bAltPressed = m_keys[VK_MENU]; rlm@1: m_bShiftPressed = m_keys[VK_SHIFT]; rlm@1: if (m_wVirtKey != key) rlm@1: { rlm@1: if (m_keys[m_wVirtKey]) rlm@1: m_wJamKey = m_wVirtKey; rlm@1: else rlm@1: m_wJamKey = 0; rlm@1: m_wVirtKey = key; rlm@1: } rlm@1: else if (!m_keys[m_wJamKey]) rlm@1: m_wJamKey = 0; rlm@1: break; rlm@1: } rlm@1: DisplayKeyboardString(); rlm@1: return TRUE; rlm@1: } rlm@1: else if (pMsg->message == WM_KEYUP || pMsg->message == WM_SYSKEYUP) rlm@1: { rlm@1: int key = pMsg->wParam; rlm@1: m_keys[key] = false; rlm@1: switch (key) rlm@1: { rlm@1: case VK_CONTROL: rlm@1: case VK_MENU: rlm@1: case VK_SHIFT: rlm@1: break; rlm@1: default: rlm@1: m_bCtrlPressed = m_keys[VK_CONTROL]; rlm@1: m_bAltPressed = m_keys[VK_MENU]; rlm@1: m_bShiftPressed = m_keys[VK_SHIFT]; rlm@1: if (m_wJamKey) rlm@1: { rlm@1: if (!m_keys[m_wVirtKey]) rlm@1: { rlm@1: m_wVirtKey = m_wJamKey; rlm@1: m_wJamKey = 0; rlm@1: } rlm@1: if (!m_keys[m_wJamKey]) rlm@1: m_wJamKey = 0; rlm@1: } rlm@1: break; rlm@1: } rlm@1: DisplayKeyboardString(); rlm@1: return TRUE; rlm@1: } rlm@1: rlm@1: return CEdit::PreTranslateMessage(pMsg); rlm@1: } rlm@1: rlm@1: BOOL CKeyboardEdit::OnEnChange() rlm@1: { rlm@1: return FALSE; rlm@1: } rlm@1: rlm@1: BOOL CKeyboardEdit::OnEnSetfocus() rlm@1: { rlm@1: //SetSel(0, -1, TRUE); // mouse click makes this in vain, so we use the method below instead rlm@1: PostMessage(EM_SETSEL, 0, -1); rlm@1: m_bForceUpdate = true; rlm@1: return FALSE; rlm@1: } rlm@1: rlm@1: BOOL CKeyboardEdit::OnEnKillfocus() rlm@1: { rlm@1: AllKeyUp(); rlm@1: return FALSE; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: void CKeyboardEdit::DisplayKeyboardString() rlm@1: { rlm@1: CString strKbd; rlm@1: rlm@1: // modifiers rlm@1: if (m_bCtrlPressed) rlm@1: strKbd = "Ctrl"; rlm@1: rlm@1: if (m_bAltPressed) rlm@1: { rlm@1: if (strKbd.GetLength() > 0) rlm@1: strKbd += '+'; rlm@1: strKbd += "Alt"; rlm@1: } rlm@1: if (m_bShiftPressed) rlm@1: { rlm@1: if (strKbd.GetLength() > 0) rlm@1: strKbd += '+'; rlm@1: strKbd += "Shift"; rlm@1: } rlm@1: // virtual key rlm@1: LPCTSTR szVirtKey = mapVirtKeysStringFromWORD(m_wVirtKey); rlm@1: if (szVirtKey != NULL) rlm@1: { rlm@1: if (strKbd.GetLength() > 0) rlm@1: strKbd += '+'; rlm@1: strKbd += szVirtKey; rlm@1: } rlm@1: // jammed key rlm@1: LPCTSTR szJamKey = mapVirtKeysStringFromWORD(m_wJamKey); rlm@1: if (szJamKey != NULL) rlm@1: { rlm@1: strKbd += '('; rlm@1: strKbd += szJamKey; rlm@1: strKbd += ')'; rlm@1: } rlm@1: rlm@1: if (m_bForceUpdate) rlm@1: { rlm@1: m_bForceUpdate = false; rlm@1: SetWindowText(strKbd); rlm@1: } rlm@1: else rlm@1: { rlm@1: CString oldString; rlm@1: GetWindowText(oldString); rlm@1: if (oldString.Compare(strKbd)) rlm@1: SetWindowText(strKbd); rlm@1: } rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: void CKeyboardEdit::ResetKey() rlm@1: { rlm@1: AllKeyUp(); rlm@1: rlm@1: m_bForceUpdate = true; rlm@1: m_bCtrlPressed = false; rlm@1: m_bAltPressed = false; rlm@1: m_bShiftPressed = false; rlm@1: m_wVirtKey = 0; rlm@1: m_wJamKey = 0; rlm@1: rlm@1: if (m_hWnd != NULL) rlm@1: { rlm@1: CString oldString; rlm@1: GetWindowText(oldString); rlm@1: if (!oldString.IsEmpty()) rlm@1: SetWindowText(_T("")); rlm@1: } rlm@1: } rlm@1: rlm@1: void CKeyboardEdit::AllKeyUp() rlm@1: { rlm@1: for (int i = 0; i < 256; ++i) rlm@1: m_keys[i] = 0; rlm@1: } rlm@1: rlm@1: //////////////////////////////////////////////////////////////////////// rlm@1: // rlm@1: bool CKeyboardEdit::GetAccelKey(WORD &wVirtKey, bool &bCtrl, bool &bAlt, bool &bShift) const rlm@1: { rlm@1: if (!IsDefined()) rlm@1: return false; rlm@1: rlm@1: wVirtKey = m_wVirtKey; rlm@1: bAlt = m_bAltPressed; rlm@1: bCtrl = m_bCtrlPressed; rlm@1: bShift = m_bShiftPressed; rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool CKeyboardEdit::GetJamKey(WORD &wJamKey) const rlm@1: { rlm@1: if (m_wJamKey != 0) rlm@1: wJamKey = m_wJamKey; rlm@1: return m_wJamKey != 0; rlm@1: } rlm@1: rlm@1: bool CKeyboardEdit::IsDefined() const rlm@1: { rlm@1: return bool(m_wVirtKey || m_bAltPressed || m_bCtrlPressed || m_bShiftPressed); rlm@1: } rlm@1: rlm@1: bool CKeyboardEdit::IsFinished() const rlm@1: { rlm@1: bool finished = true; rlm@1: for (int i = 0; i < 256; ++i) rlm@1: if (m_keys[i]) rlm@1: finished = false; rlm@1: return finished; rlm@1: }