2012-05-15 10 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; 
}