Mfc 如何在父窗体中处理CEdit鼠标单击?

Mfc 如何在父窗体中处理CEdit鼠标单击?,mfc,Mfc,我不熟悉MFC(来自C#和Java)并了解一些事情 考虑一个包含三个文本框的对话框。我已经将CEdit子类化为CMyEdit,并且这三个文本框连接到dialog类中的CMyEdit变量 我想让dialog类“知道”何时用鼠标左键单击了三个文本框中的任何一个。我找到了一些例子,说明了如何将ON_WM_LBUTTONDOWN处理程序添加到我的CMyEdit类中。工作得很好,但处理程序仅在CMyEdit类中。假设每当单击其中一个文本框时,我希望对话框禁用另外两个。我如何才能获得有关左键单击的对话框通知

我不熟悉MFC(来自C#和Java)并了解一些事情

考虑一个包含三个文本框的对话框。我已经将CEdit子类化为CMyEdit,并且这三个文本框连接到dialog类中的CMyEdit变量

我想让dialog类“知道”何时用鼠标左键单击了三个文本框中的任何一个。我找到了一些例子,说明了如何将ON_WM_LBUTTONDOWN处理程序添加到我的CMyEdit类中。工作得很好,但处理程序仅在CMyEdit类中。假设每当单击其中一个文本框时,我希望对话框禁用另外两个。我如何才能获得有关左键单击的对话框通知

这是一个完全人为的简化例子。实际上,我没有一款应用程序担心文本框中的左键点击。但我认为我不知道该怎么做这一事实表明了对如何在MFC中处理UI事件的根本误解

我来自C#的世界,那里的一切都是为我做的,我可以直接访问我想要的任何事件(获得焦点、鼠标双击等),我很困惑为什么某些事件是特殊的,并且可以方便地访问。在CEdit的例子中,我不明白为什么Get focus、kill focus、change和其他几个事件对我来说“直接”可用,没有问题,但是其他事件,比如鼠标点击,没有问题


但是回到我的实际问题:在上面描述的场景中,如何才能在鼠标左键单击文本框时通知对话框?文本框是否需要引发事件或向对话框发送消息(或其他内容)?

将WM_LBUTTONUP处理程序添加到消息映射中

BEGIN\u MESSAGE\u MAP(CYourDialog,CDDialog)
关于_WM_LBUTTONUP()
结束消息映射()
要做到这一点,最简单的方法是向窗口添加事件处理程序。这可以通过资源编辑器轻松完成。转到属性页,然后转到消息部分。然后为WM_LBUTTONUP添加一个函数

最后,您可以按如下方式填写函数

void CYourDialog::OnLButtonUp(UINT nFlags,CPoint point)
{
//抓取3个(或更多)编辑控件
CEdit*pEdit1=(CEdit*)GetDlgItem(ID\u您的编辑\u控制1);
CEdit*pEdit2=(CEdit*)GetDlgItem(ID\u您的编辑\u控制2);
CEdit*pEdit3=(CEdit*)GetDlgItem(ID\u您的编辑\u控制3);
//抓取屏幕坐标中的编辑控制窗口矩形。
正确的编辑;
正确的编辑;
正确的编辑;
pEdit1->GetWindowRect(&edit1Rect);
pEdit2->GetWindowRect(&edit2Rect);
pEdit3->GetWindowRect(&edit3Rect);
//转换为相对于其父窗口(即此窗口)的客户端坐标。
ScreenToClient(编辑1等);
ScreenToClient(edit2Rect);
ScreenToClient(edit3Rect);
//测试传入此函数的点是否在控件的矩形中。
const BOOL bEnable1=edit1Rect.PtInRect(点);
const BOOL bEnable2=edit2Rect.PtInRect(点);
const BOOL bEnable3=edit3Rect.PtInRect(点);
//启用单击的窗口并禁用其他窗口。
pEdit1->启用窗口(bEnable1);
pEdit2->启用窗口(bEnable2);
pEdit3->启用窗口(bEnable3);
//将键盘焦点设置为相关控件
如果(1)
{
pEdit1->SetFocus();
}
否则如果(bEnable1)
{
pEdit2->SetFocus();
}
否则如果(bEnable1)
{
pEdit3->SetFocus();
}
CDialog::OnLButtonUp(nFlags,point);
}

基本上,这将是命中测试,如果命中测试在编辑窗口中,它将启用它,禁用其他测试,并为它提供键盘焦点。

感谢Goz提供的代码,我看到这确实会实现我的要求。但这并不是我所希望的。困扰我的是:正如我提到的,我已经将CEdit子类化为CMyEdit,并在那里处理ON_WM_LBUTTONDOWN消息。因此,当单击CMyEdit对象时,它们“知道”。难道他们没有办法通知对话框他们被点击了,而不是做所有的点击测试吗?这对我来说更有意义,但也许这不是解决问题的方法。你知道父类是什么。。。你可以随时调用它的函数。不过,它会在某种程度上将编辑框与对话框联系起来。我想你可以从CDialog中派生出一个“CMyDialog”并在那里添加功能。。。