2012-05-15 35 views
0

我正在寫一個MFC程序,其中有很多Editboxes,我希望獲取所有文本值並將它們放入容器中。如何在不爲每個ID寫入一行的情況下實現這一目標。我爲每個ID使用此代碼:
CEdit *edit;
edit = reinterpret_cast<CEdit *>(GetDlgItem(IDC_NAME1));
但是,如果我使用該方法,則必須將其寫入45次。這看起來不正確。 有沒有辦法讓所有的Editboxes在一個容器中,所以我可以用它們這樣的方式或類似的東西?訪問MFC中的多個Editboxes

回答

1

你也可以創建一個數組(或其他容器)或指針的CEdit:CEdit edits[45];如果IDC_NAME1通過IDC_NAME45值是連續的,你可以這樣做:

for (int i=0; i<45; i++) 
    names[i] = reinterpret_cast<CEdit *>(GetDlgItem(IDC_NAME1 + i)); 

如果這些標識符可能不是連續的,那麼你可以把它們放在一個數組中,並根據需要索引到該數組中。

一個警告:除非它們像一個網格,否則幾乎相同的編輯控件,屏幕上的45可能會有點多。如果它們像網格一樣,則可能需要查看許多可用的網格控件之一。

+0

所以IDC_NAME1 + 1 = IDC_NAME2? –

+0

不起作用 –

+1

@IliyanLaskov IDC_NAME1 + 1!= IDC_NAME2當然是ID,但是如果IDC_NAME1是200,IDC_NAME2是201,那是對的。你必須確保這些ID是連續的並且按照正確的順序。檢查您的resource.h文件 – MikMik

0

您不必使用控件ID。 使用EnumChildWindows並獲取僅用於編輯控件的測試。片段如下。


添加在對話框的標題如下:

afx_msg LRESULT OnFoundEdit(WPARAM wParam, LPARAM lParam); 

而這款以CPP:

#define WM_U_FOUND_EDIT WM_APP + 0x100 


BEGIN_MESSAGE_MAP(CEditCtrlFishingDlg, CDialog) 
    ON_MESSAGE(WM_U_FOUND_EDIT, OnFoundEdit) 
    . 
    . 
    . 
    . 
END_MESSAGE_MAP() 

寫這條線,你要開始編輯文本集合地點:

EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)m_hWnd); 

Enum child proc edure:

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) 
{ 
    CString csBuffer; 
    LPTSTR pBuf = csBuffer.GetBufferSetLength(MAX_PATH); 
    GetClassName(hwnd, pBuf, MAX_PATH); 
    csBuffer.ReleaseBuffer(); 

    if(!csBuffer.CompareNoCase(_T("edit"))) 
    { 
     SendMessage((HWND)lParam, WM_U_FOUND_EDIT, 0, (LPARAM)hwnd); 
    } 

    return TRUE; 

} 

和處理程序:

LRESULT YourDlg::OnFoundEdit(WPARAM wParam, LPARAM lParam) 
{ 
    CWnd *pWnd = FromHandle((HWND)lParam); 
    CString csTxt; 

    pWnd->GetWindowText(csTxt); 
    // do what you need with text here 

    return 0; 
}