Вот тебе готовый пример, как динамически сделать 15 кнопок и обрабатывать нажатие на них всего одним обработчиком. Предположим, ты используешь окно диалога (у меня оно называется CFifteensDlg). Тогда добавь в хедер и .CPP-файл следующее (добавляемые строки выделены жирным шрифтом):
| Цитата | FifteensDlg.h
class CFifteensDlg : public CDialog { // массив из 15-ти кнопок CButton m_Buttons[15]; // единый обработчик нажатия на любую кнопку void OnMyButtons(UINT id);
// .... };
FifteensDlg.cpp
// определяем диапазон ID-ов кнопок #define ID_FIRST_15BUTTON WM_USER #define ID_LAST_15BUTTON ID_FIRST_15BUTTON+14
BEGIN_MESSAGE_MAP(CFifteensDlg, CDialog) //{{AFX_MSG_MAP(CFifteensDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() // навешиваем свой обработчик в MESSAGE_MAP ON_COMMAND_RANGE(ID_FIRST_15BUTTON, ID_LAST_15BUTTON, OnMyButtons) //}}AFX_MSG_MAP END_MESSAGE_MAP()
// это наш обработчик, принимает ID нажатой кнопки void CFifteensDlg::OnMyButtons(UINT id) { int iButton = id - ID_FIRST_15BUTTON; CString str; str.Format("%d", iButton+1); MessageBox(str, "Pressed Button:", MB_OK|MB_ICONINFORMATION); }
// при создании окна диалога, создаём 15 кнопок с ID из выбранного диапазона BOOL CFifteensDlg::OnInitDialog() { CDialog::OnInitDialog();
CRect rect; GetClientRect(&rect); int W = rect.Width()/4, H = rect.Height()/4; int iButton=0; for(int y=0; y<4; y++) { for(int x=0; x<4; x++) { if(x==2 && y==2) continue; CString csCaption; csCaption.Format("%d", iButton+1); CRect rectBut(x*W, y*H, (x+1)*(W-5), (y+1)*(H-5)); m_Buttons[iButton].Create(csCaption, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, rectBut, this, ID_FIRST_15BUTTON+iButton); iButton++; } }
// .... } | |