CRichEditCtrl 如何忽略按键?

Posted

技术标签:

【中文标题】CRichEditCtrl 如何忽略按键?【英文标题】:CRichEditCtrl how to ignore a keypress? 【发布时间】:2013-06-01 17:36:22 【问题描述】:

我的一个基于 MFC 对话框的应用程序对话框中有一个丰富的编辑框。 它只能有数值。 现在我想做的是不允许用户输入大于 4567899 的值。 如果用户在丰富的编辑框中输入数字,并且通过按数字键将使文本框中已经输入的值大于 4567899,那么只需让应用程序的行为就像没有按下任何键一样,或者只是忽略该按键。

我做了一些研究,发现这可以通过 EN_MSGFILTER 事件来完成,但我不确定。

这就是函数

    void CMyDialog::OnMsgfilterObjectid(NMHDR* pNMHDR, LRESULT* pResult)  
    
char tempID[10];
MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);
// TODO: The control will not send this notification unless you override the
// CDialog::OnInitDialog() function to send the EM_SETEVENTMASK message
// to the control with either the ENM_KEYEVENTS or ENM_MOUSEEVENTS flag 
// ORed into the lParam mask.

// TODO: Add your control notification handler code here

*pResult = 0;
    if((pMsgFilter->wParam >= 48) || pMsgFilter->wParam<=57) // check if 0-9 is pressed
 
     m_objectIDInstance.GetLine(NULL,tempID);  //m_objectIDInstance is a CRichEditCtrl
 tempID[m_objectIDInstance.LineLength()] = '\0';
 if ((atol(tempID) + (pMsgFilter->wParam-48)) > 4567899)
     
     *pResult=1;
     
    
    

在 OnInitDialog() 中我添加了以下行:

    m_objectIDInstance.SendMessage(EM_SETEVENTMASK, 0, ENM_KEYEVENTS);

但它不起作用,所以请如果有人可以提供帮助或可以建议一种不同的方式来做我正在尝试实施的事情。

谢谢

【问题讨论】:

【参考方案1】:

您似乎正在向对话框发送消息。它必须发送到编辑控件。

m_objectIDInstance.SendMessage(...)

【讨论】:

是的,每当我按下一个键时,控件就会进入上述功能,通过检查 pMsgFilter->wParam 我可以知道按下了什么键。现在我已经修改了这个功能,检查一下我上面的帖子。让它发挥作用,但我想要实现的目标仍然没有发生。请建议谢谢。

以上是关于CRichEditCtrl 如何忽略按键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CRichEditCtrl 中禁用 RTF 表格边框?

如何确定 CRichEditCtrl 中的文本选择是不是具有多种字体大小?

如何忽略 Swing 中的按键事件?

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)

如何通过忽略每次按键上的无效字符来使文本类型的输入元素只接受一个数值(十进制、正数和负数)?

CRichEditCtrl 输入字符串长度限制