PDA

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



BAAR
13.08.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
14.08.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
15.08.2006, 14:55
Спасибо за помощь!