Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: событие от динамически созданного Check Box  (Прочитано 7183 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 15-04-2014 08:35 » 

Добрый день - дальше захотелось процитировать Иа.

Исходные данные : visual c++ 6  и  MFC.

Создала CheckBox примерно так

create("name", BS_AUTOCHECKBOX|WS_CHILD,rc, parWnd, 0);

Те ID нет.

Как мне создать событие от этого CheckBox?  Например,ON_BN_CLICKED - в смысле нажатие на кнопку?



Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 15-04-2014 09:20 » 

А почему бы не присвоить ID?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 15-04-2014 10:30 » 

Кол-во чеков переменное, их некоторое кол-во .


Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 15-04-2014 11:48 » 

Ну и что? Можно создать массив ID, лучше непрерывный. Тогда можно будет воспользоваться макросом обработки сообщений ON_CONTROL_RANGE.

Примерно так, для 10 чеков:

.h
Код: (C++)
#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
Код: (C++)

...

#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.
« Последнее редактирование: 15-04-2014 12:59 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #4 : 22-04-2014 09:42 » new

Джон, спасибо, всё получилось. Класс!
Только сейчас руки дошли до решения этого вопроса.
Моя благодарность не знает границ. Да-да
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines