Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание композитных контролов 
:(
    Опции темы
Vyacheslav
Дата 27.5.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 59



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

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 - это все что угодно и возможно даже замечательная библиотека, но к ООП имеет весьма отдаленное отношение.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
srd
Дата 28.5.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 5
Всего: 49



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

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

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

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



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Vyacheslav
Дата 30.5.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 59



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
oper54
Дата 30.5.2005, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 13.5.2005

Репутация: нет
Всего: 1



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

..............................................
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!");
}

PM MAIL   Вверх
srd
Дата 3.6.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 5
Всего: 49



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

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

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

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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Vyacheslav
Дата 3.6.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 59



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

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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Гость_прохожий
Дата 3.6.2005, 14:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Vyacheslav @ 3.6.2005, 13:34)
С WM_CREATE я проверю

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

Надо переопределить PreSubclassWindow
  Вверх
Vyacheslav
Дата 3.6.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 59



И в PreSubclassWindow необходимые манипуляции по созданию кнопок выполнять ?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Гость_прохожий
Дата 3.6.2005, 14:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile
  Вверх
srd
Дата 3.6.2005, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 5
Всего: 49



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

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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Гость_прохожий
Дата 6.6.2005, 12:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пока я только прохожий, если решу более ли менее постоянно зависнуть, так зарегюсь smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1188 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.