Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создание композитных контролов


Автор: Vyacheslav 27.5.2005, 16:01
Есть задача - создать композитный контрол, состоящий из набора других. Для примера(повторяю - только для примера) создаем контрол , содеожащие в себе три кнопки.
Код

class AFX_EXT_CLASS  CCompositControl : public CWnd
{
// Construction
public:
    CCompositControl();
//...
private:

    CButton m_button1;
    CButton m_button2;
    CButton m_button3;

};


При создании возникли проблемы.
1) Где должен быть размещен вызвов Create для m_button, что бы все показывалось как при динамическом создании контрола, так и при вставке в ресурс CustomControl и указании для него соответсвующего имени класса?
2)Как перехватить сообщения от buttons внутри контрола?


PS. Более 10 лет программирую на С++, но только сечас имел честь ознакомиться с MFC в силу производственной необходимости . И ... MFC - это все что угодно и возможно даже замечательная библиотека, но к ООП имеет весьма отдаленное отношение.

Автор: srd 28.5.2005, 09:55
Цитата
Где должен быть размещен вызвов Create для m_button, что бы все показывалось как при динамическом создании контрола, так и при вставке в ресурс CustomControl и указании для него соответсвующего имени класса?

Вызов Create() для m_button должен находиться в методе Create() родительского контрола CCompositeControl.

Цитата
Как перехватить сообщения от buttons внутри контрола?

При создании дочернего контрола - кнопки указывайте в качестве родителя окно CCompositeControl. Все сообщения от кнопки шлются родителю.

Автор: Vyacheslav 30.5.2005, 09:42
1) Create не вызывается при "нединамическом" создании контрола. Такой способ подойдет только если вручную вызывать CCompositeControl::Create. И это то я то как раз так и сделал. Но при этом кнопки не создаются и не соответсвенно не прорисовываются, если если CCompositeControl создавать не с помощью Create, а посредством вставки в ресусурс CustomControl
2) Я так и делал, но к сожалению ничего не проходит. Вернее не проходит ничего, что хотя бы отдаленно напоминало событие нажатия кнопки

Автор: oper54 30.5.2005, 13:23
Может такой вариант подойдет - все тоже, только для вывода кнопок на экран использовать статик который и станет родителем кнопок....
Вроде такого
Код

..............................................
CCompositControl::CCompositControl(CWnd* pParent)//def constr
{
 if(pParent){
  Create("static", "", WS_VISIBLE|WS_CHILD, CRect(10, 10, 250, 150), pParent, 101);
  m_but1.Create("but1", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, CRect(10, 10, 100, 100), this, 102);
 m_but2.Create("but2", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, CRect(100, 10, 200, 100), this, 103);
 }
}
..............................................
BEGIN_MESSAGE_MAP(CCompositControl, CWnd)
 //{{AFX_MSG_MAP(CComp)
  // NOTE - the ClassWizard will add and remove mapping macros here.
  ON_BN_CLICKED(102, OnBut1Click)    
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
..............................................
void CCompositControl::OnBut1Click()
{
 MessageBox("but1 clicked!");
}

Автор: srd 3.6.2005, 13:31
Цитата
Create не вызывается при "нединамическом" создании контрола. Такой способ подойдет только если вручную вызывать CCompositeControl::Create. И это то я то как раз так и сделал. Но при этом кнопки не создаются и не соответсвенно не прорисовываются, если если CCompositeControl создавать не с помощью Create, а посредством вставки в ресусурс CustomControl

Прошу прощения, я имел в виду не метод Create(), а обработчик сообщения WM_CREATE.

Цитата
Я так и делал, но к сожалению ничего не проходит. Вернее не проходит ничего, что хотя бы отдаленно напоминало событие нажатия кнопки

Странно, кнопка всегда отсылает своему родительскому окну уведомление о нажатии BN_CLICKED. Прийду домой, попробую создать проект и посмотреть.

Автор: Vyacheslav 3.6.2005, 13:34
Цитата(srd @ 3.6.2005, 13:31)
Странно, кнопка всегда отсылает своему родительскому окну уведомление о нажатии BN_CLICKED. Прийду домой, попробую создать проект и посмотреть.

Правильно. С этим я разобрался. Там была чисто моя ошибка. С WM_CREATE я проверю

Автор: Гость_прохожий 3.6.2005, 14:06
Цитата(Vyacheslav @ 3.6.2005, 13:34)
С WM_CREATE я проверю

Не заработает.

Надо переопределить PreSubclassWindow

Автор: Vyacheslav 3.6.2005, 14:18
И в PreSubclassWindow необходимые манипуляции по созданию кнопок выполнять ?

Автор: Гость_прохожий 3.6.2005, 14:48
smile

Автор: srd 3.6.2005, 16:30
Дома дождаться получения WM_CREATE у меня не получилось. И понятно почему, сабклассируется то уже созданное окно. А PreSubclassWindow действительно вызывется после вызова SubclassDlgItem(). Муторное это дело, создание элемента управления на основе ресурса диалога, проще уж руками.

Гость прохожий, почему не регистрируешься? Получил бы плюс к репутации smile

Автор: Гость_прохожий 6.6.2005, 12:06
Пока я только прохожий, если решу более ли менее постоянно зависнуть, так зарегюсь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)