Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить идентификатор ресурса диалога 
:(
    Опции темы
deniska
Дата 18.1.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



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

Это сообщение отредактировал(а) deniska - 18.1.2010, 12:57
PM MAIL ICQ   Вверх
BorisVorontsov
Дата 18.1.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



GetDlgCtrlID


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Andrey44
Дата 19.1.2010, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Цитата(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.




--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
deniska
Дата 19.1.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Цитата

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

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

Это сообщение отредактировал(а) deniska - 19.1.2010, 13:09
PM MAIL ICQ   Вверх
BorisVorontsov
Дата 19.1.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: нет
Всего: 10



Аналог GetWindowLong GWL_ID

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

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

Это сообщение отредактировал(а) BorisVorontsov - 19.1.2010, 17:03


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Earnest
Дата 19.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
deniska
Дата 20.1.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



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

Есть диалог, набросаный в студийном редакторе ресурсов с неким идентификатором IDD_MYDIALOG. вот этот IDD_MYDIALOG мне и нужно получить в RunTime, имея указатель на созданый диалог типа CDialog*. Этот диалог top-most. Вот надеюсь теперь нормально обьяснил ))).
ПС. GetWindowLong тоже 0 возвращает.
PM MAIL ICQ   Вверх
Earnest
Дата 20.1.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Я так и думала. У 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);
   }
};




--------------------
...
PM   Вверх
SwallowSPB
Дата 20.1.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



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

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

Больше ничего в голову не приходит. :(
PM MAIL   Вверх
Earnest
Дата 20.1.2010, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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

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



--------------------
...
PM   Вверх
SwallowSPB
Дата 20.1.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) SwallowSPB - 20.1.2010, 21:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.