在MFC中访问多个Editbox

时间:2012-05-15 19:42:51

标签: c++ mfc

我正在编写一个MFC程序,其中我有很多Editboxes,我想获取所有文本值并将它们放在容器中。如何在不为每个ID写一行的情况下实现此目的。我正在为每个ID使用此代码:
    CEdit *edit;
    edit = reinterpret_cast<CEdit *>(GetDlgItem(IDC_NAME1));
但是,如果我使用这种方法,我将不得不写45次。这似乎不对。 有没有办法让所有的Editbox都在容器中,所以我可以这样使用它们或类似的东西?

2 个答案:

答案 0 :(得分:1)

您当然可以创建一个数组(或其他容器)或指向CEdit的指针:CEdit edits[45];如果IDC_NAME1IDC_NAME45的值是连续的,您可以执行以下操作:< / p>

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

如果这些标识符可能不连续,那么您可以将它们放在一个数组中,然后根据需要直接索引到该数组中。

一个警告:除非它们像是一个几乎完全相同的编辑控件网格,否则屏幕上的45可能会有点多。如果它们像网格一样,您可能希望查看许多可用的网格控件之一。

答案 1 :(得分: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儿童程序:

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