Помогите!! Как найти дескриптор дочернего диалогового окна?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
BAAR
Сообщения: 2
Зарегистрирован: 13 авг 2006, 13:00
Откуда: Minsk
Контактная информация:

13 авг 2006, 13:09

Помогите разобраться с данной проблемой:
Имеется программа со множеством дочерних окон типа edit button и т.д.
Я написал маленькую програмку получающую дескриптор каждого дочернего окна.
Все было бы хорошо, но когда открываешь какое-нибудь окно типа About или propertis,
которые вроде как тоже являются дочерними к главному окну, моя програмка их не
не обнаруживает. Так как эти окна модальные я взял их дескриптор с помощью
функции GetNextWindow. Теперь программа проверяет родителя диалогового окна
и выясняется что родителем является то самое главное окно.
ВОПРОС: ПОЧЕМУ НИЖЕ ПРИВЕДЕННЫЙ КОД НЕ ВОСПРИНИМАЕТ ДИАЛОГОВОЕ ОКНО КАК ДОЧЕРНЕЕ???

Код: Выделить всё

#include <windows.h>
#include <iostream.h>
HWND hMain;
LPARAM lParam;
HWND hOverWindow;
HWND hTemp;
char lpString[100];

//----------Обработчик дочерних окон-----------\\
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam){  
	GetWindowText(hwnd,lpString,100);
	cout<<lpString<<hwnd<<endl;
	return true;
	}
//-------------------------------------------------------\\

int main(int argc, char* argv[])
{
    if((hMain=FindWindow("BuddyMain",NULL))!=NULL){ //Дескриптор главного окна

         EnumChildWindows(hYahooMain,EnumChildProc,lParam);//Определяем дочерние окна
         hOverWindow=GetNextWindow(hYahooMain,GW_HWNDPREV);//Определяем дескриптор модального диалогового окна
	GetWindowText(hOverWindow,lpString,100);
	cout<<lpString<<hOverWindow<<endl;
	hTemp=GetParent(hOverWindow);
	if(hYahooMain==hTemp) cout<<"nichego ne ponimayu";// выясняем родителя диальгового окна
        }
    }

    return 0;
}
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

14 авг 2006, 20:51

Диалоговое окно не является дочерним по отношению к главному, для них используется другое отношение - ownership (владение). Т.е. главное окно - owner, а диалоговое - owned window. Дескриптор владельца окна возвращает функция GetWindow(<...>, GW_OWNER). Отношение владения устанавливается между т.н. окнами верхнего уровня (имеют тип WS_OVERLAPPED или WS_POPUP) и фактически означает следующее:
1) владеемое окно всегда находится над владельцем в Z-порядке;
2) при изменении видимости владельца аналогично меняется видимость владеемых им окон;
3) при разрушении владельца автоматически разрушаются владеемые им окна.

Отношение parent/child другое: дочерние окна всегда имеют тип WS_CHILD, а их родители могут быть любого типа. Дочернее окно гораздо теснее связано с родителем, чем владеемое окно с владельцем. В частности, оно всегда позиционируется и отображается в клиентской области родительского окна.

Функция GetNextWindow() работает независимо с тремя иерархиями окон (topmost, top-level и child), возвращая следующее/предыдущее окно в Z-порядке той иерархии, которой принадлежит опрашиваемое окно. Например, можно с ее помощью выполнить ту же работу, что и EnumChildWindows(), если в качестве 1-го параметра передать дескриптор первого дочернего окна (относительно данного родителя) и пройтись в цикле по всем окнам данной иерархии.
BAAR
Сообщения: 2
Зарегистрирован: 13 авг 2006, 13:00
Откуда: Minsk
Контактная информация:

15 авг 2006, 14:55

Спасибо за помощь!
Ответить