Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Как узнать, что мое окно находится над другим?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.036 c
3-1103539744
Tek
2004-12-20 13:49
2005.01.23
Подскажите плз, как перегнать таблицу с одной базы в другую..


3-1103466209
Алексей
2004-12-19 17:23
2005.01.23
Экспорт в готовый Excel-шаблон


6-1099305174
pavel_guzhanov
2004-11-01 13:32
2005.01.23
Взаимодействие Indy серверов


3-1103521649
WolandUSSR
2004-12-20 08:47
2005.01.23
Вставка BLOB поля в таблицу MySQL


9-1095732632
Jus
2004-09-21 06:10
2005.01.23
Хочу написать игру лоде-рунер(с редактором карт)на движке DelphiX