How do I get notification from a `CEdit` box?
Asked Answered
S

3

6

I have a CEdit box where a user can enter relevant information. As soon as he\she starts writing in the box, I need a notification so that I can call doSomething() to perform some other task. Does Windows provide a callback, and if so, how do I use it?

Strontium answered 16/6, 2012 at 9:19 Comment(0)
B
14

With MFC there's no callback as such, rather you do this by implementing a handler for the appropriate event. You need to handle one of two events: WM_CHAR or EN_CHANGE

Handle the dialog's EN_CHANGE for example duplicating in realtime the entered text elsewhere on the dialog. You need to firstly add an entry in the dialog's message map, and secondly override the appropriate handler:

BEGIN_MESSAGE_MAP(CstackmfcDlg, CDialog)
    ON_EN_CHANGE(IDC_EDIT1, &CstackmfcDlg::OnEnChangeEdit1)
END_MESSAGE_MAP()

void CstackmfcDlg::OnEnChangeEdit1()
    {
    CString text;
    m_edit.GetWindowText(text);
    m_label.SetWindowText(text); // update a label control to match typed text
    }

Or, handle the editbox class's WM_CHAR for example preventing input of certain characters, e.g. ignore anything other than a digit for numerical entry. Derive a class from CEdit, handle the WM_CHAR event of that class (not the dialog) and make your edit control an instance of that class.

BEGIN_MESSAGE_MAP(CCtrlEdit, CEdit)
    ON_WM_CHAR()
END_MESSAGE_MAP()

void CCtrlEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // Do nothing if not numeric chars entered, otherwise pass to base CEdit class
    if ((nChar >= '0' && nChar <= '9') || VK_BACK == nChar)
        CEdit::OnChar(nChar, nRepCnt, nFlags);
    }

Note that you can use the VS IDE to put in stubs for the handler overrides by using the Properties bar with the mouse selection in the message map block.

EDIT: Added example code, and corrected explanation of WM_CHAR which I had wrong.

Burkholder answered 19/6, 2012 at 9:2 Comment(1)
WM_CHAR isn't sufficient since you can paste into the control for example.Xenophobe
P
1

If you double click on the edit box in the resource editor it automatically creates the OnEnChanged event for you.

Preoccupy answered 19/6, 2012 at 8:23 Comment(0)
O
1

The following assumes that you have an MFC dialog application.

The class wizard can be started with a right-click: Start class wizard

Double-click the Control ID (has an icon with a small green plus) of the new edit control to add the corresponding member variable to the class.

New proposed variable created

The class and event wizards will update the class definition and add a CEdit member:

afx_msg void OnEnChangeEdit1(); // Added by event wizard
CEdit m_edit1; // member added by class wizard

The class wizard will update the function:

void CMFCApplication5Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_edit1); // new variable added with class wizard
}

Double-clicking the control or right-clicking and selecting the add event wizard will update the message map and create the function declaration and definition:

BEGIN_MESSAGE_MAP(CMFCApplication5Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_EN_CHANGE(IDC_EDIT1, &CMFCApplication5Dlg::OnEnChangeEdit1) // new event handler added with wizard
END_MESSAGE_MAP()

Finally the code may be updated to interact with the edit control:

void CMFCApplication5Dlg::OnEnChangeEdit1()
{
    // TODO:  Add your control notification handler code here
    CString text;
    m_edit1.GetWindowText(text);
    //m_edit1.SetWindowText(text);
}
Overspill answered 11/7, 2017 at 16:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.