Исправлено форматирование текста. — SchweinDeBurg
День добрый.
Господа не подскажите как реализивоать то что мне нужно.
А нужно:
Есть класс CDialogA наследник CDialog.
IDD в нем например IDD_A_DIALOG (лежит в ресурсах)
есть некотрые переменные — члены класса. DDX к ним.
и одна важная m_uiTemplate по умолчанию у становленная в ноль
в программе делаем
CDialogA dlgA;
dlgA.DoModal();
Все прекрассно, все работает.
Теперь проблемка:
Есть класс CDialogB наследник CDialogA
IDD в нем неважен.
В конструкторе с CDialogB я устанавливаю m_uiTemplate (из родительского класса CDialogA) в IDD_B_DIALOG.
IDD_B_DIALOG есть в ресурсах (стиль окна CHILD, CONTROL, CLIPSIBLINGS).
Так же в CDialogB есть свои переменные и они связанны DDXом.
Задача.
Надо вставить CDialogB в CDialogA. Допустим в центр окна (для простоты примера).
Тоесть CDialogA создается со своим шаблоном IDD_A_DIALOG, а в CDialogA::OnInitDialog() создается дочернее окно на основе m_uiTemplate (если она не ноль). В нашем случае равная IDD_B_DIALOG.
Я пытался многими способами сделать это но не вышло
Единственно что-то похожее на правду получилась при
class CDialogA::public CDialog{
....
...
CDialog m_pChildDlg;
}
CDialogA::OnInitDialog(){
CDialog::OnInitDialog()
if(uiTemplate){
m_pChildDlg.Create(uiTemplate, this);
m_pChildDlg.ShowWindow(SW_SHOW);
}
.......................
}
Но при таком способе сообщения от контролов (IDD_B_DIALOG) не доходят до DDX от CDialogB. Естественно.
Вопрос: каким же образом мне заставить сообщения обрабатываться
Мне кажется что я не знаю техники реализации таких окон. Может подскажите? Или ссылку какую кините.
Заранее спасибо.
Y>Единственно что-то похожее на правду получилась при
Y>class CDialogA::public CDialog{
Y>....
Y>...
Y>CDialog m_pChildDlg;
Y>}
Y>CDialogA::OnInitDialog(){
Y>CDialog::OnInitDialog()
Y>if(uiTemplate){
Y> m_pChildDlg.Create(uiTemplate, this);
Y> m_pChildDlg.ShowWindow(SW_SHOW);
Y>}
Y>.......................
Y>}
так и надо.
Y>Но при таком способе сообщения от контролов (IDD_B_DIALOG) не доходят до DDX от CDialogB. Естественно.
в DDX прописанный в CDialogB все должно приходить
Y>Вопрос: каким же образом мне заставить сообщения обрабатываться
Y>Мне кажется что я не знаю техники реализации таких окон. Может подскажите? Или ссылку какую кините.
Y>Заранее спасибо.
так и делать, все долно работать, у меня есть проект где все работает, там есть главный диалог и куча дочерних, переключаемых (типа таб контрола только без него),
так вот дочерние создаются именно так:
for (int i=0; i<DLG_COUNT; i++)
{
m_pTab[i]=new CTabDlg(IDD_DIALOG1+i);
m_pTab[i]->Create(IDD_DIALOG1+i);
m_pTab[i]->MoveWindow(TAB_POS_X,TAB_POS_Y,m_pTab[i]->m_nWidth,m_pTab[i]->m_nHeight,true);
}
m_pTab[m_nSel]->ShowWindow(SW_SHOW);
ты UpdateData может не вызываешь _для_ CDialogB ?
Удалено избыточное цитирование. — SchweinDeBurg
Здравствуйте, Sashaka, Вы писали:
S>ты UpdateData может не вызываешь _для_ CDialogB ?
Обрати внимание что ты создаешь диалоги на основе CTabDlg. То есть на сколько я понимаю у тебя есть
class CSashakaDialog::public CDialog{
....
}
где то еще у тебя есть
class CTabDlg::public CDialog{
}
И в CSashakaDialog::OnInitDialog ты
{
CDialog::OnInitDialog();
for (int i=0; i<DLG_COUNT; i++)
{
m_pTab[i]=new CTabDlg(IDD_DIALOG1+i);
m_pTab[i]->Create(IDD_DIALOG1+i);
m_pTab[i]->MoveWindow(TAB_POS_X,TAB_POS_Y,m_pTab[i]->m_nWidth,m_pTab[i]->m_nHeight,true);
}
m_pTab[m_nSel]->ShowWindow(SW_SHOW);
Да это быдет работать так как DDX у тебя в CTabDlg.
Я же парюсь не с этим:
Пусть у тебя нет CTabDlg. А есть просто CDialog.
Смотри:
class CDialogA:public CDialog (свой шаблон)
class CDialogB:public CDialogA (устанвливает в конструкоре дополнительный шаблон (в переменную член класса CDialogA)
то есть это один и тот же объект CDialog
На CDialogA::OnInitDialog
Должно нужно создать Child Dialog на основе указанного шаблона и заставить сообщения приходить В CDialogB (что есть одно и тоже при наследовании CDialogA).
Они доходят так как Child создан у меня на основе просто CDialog.
Каким то оброзом надо мой Child заставить сначала посылать сообщения в CDialogB (CDialogA). и если CDialogB не обработает их то нужно возвращать обработку в Child. Вот.