访问 MFC 中的多个编辑框

Accessing multiple Editboxes in MFC

本文关键字:编辑 MFC 访问      更新时间:2023-10-16

>我正在编写一个MFC程序,其中我有很多编辑框,我想获取它们的所有文本值并将它们放在容器中。如何在不为每个 ID 写一行的情况下实现这一点。我为每个 ID 使用以下代码:

CEdit *edit;
edit = reinterpret_cast<CEdit *>(GetDlgItem(IDC_NAME1));但是如果我使用这种方法,我将不得不写 45 次。这似乎不对。有没有办法将所有编辑框都放在一个容器中,以便我可以以这种方式或类似方式使用它们?

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

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

如果这些标识符可能不连续,则可以将它们放在数组中,并根据需要索引到该数组中。

一个警告:除非它们类似于几乎相同的编辑控件的网格,否则屏幕上的 45 个很可能有点多。如果它们类似于网格,则可能需要查看许多可用的网格控件之一。

您不必使用控件 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);

枚举子过程:

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