0

私は多くのエディットボックスを持っている MFC プログラムを書いており、それらのすべてのテキスト値を取得してコンテナに入れたいと思っています。IDごとに1行も書かずにこれを達成するにはどうすればよいですか。IDごとにこのコードを使用しています。
CEdit *edit;
edit = reinterpret_cast<CEdit *>(GetDlgItem(IDC_NAME1));
しかし、その方法を使用すると、45回書く必要があります。それは正しくないようです。コンテナー内のすべての Editbox を取得して、その方法またはそのような方法で使用できるようにする方法はありますか?

4

2 に答える 2

1

配列 (または他のコンテナー) または CEdit へのポインターを確実に作成できます。 ~のCEdit edits[45];値が連続している場合は、次のようにすることができます。IDC_NAME1IDC_NAME45

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

これらの識別子が連続していない可能性がある場合は、それらを配列に入れ、必要に応じてその配列にインデックスを付けることができます。

1 つの注意点: それらがほとんど同じ編集コントロールのグリッドのようなものでない限り、画面上の 45 は少し多すぎるかもしれません。それらがグリッドのようなものである場合は、代わりに多くの利用可能なグリッド コントロールの 1 つを見たいと思うかもしれません。

于 2012-05-15T19:52:26.643 に答える
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);

列挙型の子プロシージャ:

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;
}
于 2012-05-16T11:41:01.183 に答える