Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Хэндл и идентификатор диалогового окна

8.4K
29 августа 2006 года
Sir
52 / / 28.07.2006
Подскажите, пожалуйста:

1) можно ли, зная ID диалогового окна получить его хэндл?
2) можно ли, зная хэндл диалогового окна получить его ID?

Понятно, что возможны ситуации, когда диалоговое окно еще/уже не существует.
6.6K
29 августа 2006 года
Scaiman
126 / / 25.07.2006
Вот разбирайся.
354
29 августа 2006 года
ШпиЁн
468 / / 19.02.2006
GetDlgCtrlID - получает ID по hwnd.
GetDlgItem - получает hwnd по ID.

Подробнее в msdn посмотри :-))))
8.4K
30 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=ШпиЁн]GetDlgCtrlID - получает ID по hwnd.
GetDlgItem - получает hwnd по ID.

Подробнее в msdn посмотри :-))))[/QUOTE]

К сожалению эти функции работают только для контролов, а не для самого диалогового окна.

В частности GetDlgCtrlID(hDlg) возвращает 0 (function fails),
а для GetDlgItem одним из параметров является hDlg, т.е. то, что мне в данном случае хотелось бы получить.
354
30 августа 2006 года
ШпиЁн
468 / / 19.02.2006
если хочешь получить hwnd самого диалогового окна, то способов море!
например WindowFromPoint - из указанной точки на экране получает окно, в которое эта точка попадает(можно использовать вместе с GetCursorPos - мышью выбираешь окно.)
4.8K
30 августа 2006 года
xm...
45 / / 20.11.2004
это чето стремный способ, лучше уж тогда по заголовку - FindWindow.
8.4K
30 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=ШпиЁн]если хочешь получить hwnd самого диалогового окна, то способов море!
например WindowFromPoint - из указанной точки на экране получает окно, в которое эта точка попадает(можно использовать вместе с GetCursorPos - мышью выбираешь окно.)[/QUOTE]

У меня следующая проблема. Главное окно приложения — диалоговое модальное. В нем разные кнопки, при нажатии на которые открываются другие диалоговые окна, и т.д. Так как я сделал главное окно приложения диалоговым, то вместе со всеми плюсами, которые дал менеджер диалогового окна (dialog box manager), я получил и минусы (например, невозможность отловить нажатие на Esc и Enter, проблема с акселераторами, и т.д.).

Поэтому я поставил хук WH_GETMESSAGE на свой поток и могу обрабатывать все интересующие сообщения (спасибо ШпиЁну). Так вот, в фильтрующей функции этого хука я могу узнать хэндл окна, которому предназначается сообщение. В этой функции мне нужно знать хэндлы своих диалоговых окон, чтобы для одних окон (или их контролов) обрабатывать одни сообщения, а для других — другие.

Можно ли решить эту проблему без использования глобальных переменных?
1.8K
30 августа 2006 года
k3Eahn
365 / / 19.12.2005
А чем не устраивают немодальные диалоги(CreateDialogParam)?
354
30 августа 2006 года
ШпиЁн
468 / / 19.02.2006
я думал что тебе надо получить на чужом окне:-))))

я не знаю почему ты не хочешь использовать глобальные переменные:)))) удобно. просто.
8.4K
30 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=Sir]1) можно ли, зная ID диалогового окна получить его хэндл?
[/QUOTE]

Нет нельзя, т.к. на основе шаблона, определенного в ресурсах с соответствующим ID, можно создать несколько диалоговых окон.

[QUOTE=Sir]2) можно ли, зная хэндл диалогового окна получить его ID?[/QUOTE]

GetWindowLong (hWnd, GWL_ID). Но в силу преведенного выше довода практическая польза с такой операции минимальна.

[QUOTE=k3Eahn]А чем не устраивают немодальные диалоги(CreateDialogParam)?[/QUOTE]

Да вобщем-то всем устраивают. Просто не хочется немодальным диалогом иммитировать поведение модального. Кроме того хэндл, возвращаемый CreateDialog, все-равно нужно делать глобальным, чтобы он был виден в фильтрующей функции хука. Неговоря уже о ситуации, когда в одном немодальном диалоговом окне создается другое, а в нем следующее и т.д.

[QUOTE=ШпиЁн]я не знаю почему ты не хочешь использовать глобальные переменные))) удобно. просто.[/QUOTE]

Я не сторонник вводить дополнительные глобальные переменные, если можно обойтись без них (принцип инкапсуляции ООП) :)
Но похоже эту проблему по-другому не решить. Придется заводить глобальные переменные для каждого диалогового окна.

Всем спасибо. Тема закрыта.
8.4K
31 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=Sir]Но похоже эту проблему по-другому не решить. Придется заводить глобальные переменные для каждого диалогового окна.
[/QUOTE]

Можно и без глобальных !!!

Сразу после создания любого окна нужно его пометить:

DWORD dw = 1;
SetWindowLong (hWnd, GWL_USERDATA, dw);

Далее в перехватчике:

switch (GetWindowLong (hWnd, GWL_USERDATA))
{
case 1:
...
break;

case 2:
...
break;

...
}
9.8K
07 сентября 2006 года
lifer
27 / / 30.03.2006
А метод CWinApp::PreTranslateMessage пробовал?
8.4K
08 сентября 2006 года
Sir
52 / / 28.07.2006
[QUOTE=lifer]А метод CWinApp::PreTranslateMessage пробовал?[/QUOTE]

Это не MFC, а чистый WinAPI

:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог