在 mfc 的 cedit 控制中处理箭头键

Posted

技术标签:

【中文标题】在 mfc 的 cedit 控制中处理箭头键【英文标题】:Handling arrow key in cedit control of mfc 【发布时间】:2013-12-26 06:32:36 【问题描述】:

我正在使用 mfc 的 cedit 控件制作类似 matlab 的命令窗口。

例如,在我输入几个命令后,我想使用箭头键(特别是向上键)显示旧命令。

我成功显示旧命令,但未能将光标定位在该命令的末尾。 原因似乎是我将光标定位在该命令的末尾后又输入了一次箭头键。

这里是详细情况。

首先我输入命令“播放” 然后播放!...消息弹出。 然后在下一个命令提示符中,我点击了“↑”键 我成功地使用了自动流式传输的旧命令“播放”,

但是,我的光标向上移动了。

@播放

播放!.. | (←光标位于此处..)

@播放| (←我想把光标定位到这里,点击'↑'键后)

这是我的代码:

class CEditCommand::CEdit

public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);


BOOL CEditCommand::PreTranslateMessage(MSG* pMsg)

    if (pMsg->message == WM_KEYDOWN)
    
        if (pMsg->wParam == VK_UP)
        
            int nS = 0; nE =0;
            GetSel(nS, nE);
            int nLineIndex = LineIndex();
            CString str = m_CommandHistory[m_nCommandIndex];
            m_nCommandIndex--;
            SetSel(nLineIndex, nE);
            ReplaceSel(str);
            SetSel(0, -1);
            SetSel(-1, -1);
        
    

我不知道为什么在执行PreTranslateMessage后会再次按下'↑'键。 有人对此有想法吗?

【问题讨论】:

【参考方案1】:

您的编辑控件仍会收到向上箭头消息,因此当pMsg->wParam == VK_UP 时,您需要在CEditCommand::PreTranslateMessage() 中为WM_KEYDOWNWM_KEYUP 返回TRUE

【讨论】:

感谢您的帮助。解决方案真的很简单。

以上是关于在 mfc 的 cedit 控制中处理箭头键的主要内容,如果未能解决你的问题,请参考以下文章

MFC 事件处理程序

更改 MFC 应用程序的输入控件

为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用

控制台应用程序的 C# 箭头键输入

如何检查是不是已在 Ruby 和 Windows 控制台中按下箭头键

如何以编程方式在 Python 中按控制键和右箭头键?