如何处理父表中的CEdit鼠标单击? [英] How to handle CEdit mouse click in parent form?

查看:96
本文介绍了如何处理父表中的CEdit鼠标单击?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是MFC的新手(来自C#和Java),并且想出了办法.

I'm new to MFC (coming from C# and Java) and figuring things out.

考虑一个包含三个文本框的对话框.我将CEdit子类化为CMyEdit,并且三个文本框都与对话框类中的CMyEdit变量挂钩.

Consider a dialog with three text boxes. I have subclassed CEdit to CMyEdit, and the three text boxes are hooked up to CMyEdit variables in the dialog class.

当鼠标左键单击三个文本框中的任何一个时,我想让对话框类知道".我找到了有关如何在我的CMyEdit类中添加ON_WM_LBUTTONDOWN处理程序的示例.效果很好,但是处理程序仅在CMyEdit类中.假设每当单击其中一个文本框时,我都希望对话框禁用其他两个.如何获得有关单击鼠标左键的通知?

I want to allow the dialog class to "know" when any of the three text boxes has been clicked with the left mouse button. I have found examples of how to add an ON_WM_LBUTTONDOWN handler to my CMyEdit class. Works great, but the handler is in the CMyEdit class only. Suppose that whenever one of the text boxes is clicked, I want the dialog to disable the other two. How can I get the dialog notified of the left-click?

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

This is a completely contrived and simplified example. I don'nt actually have an app where I'm worried about left clicks in text boxes. But I think the fact that I can't figure out how to do it indicates a fundamental misunderstanding of how to deal with UI events in MFC.

来自C#的世界,在这里一切都为我完成,我可以直接访问我想要的任何事件(获得焦点,鼠标双击等),我对某些事件为何特别而感到困惑.提供方便的访问.对于CEdit,我不明白为什么没有问题就可以直接获得焦点,取消焦点,更改和其他几个选项,但是其他事件(如鼠标单击)却没有.

Coming from the world of C#, where everything is done for me and I have direct access to any of the events I want (got focus, mouse double click, whatever) I'm very confused on why certain events are special and provide easy access. In the case of CEdit, I don't understand why got focus, kill focus, change, and several others are "directly" available to me with no problem, but other events, like mouse click, are not.

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

But back to my actual question: in the scenario described above, how can I get the dialog notified of the left mouse clicks on the text boxes? Do the text boxes need to raise events or send messages (or something else) to the dialog?

推荐答案

在您的消息映射中添加WM_LBUTTONUP处理程序

Add a WM_LBUTTONUP handler to your message map

BEGIN_MESSAGE_MAP(CYourDialog, CDialog)
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

最简单的方法是在窗口中添加事件处理程序.通过资源编辑器最容易做到这一点.转到属性页面,然后转到消息部分.然后为WM_LBUTTONUP添加一个函数.

It is easiest to do this by adding an event handler to the window. This is most easily done through the resource editor. Go to the properties page then go to the messages section. Then add a function for WM_LBUTTONUP.

最后,您可以按如下所示填写该功能.

Finally you could fill in the function as follows.

void CYourDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
    // Grab the 3 (or more) edit control
    CEdit* pEdit1   = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL1 );
    CEdit* pEdit2   = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL2 );
    CEdit* pEdit3   = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL3 );

    // Grab the edit control window rects in screen coords.
    CRect edit1Rect;
    CRect edit2Rect;
    CRect edit3Rect;
    pEdit1->GetWindowRect( &edit1Rect );
    pEdit2->GetWindowRect( &edit2Rect );
    pEdit3->GetWindowRect( &edit3Rect );

    // Convert to client coordinates relative to their parent (ie this) window.
    ScreenToClient( edit1Rect );
    ScreenToClient( edit2Rect );
    ScreenToClient( edit3Rect );

    // Test if the point passed in to this function is in the control's rectangle.
    const BOOL bEnable1 = edit1Rect.PtInRect( point );
    const BOOL bEnable2 = edit2Rect.PtInRect( point );
    const BOOL bEnable3 = edit3Rect.PtInRect( point );

    // Enable the window that was clicked on and disable the others.
    pEdit1->EnableWindow( bEnable1 );
    pEdit2->EnableWindow( bEnable2 );
    pEdit3->EnableWindow( bEnable3 );

    // Set keyboard focus to the relevant control
    if      ( bEnable1 )
    {
        pEdit1->SetFocus();
    }
    else if ( bEnable1 )
    {
        pEdit2->SetFocus();
    }
    else if ( bEnable1 )
    {
        pEdit3->SetFocus();
    }

    CDialog::OnLButtonUp(nFlags, point);
}

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

This will, essentially, hit test and if the hit test is in an edit window it will enable it, disable the others and give it keyboard focus.

这篇关于如何处理父表中的CEdit鼠标单击?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆