How to handle CEdit mouse click in parent form?

前端 未结 1 762
南旧
南旧 2021-01-21 08:00

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

Consider a dialog with three text boxes. I have subclassed CEdit to CMyEdit, and the three text boxes

1条回答
  •  后悔当初
    2021-01-21 08:41

    Add a WM_LBUTTONUP handler to your message map

    ie

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

    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.

    0 讨论(0)
提交回复
热议问题