Диалог в Диалоге
От: yndtrud  
Дата: 05.03.08 06:36
Оценка:
Исправлено форматирование текста. — 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. Естественно.

Вопрос: каким же образом мне заставить сообщения обрабатываться

Мне кажется что я не знаю техники реализации таких окон. Может подскажите? Или ссылку какую кините.

Заранее спасибо.
Re: Диалог в Диалоге
От: Sashaka Россия  
Дата: 05.03.08 08:34
Оценка:
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 ?
Re[2]: Диалог в Диалоге
От: yndtrud  
Дата: 05.03.08 08:52
Оценка:
Удалено избыточное цитирование. — 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. Вот.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.