Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1105287810
Ph2005
2005-01-09 19:23
2005.01.23
Печать html страниц


10-1081225251
Djon1111
2004-04-06 08:20
2005.01.23
Изменение размеров страницы в Excell


3-1103656778
Guitar
2004-12-21 22:19
2005.01.23
Какое событие происходит и как его обработать?


11-1087105674
Genie
2004-06-13 09:47
2005.01.23
Работа с Internet


4-1101905484
Stefan
2004-12-01 15:51
2005.01.23
Ошибка RegisterServiceProcess в NT-подобных системах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский