2017-08-18 64 views
0

前導零我發現CEdit的控制有選擇「數字」在其屬性,這樣我就可以防止輸入非數字字符到該文本框的用戶 - 這是CEdit的數量控制現在。 如果有一個選項「數字」,我想也許有一種方法可以刪除CEdit的前導零,這只是簡單的選項「數字」。MFC - 消除CEdit的數量控制

我曾嘗試與Dialog Data Exchange希望它會自動刪除前導零的我,但它不會。

那麼我認爲要做到這一點的方法是添加EN_KILLFOCUS消息爲每個CEdit的數量控制的,但我覺得筋疲力盡。

所以我認爲更好的方法是添加EN_KILLFOCUS,但所有的CEdit數字控件失去焦點事件點到一個函數,在這個函數中,我將刪除'當前'控制的前導零,但在C#我可以通過C++獲取'當前'控件,我不知道它是否受支持。

或繼承的CEdit使CEditNum - 它們實現失去焦點刪除前導零的功能,但這種解決方案,我不能設計它的Visual Studio的設計窗口(我認爲)上。我希望有類似this solution的解決方案(這是繪製&下降問題的解決方案)

反正之前申請的最終解決方案(EN_KILLFOCUS),我要確保,如果有更好的辦法 - 至少實現,再利用MFC的現有實現。

關於刪除前導零的一點解釋:你輸入:00001到CEdit控件中,然後失去焦點,CEdit控件顯示你:1.這個想法就像MS Excel,當你在它的單元格中輸入一個數字。

回答

0

「但所有的CEdit數量控制失去焦點事件點以一個功能」

這是事實,但你得到的只是失去焦點作爲參數控制的控制ID。

添加到您的留言表,用你的編輯控件的第一個和最後一個標識更換IDC_FIRST,IDC_LAST,或使用0,爲0xFFFFFFFF所有。

ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_FIRST, IDC_LAST, OnKillFocus). 

這裏是OnKillFocus的簽名,以及如何讓CWnd應用更改。

void CMyDialogClass::OnKillFocus(UINT nID) 
{ 
    // you can further check if the ID is one of interest here... 
    // if your edit control control IDs are not contiguous, for example. 

    // you can get a CEdit* here, but only if you used DDX to map the 
    // control to a CEdit. 
    CWnd* pCtrl = GetDlgItem(nID); 
    if (pCtrl) 
    { 
     CString str; 
     pCtrl->GetWindowText(str); 
     // remove zeroes, or format as you like.... 
     str.Format(_T("%d"), _tcstoi(str)); 
     pCtrl->SetWindowText(str); 
    } 
} 

// if you mapped the control to a CEdit, here's how you can safely   
// get a pointer to a CEDit 

CEdit* pEdit = (CEdit*)GetDlgItem(nID); 
ASSERT_KINDOF(CEdit, pEdit); // debug check 
if (pEdit && pEdit->IsKindOf(RUNTIME_CLASS(CEdit))) // standard check 
{ 
// .... 
}