Ну и что? Можно создать массив ID, лучше непрерывный. Тогда можно будет воспользоваться макросом обработки сообщений ON_CONTROL_RANGE.
Примерно так, для 10 чеков:
.h
#pragma once
#include <list>
using namespace std;
class CTestCheckBoxDlg : public CDialog
{
public:
CTestCheckBoxDlg(CWnd* pParent = NULL);
enum { IDD = IDD_TESTCHECKBOX_DIALOG };
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnChkButtonRangeClicked(UINT nID); // <- ф-я обработчик
afx_msg void OnDestroy(); // <- чтобы потом всё подчистить
DECLARE_MESSAGE_MAP()
private:
list<CButton*> m_lstCheckBox; // <- контейнер
};
в .cpp
...
#define IDC_BUTTON_FIRST 777
#define IDC_BUTTON_LAST IDC_BUTTON_FIRST + 10 // 10 штук
BEGIN_MESSAGE_MAP(CTestCheckBoxDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON_FIRST, IDC_BUTTON_LAST, OnChkButtonRangeClicked) // <- макрос для работы с диапазоном кнопок
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CTestCheckBoxDlg message handlers
BOOL CTestCheckBoxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
int nYOffset = 30;
CRect rc = CRect(10, 10, 200, 30);
for (int i = 0; i < (IDC_BUTTON_LAST - IDC_BUTTON_FIRST); i++)
{
CString stCapt;
stCapt.Format(L"My CheckBox %d", i);
auto pNew = new CButton();
pNew->Create(stCapt, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rc, this, IDC_BUTTON_FIRST + i);
rc.OffsetRect(0, nYOffset);
m_lstCheckBox.push_back(pNew);
}
return TRUE;
}
void CTestCheckBoxDlg::OnChkButtonRangeClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON_FIRST;
CString stMsg;
BOOL bChecked = ((CButton*)GetDlgItem(nID))->GetCheck() == 1;
stMsg.Format(L"CheckBox %d is %s", nButton, bChecked ? L"checked" : L"unchecked");
AfxMessageBox(stMsg);
}
void CTestCheckBoxDlg::OnDestroy()
{
CDialog::OnDestroy();
for (auto i : m_lstCheckBox)
{
i->DestroyWindow();
delete i;
}
}
...
зы
Контейнер для кнопок только для того, чтобы потом "почистить". Если у тебя эти несколько "чеков", создаются по-другому, то он не нужен. Главное принцип как получить нажатие N-ой кнопки с помощью макроса ON_CONTROL_RANGE.