Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизКак узнать, что мое окно находится над другим? Найти похожие ветки
← →
dmk © (2005-01-06 01:00) [0]Возможно ли это сделать без перечисления окон? (GetNextWindow и т.д.)
← →
Piter © (2005-01-06 01:12) [1]А зачем это нужно?
← →
Piter © (2005-01-06 01:12) [2]dmk © (06.01.05 1:00)
GetNextWindow и т.д
а это вряд ли поможет
← →
dmk © (2005-01-06 01:35) [3]Известны Handl"ы обоих окон. Мне нужно твердо быть уверенным, что мое окно находится над другим. У меня имеется функция
EnumWindowsProc которая перечисляет все окна и в случае
пересечения моего с другим происходит перерисовка части
содержимого окна в том месте, где окна пересекались.
Поскольку от системы невозможно получить регион пересечения
окон (при движении одного окна по другому), мне пришлось делать
это "ручками". В итоге у меня отбрасываются почти все окна:
невидимые, которые не пересекаются и т.д., но попадаются
некоторые которые не подходят под следующее условие -
Result(После этого окна перерисовываем содержимое)
:= ((ExWindowStyle and WS_EX_TOPMOST) <> 0) or
((ExWindowStyle and WS_EX_TOOLWINDOW) <> 0) or
((WindowStyle and WS_VISIBLE) <> 0);
Например окно Progman"а (оно тоже перечисляется). Оно всегда
видно, но за ним не надо ничего перерисовывать, т.к. я знаю, что
оно лежит всегда под моим окном, но программа этого знать не
может! Да и еще таких окон может быть много.
В общем нужно написать одну функцию, которая будет возвращать
относительную позицию в Z-Order"е относительно моего окна.
Хотя бы в виде True - False. Вот и бьюсь над этим.
← →
dmk © (2005-01-06 01:36) [4]>некоторые которые не подходят под следующее условие
Вернее подходят, но перерисовывать за ними не нужно.
← →
GuAV © (2005-01-06 01:46) [5]GetUpdateRect
← →
dmk © (2005-01-06 01:47) [6]Ну вопрос можно поставить еще так:
Как перечислить все окна находящиеся над моим?
Думаю EnumWindowsProc надо убирать и делать
перечисления с помощью GetNextWindow.
Если не прав - поправьте.
>GetNextWindow и т.д
>а это вряд ли поможет
Почему?
← →
GuAV © (2005-01-06 01:54) [7]
>Думаю EnumWindowsProc надо убирать и делать
> перечисления с помощью GetNextWindow.
???
EnumWindows перечисляет с учётом Z-order.
← →
dmk © (2005-01-06 02:01) [8]>GetUpdateRect
Вообще не реагирует на изменения в моем случае.
Т.е. она не реагирует на скроллинг содержимого окна.
>EnumWindows перечисляет с учётом Z-order.
В MSDN по этому поводу ни слова =(
Но если это так, то с откуда идет перечисление?
Сверху или снизу?
← →
dmk © (2005-01-06 02:03) [9]>В MSDN по этому поводу ни слова =(
По крайней мере в описании функций
EnumWindows, EnumDesktopWindows и EnumWindowsProc.
← →
GuAV © (2005-01-06 02:20) [10]
>>GetUpdateRect
> Вообще не реагирует на изменения в моем случае.
При чём скролинг ? Вроде как GetUpdateRect вернёт нужно ли рисовать или нет.
>В MSDN по этому поводу ни слова =(
Таки и я не нашел. Однако проверил: стабильно cверху вниз. Откуда взял это - не помню :-(
← →
dmk © (2005-01-06 02:30) [11]>При чём скролинг ? Вроде как GetUpdateRect вернёт нужно ли
>рисовать или нет.
У меня функция более универсальная. Она проверяет любое
затирание, в любом месте окна и при любом изменении
(скроллинге, изменении размеров окна, наезде окна на окно
и т.д.).
>Таки и я не нашел. Однако проверил: стабильно cверху вниз.
>Откуда взял это - не помню :-(
Завтра проверю. Если так, то уже легче. Tnx
← →
GuAV © (2005-01-06 02:36) [12]Ещё можно WindowFromPoint для каждой точки
← →
dmk © (2005-01-07 00:45) [13]>Ещё можно WindowFromPoint для каждой точки
Это не нужно.
>Однако проверил: стабильно cверху вниз.
>Откуда взял это - не помню :-(
А вот это правильно. Реально сверху вниз =)
Усё работает. Respect.
← →
Piter © (2005-01-07 02:06) [14]Усе работает говорите...
А например окна, которые поверх всех окон?
Или там терминальные окна...
← →
dmk © (2005-01-07 03:00) [15]Так все окна перечисляются =)
Даже Диспетчер задач.
Могу дать код если надо
← →
GanibalLector © (2005-01-07 03:28) [16]>Могу дать код если надо
Ну,если Вы так добры,то почему бы и нет.Спасибо ;)
← →
dmk © (2005-01-07 13:47) [17]http://dmk.interwave.ru/files/InColor_src.zip 482Kb
InfoPanel.pas
Function EnumWindowsProc(WindowHandle:HWND; Data:Pointer):Bool;stdcall;
Procedure TImageForm.RepaintImageAfterWindows(fX, fY, fPrevX, fPrevY, DeltaX, DeltaY: Integer; WndHandle:hWND);
Procedure TImageForm.RepaintTopFormIntersect(ImageX,ImageY:Integer; PrevImageX,PrevImageY, DeltaX,DeltaY:Integer; IntersectWND:hWND);
и т.д.
← →
GanibalLector © (2005-01-07 14:03) [18]2 dmk © (07.01.05 13:47) [17]
М-да...все по серьезному.
Сколько времени пишешь?
← →
dmk © (2005-01-07 15:01) [19]Около 2-х лет. Часов по 5 в неделю.
← →
Piter © (2005-01-07 15:05) [20]dmk © (07.01.05 3:00) [15]
я понимаю, что перечисляются все. Но разве в Z последовательности учитывается, что окно поверх всех? Там, имхо, учитываются только последние обращения.
Иными словами, окно может быть поверх всех остальных, но в получающейся Z последовательности оно будет в самом низу...
← →
dmk © (2005-01-07 17:49) [21]>Но разве в Z последовательности учитывается,
>что окно поверх всех?
На сколько я понял окно просто находится в списке(Z-Order) под
индексом опиывающим его положение относительно других окон.
А когда происходит выбор активного окна, то индексы у этих окон меняются согласно новому положению и происходит пересортировка
в Z-Order"е.
Щя напишу пример в котором постараюсь отобразить поведение
Z-Order"а.=)
← →
Piter © (2005-01-07 19:33) [22]ты одно скажи - окно, которое поверх все окон (даже если оно не активно), в Z последовательности первое?
← →
dmk © (2005-01-08 12:36) [23]>Piter © (07.01.05 19:33) [22]
Да.
http://dmk.interwave.ru/files/Z-Order_Sample.zip
Вот примерчик. Если нужно. Сделан в D7, хотя в D6 тоже должен компильнуться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c