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


Автор: yurec 8.11.2007, 13:37
Привет

Создал диалоговое окно в другом окне, вызываю GetDlgItem с ид внутреннего диалога, функция фозвращает 0.
Подскажите, в чём проблема, пожалуйста.

"Remarks

You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes. As long as the hDlg parameter specifies a parent window and the child window has a unique identifier (as specified by the hMenu parameter in the CreateWindow or CreateWindowEx function that created the child window), GetDlgItem returns a valid handle to the child window. "

(msdn ::GetDlgItem)

Автор: Andrey44 8.11.2007, 13:49
Покажи код.
А когда ты вызываешь GetDlgItem?

Автор: yurec 8.11.2007, 14:00
в инитДиалоге вызываю m_dlg_inner.Create(IDD_INNER, this), после етого ( когда уже оба диалоги показались) и вызываю GetDlgItem(IDD_INNER)

Автор: Moonlit_angel 10.11.2007, 12:41
http://www.codeproject.com/miscctrl/AAArrayCtrlDemo.asp
Тут есть пример, как работать с детскими окнами. Может поможет... У мениа тоже проблема с этим была, мне помогло...

Автор: kurlyak 10.11.2007, 19:00
Я так понимаю, что у тебя два диалога CMainDlg предположим и второй дилог CDialog. Я не понимаю, зачем тебе вызывать GetDlgItem(IDD_INNER) в первом диалоге, если указатель на это окно, который ты ищешь уже есть в твоей переменной m_dlg_inner. Сделай ее глобальной, то есть так пишешь в файле .h класса CMainDlg:

Код

public:
    CDialog *dlg;


Потом пишешь в CMainDlg::InitDialog():

Код

         dlg=new CDialog();
    dlg->Create(IDD_DIALOG1, this);
    dlg->ShowWindow(SW_SHOW);


, насколько я правильно понял задачу, и потом пользуешься этой переменной dlg (она у тебя m_dlg_inner) в этом классе как хочешь и где угодно.

А вобще есть функция такая, которую используют в главном классе:
Код

CMainDlg *mydlg=(CMainDlg *) GetWindow(GW_CHILD);


Она возвращает все дочерние окна твоего класса CMainDlg в z-поряке. В приведенном примере функция возвращает значение CWnd*, если тебе надо получить HWND то пользуйся ::GetWindow().
Код

::GetWindow(AfxGetApp()->m_pMainWnd->m_hWnd, GW_CHILD);


Но вобще ты не рассказал, что ты будет потом делать с дочерним окном, может можно было сделать все проще. Если не в падло, расскажи по- подробнее, кали не получиться.

Добавлено через 8 минут и 19 секунд
Вобще я там неточность допустил, вроде так надо:
Код

CDialog *mydlg=(CDialog *) GetWindow(GW_CHILD);


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

Автор: kurlyak 10.11.2007, 19:30
А вобще замечу что в мсдн написано так как ты говорил:
Цитата

CWnd::GetDlgItem
This method retrieves a pointer to the specified control or child window in a dialog box or other window. The pointer returned is usually cast to the type of control identified by nID. 

Но заметь что я выделил "в диалоговом окне", то есть твое диалоговое окно- второе, оно вне твоего первого диалога. Значит тебе нужно делать твою переменную m_dlg_inner только глобальной в классе так:

Код

CDialog *m_dlg_inner;

либо так, скорее всего:
Код

CMySecondDlg *m_dlg_inner;

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