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


Автор: EvgenyTS 6.1.2010, 11:17
 Создал свой контрол на основе СEdit. В функции OnCreate(LPCREATESTRUCT lpCreateStruct); своего контрола выполняю доп. функции нужные мне.
 Проблема в том, что когда я это контрол размещаю на диалоге. При открытии диалога, программа не заходит в функцию OnCreate моего контрола. Здесь я создаю контрол просто размещая на диалоге-формочке контрол CEdit и в .h диалога создаю переменную контрола и т.д.
 Если создавать контрол на диалоге вручную... т.е. создать объект, потом вызвать ф-цию OnCreat. то все ок.
 

Автор: Earnest 8.1.2010, 11:34
Контролы на диалоге из ресурса создаются внутри АПИ согласно шаблону. ДО того, как получит управление твой (и MFC) код. А WM_CREATE посылается именно при создании. Т.е. тогда, когда оконная функция еще не подменена. Если ты хочешь подставить эдит своего типа, то нужно использовать DDX_Control, а необходимые функции выполнить в функции PreSubclassWindow. 
В принципе, можно продублировать их и в OnCreate и в PresubclassWindow, чтобы твой конрол правильно создавался и динамически и из ресурса. 
Но есть тонкости: если ты собираешься создавать окно и динамически и из ресурсов, то нужно иметь в виду что при динамическом создании PreSubclass тоже вызывается, причем очень "неудачно" - так, что там нельзя создавить новые окна, иначе получишь море ругани. В общем, это тоже преодолимо, но если ты не создаешь окна в дополнительном коде или не собираешься поддерживать динамическок создание, то можно не морочить себе голову и просто вместо OnCreate сделать нужные вещи в PreSubclassWindow.

Автор: EvgenyTS 11.1.2010, 11:31
Цитата(Earnest @  8.1.2010,  11:34 Найти цитируемый пост)
но если ты не создаешь окна в дополнительном коде или не собираешься поддерживать динамическок создание, то можно не морочить себе голову и просто вместо OnCreate сделать нужные вещи в PreSubclassWindow. 

 
 Я как раз собираюсь создавать дополнительные 2 окна(кнопки) прямо на моем эдите. Так вот получается что программа заходит и в PreSubclassWindow сначала, а потом в OnCreat.
 Нужно чтоб можно было создавать и динамически, и из ресурсов, т.е. всеми возможными способами. Как тут быть?
 

Автор: Earnest 11.1.2010, 12:01
Тогда так:
1) Пишешь отдельную функцию, где создаешь свои доп. кнопки, например, InitButtons().
2) Вызываешь ее из OnCreate (для динамического создания)
3) В PresubclassWindos пишешь такой код (чтобы работало и из ресурсов)
Код

void CMyCoolWnd::PreSubclassWindow()
{
   base_class::PreSubclassWindow();

   // при динамическом создании тоже вызывается PreSubclass - из хука WH_CBT;
   // в этом случае создание доп. окон пропускаем (низзя создавать новые окна внутри хука) - подождем OnCreate
   _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
   if (pThreadState->m_pWndInit == 0)
      InitButtons();
}


Автор: EvgenyTS 11.1.2010, 12:35
Спасибо огромное, помогло!!!

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