Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Окно по точке


Автор: merz 4.6.2002, 11:19
Для получения окна по точке существуют 2 функции
WindowFromPoint и ChildWindowFromPoint.
Мне необходимо получить дочернее окно в заданной точке.
Если родительское окно находится поверх остальных, то следующий код работает корректно:
Код

HWND hOutputText = WindowFromPoint(point);

Но оно может находится и не наверху!
Поэтому пишем следующий код:
Код

HWND hwndCurrWnd = NULL;
HWND hwndPrevWnd = this->m_hWnd;
hwndCurrWnd = ::ChildWindowFromPoint(hwndPrevWnd, point);
while (hwndCurrWnd != hwndPrevWnd)
{
hwndPrevWnd = hwndCurrWnd;
hwndCurrWnd = ::ChildWindowFromPoint(hwndPrevWnd, point);
}
return hwndPrevWnd;

но он возвращает совершенно другой результат!
В чем здесь собака зарыта?
С Уважением, Merz.

Автор: suborg 4.6.2002, 16:01
По-моему там если окно перекрыто другим окном, то оно не находится.

Автор: merz 4.6.2002, 16:35
В WindowFromPoint  так оно и есть
но ChildWindowFromPoint находится...

Автор: Sheff 4.6.2002, 20:40
ChildWindowFromPoint берёт хэндл дочернего окна по хэндлу родительского окна и точке. Но если твоё родительское окно закрыто другими окнами(который тоже являются родительскими), как же ты возьмёшь его хэндл с помощью ChildWindowFromPoint, ведь оно не является ни для кого дочерним.

Автор: merz 5.6.2002, 11:35
То есть, как я понял, ты хочешь сказать что у окна бывают 2 родителя?? Оригинально!

Автор: Sheff 5.6.2002, 11:47
Цитата(merz @ 05.6.2002, 12:35)
То есть, как я понял, ты хочешь сказать что у окна бывают 2 родителя?? Оригинально!

Я хочу сказать, что то твоё окно(родительское) не является ни для кого дочерним, разве что может для Explorer'а.

Автор: merz 5.6.2002, 11:57
Ну и что?
Дескриптор этого окна у меня есть:
Код

HWND hwndPrevWnd = this->m_hWnd;

Автор: Sheff 5.6.2002, 12:05
Цитата(merz @ 05.6.2002, 12:57)
Ну и что?
Дескриптор этого окна у меня есть:
Код

HWND hwndPrevWnd = this->m_hWnd;

А зачем тогда цикл, если ты знаешь хэндл этого самого родительского окна, разве нельзя взять Child вот так:
Код

HWND hwndPrevWnd = this->m_hWnd;
hwndCurrWnd = ::ChildWindowFromPoint(hwndPrevWnd, point);

hwndCurrWnd - будет хэндлом дочернего окна.

Автор: merz 5.6.2002, 12:07
То будет потомок - лежащий на самом дне z-буффера, а мне надо получить тот, что на самом верху (то есть ближе всего к нам)

Автор: Sheff 5.6.2002, 17:15
Цитата(merz @ 05.6.2002, 13:07)
То будет потомок - лежащий на самом дне z-буффера, а мне надо получить тот, что на самом верху (то есть ближе всего к нам)

Ааа, так у тебя в этом окне ещё и куча чаилдов, которые друг друга перекрывают. Если ты хочешь взять самого "верхнего" чайлда, то не лучше ли юзать GetWindow с флагом GW_CHILD ?

Автор: merz 6.6.2002, 09:20
Вобщем, пожоже разобрался я в этой проблеме..
Все дело в том, что окошко нужное - поле ввода на апплете
И как показал Spy++ у апплета нет родителя...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)