2012-06-16 143 views
0

我有一個CEdit框,用戶可以輸入相關信息。只要他\她開始在箱子裏寫字,我需要一個通知,以便我可以撥打doSomething()執行一些其他任務。 Windows是否提供回調,如果是,我該如何使用它?如何從「CEdit」框中獲取通知?

回答

1

如果您雙擊資源編輯器中的編輯框,它會自動爲您創建OnEnChanged事件。

4

有了MFC,就沒有回調了,而是通過爲相應的事件實現處理程序來做到這一點。您需要處理的兩個事件之一:WM_CHAREN_CHANGE

處理對話框的EN_CHANGE例如實時的對話框上的其他地方複製輸入的文本。您需要先添加在對話框的消息映射條目,其次覆蓋相應的處理程序:

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 
    } 

或者,處理編輯框類的WM_CHAR例如防止某些字符,例如輸入忽略數字輸入以外的任何數字。從CEdit派生類,處理該類的事件(不是對話框),並使您的編輯控件成爲該類的一個實例。

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); 
    } 

注意,你可以使用VS IDE擺在存根處理程序通過使用消息映射塊鼠標選擇屬性欄覆蓋。

編輯:增加了示例代碼,並糾正了我錯誤的WM_CHAR解釋。

+0

WM_CHAR是不夠的,因爲你可以粘貼到例如控制。 –

0

以下假定您有一個MFC對話框應用程序。

類嚮導可與開始右擊: Start class wizard

雙擊控制ID(具有小綠色加的圖標)的新的編輯控件添加相應的成員變量的班上。

New proposed variable created

類和活動向導會更新類定義,並添加CEdit成員:

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

類嚮導將更新功能:

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

雙擊控件或右鍵單擊並選擇添加事件嚮導將更新消息映射並創建函數de claration和定義:

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() 

最後的代碼可以更新與編輯控件交互:

void CMFCApplication5Dlg::OnEnChangeEdit1() 
{ 
    // TODO: Add your control notification handler code here 
    CString text; 
    m_edit1.GetWindowText(text); 
    //m_edit1.SetWindowText(text); 
}