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


Автор: deniska 18.1.2010, 12:57
Добрый день.
есть диалог, созданный через Create. 
Как получить его ресурсное ID, имея указатель на него типа CDialog*?
Спасибо

Автор: BorisVorontsov 18.1.2010, 20:34
GetDlgCtrlID

Автор: Andrey44 19.1.2010, 08:01
Цитата(BorisVorontsov @  18.1.2010,  20:34 Найти цитируемый пост)
GetDlgCtrlID
Если окно не со стилем WS_CHILD ничего не выйдет
Цитата(MSDN)

Returns the window or control ID value for any child window, not only that of a control in a dialog box.
Since top-level windows do not have an ID value, the return value of this function is invalid if the CWnd is a top-level window.


Автор: deniska 19.1.2010, 13:09
Цитата

Если окно не со стилем WS_CHILD ничего не выйдет

так и есть. забыл сразу написать что GetDlgCtrlID пробовал. возвращает 0.

Автор: BorisVorontsov 19.1.2010, 17:01
Аналог GetWindowLong GWL_ID

Цитата(deniska @  19.1.2010,  13:09 Найти цитируемый пост)
забыл сразу написать

Надо было сразу написать, что диалог top-level

Автор: Earnest 19.1.2010, 19:34
Цитата(deniska @  18.1.2010,  13:57 Найти цитируемый пост)
Как получить его ресурсное ID, имея указатель на него типа CDialog*?

А здесь не ид-р шаблона диалога подразумевается?

Автор: deniska 20.1.2010, 10:16
Цитата(Earnest @ 19.1.2010,  19:34)
А здесь не ид-р шаблона диалога подразумевается?

Есть диалог, набросаный в студийном редакторе ресурсов с неким идентификатором IDD_MYDIALOG. вот этот IDD_MYDIALOG мне и нужно получить в RunTime, имея указатель на созданый диалог типа CDialog*. Этот диалог top-most. Вот надеюсь теперь нормально обьяснил ))).
ПС. GetWindowLong тоже 0 возвращает.

Автор: Earnest 20.1.2010, 20:11
Я так и думала. У CDialog есть переменная класса m_lpszTemplateName; вот она и хранит этот IDD, если конечно диалог создавался именно по шаблону. В принципе, это указатель на строку, где может храниться имя диалогового ресурса либо номер - если 
HIWORD (m_lpszTemplateName) == 0. Проблема в том, что переменная эта protected, так что просто из диалога ее не извлечь. 
Поэтому 2 варианта:
1) Если предполагается делать свой класс - наследник диалога, то просто пишем соответствующий метод.
2) Если надо извлекать из любых CDialog, то поступаем примерно так:
Код

struct CDialogTraits: private CDialog
{
   static int GetDlgResID (const CDialog& Dlg)
   {
      LPCTSTR psResName = static_cast<const CDialogTraits&>(Dlg).m_lpszTemplateName;
      return HIWORD (psResName) ? 0 : LOWORD (psResName);
   }
};


Автор: SwallowSPB 20.1.2010, 20:16
Единственное, что приходит в голову поискать в ресурсах с помощью EnumResourceNames.

А так, диалог создается из ресурса с указанным ID. Потом ID выбрасывается. Поэтому принято его сохранять в классе, унаследованном от CDialog, в виде enum{IDD=ID_MYDIALOG};, чтобы потом использовать как ID либо CMyDialog::IDD.

Больше ничего в голову не приходит. :(

Автор: Earnest 20.1.2010, 20:27
Цитата(SwallowSPB @  20.1.2010,  21:16 Найти цитируемый пост)
Единственное, что приходит в голову поискать в ресурсах с помощью EnumResourceNames.

И что там искать?
Цитата(SwallowSPB @  20.1.2010,  21:16 Найти цитируемый пост)
 Потом ID выбрасывается.

Никуда он не выбрасывается. См. мой предыдущий пост.

Автор: SwallowSPB 20.1.2010, 21:36
Предполагал найти имена ресурсов-диалогов, передав в качестве типа RT_DIALOG. Если диалог в ресурсах один (как я понял), то найдено будет одно имя, соответствующее искомому диалогу.
Но может я и ошибаюсь. Надо будет попробовать.
 
А раз есть m_lpszTemplateName, то проще им и воспользоваться, как справедливо указано ранее.

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