| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Если окно не со стилем WS_CHILD ничего не выйдет
|
| Автор: deniska 19.1.2010, 13:09 | ||
так и есть. забыл сразу написать что GetDlgCtrlID пробовал. возвращает 0. |
| Автор: BorisVorontsov 19.1.2010, 17:01 |
| Аналог GetWindowLong GWL_ID Надо было сразу написать, что диалог top-level |
| Автор: Earnest 19.1.2010, 19:34 | ||
А здесь не ид-р шаблона диалога подразумевается? |
| Автор: deniska 20.1.2010, 10:16 | ||
Есть диалог, набросаный в студийном редакторе ресурсов с неким идентификатором 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, то поступаем примерно так:
|
| Автор: SwallowSPB 20.1.2010, 20:16 |
| Единственное, что приходит в голову поискать в ресурсах с помощью EnumResourceNames. А так, диалог создается из ресурса с указанным ID. Потом ID выбрасывается. Поэтому принято его сохранять в классе, унаследованном от CDialog, в виде enum{IDD=ID_MYDIALOG};, чтобы потом использовать как ID либо CMyDialog::IDD. Больше ничего в голову не приходит. :( |
| Автор: SwallowSPB 20.1.2010, 21:36 |
| Предполагал найти имена ресурсов-диалогов, передав в качестве типа RT_DIALOG. Если диалог в ресурсах один (как я понял), то найдено будет одно имя, соответствующее искомому диалогу. Но может я и ошибаюсь. Надо будет попробовать. А раз есть m_lpszTemplateName, то проще им и воспользоваться, как справедливо указано ранее. |