как узнать, что окно загорожено другими окнами?
От: Ilya Fromsky  
Дата: 23.04.02 20:46
Оценка:
Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.
Re: как узнать, что окно загорожено другими окнами?
От: SWAN Украина  
Дата: 23.04.02 20:54
Оценка:
Здравствуйте Ilya Fromsky, Вы писали:

IF>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


IsWindowVisible
Re[2]: как узнать, что окно загорожено другими окнами?
От: Ilya Fromsky  
Дата: 23.04.02 21:05
Оценка:
Здравствуйте SWAN, Вы писали:

IF>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


SWAN>IsWindowVisible


Нет, не это. IsWindowVisible -> The visibility state of a window is indicated by the WS_VISIBLE style bit.
Окно может иметь стиль WS_VISIBLE и быть при это загорожено другим окном.
Re[3]: как узнать, что окно загорожено другими окнами?
От: SWAN Украина  
Дата: 23.04.02 21:15
Оценка:
Здравствуйте Ilya Fromsky, Вы писали:

IF>Здравствуйте SWAN, Вы писали:


IF>>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


SWAN>>IsWindowVisible


IF>Нет, не это. IsWindowVisible -> The visibility state of a window is indicated by the WS_VISIBLE style bit.

IF>Окно может иметь стиль WS_VISIBLE и быть при это загорожено другим окном.

А дочитать до конца я так понимаю просто лень

BOOL IsWindowVisible(
  HWND hWnd   // handle to window
);


Return Values
If the specified window, its parent window, its parent's parent window, and so forth, have the WS_VISIBLE style, the return value is nonzero. Otherwise, the return value is zero.

Because the return value specifies whether the window has the WS_VISIBLE style, it may be nonzero even if the window is totally obscured by other windows.

Последняя строка говорит про то что это ТО
Re[4]: как узнать, что окно загорожено другими окнами?
От: Ilya Fromsky  
Дата: 23.04.02 21:25
Оценка:
Здравствуйте SWAN, Вы писали:

IF>>>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


SWAN>>>IsWindowVisible


IF>>Нет, не это. IsWindowVisible -> The visibility state of a window is indicated by the WS_VISIBLE style bit.

IF>>Окно может иметь стиль WS_VISIBLE и быть при это загорожено другим окном.


SWAN>If the specified window, its parent window, its parent's parent window, and so forth, have the WS_VISIBLE style, the return value is nonzero. Otherwise, the return value is zero.


SWAN>Because the return value specifies whether the window has the WS_VISIBLE style, it may be nonzero even if the window is totally obscured by other windows.


SWAN>Последняя строка говорит про то что это ТО


И как узнать, что окно со стилем WS_VISIBLE загорожено?
IsWindowVisible будет всегда возвращать TRUE.
Re[5]: как узнать, что окно загорожено другими окнами?
От: SWAN Украина  
Дата: 23.04.02 21:38
Оценка:
Здравствуйте Ilya Fromsky, Вы писали:

IF>Здравствуйте SWAN, Вы писали:


IF>>>>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


SWAN>>>>IsWindowVisible


IF>>>Нет, не это. IsWindowVisible -> The visibility state of a window is indicated by the WS_VISIBLE style bit.

IF>>>Окно может иметь стиль WS_VISIBLE и быть при это загорожено другим окном.


SWAN>>If the specified window, its parent window, its parent's parent window, and so forth, have the WS_VISIBLE style, the return value is nonzero. Otherwise, the return value is zero.


SWAN>>Because the return value specifies whether the window has the WS_VISIBLE style, it may be nonzero even if the window is totally obscured by other windows.


SWAN>>Последняя строка говорит про то что это ТО


IF>И как узнать, что окно со стилем WS_VISIBLE загорожено?

IF>IsWindowVisible будет всегда возвращать TRUE.

Sorry — все таки я пишу быстрее чем думаю —
На данный момент могу только предложить EnumWindow которая enumerates all top-level windows on the screen
после чего для каждого делать к примеру UnionRect/IntersectRect и соответсвующим образом анализировать

это конечно плохой вариант — если придумаю что то лучше свистну
Re: как узнать, что окно загорожено другими окнами?
От: SWAN Украина  
Дата: 23.04.02 22:15
Оценка:
Здравствуйте Ilya Fromsky, Вы писали:

IF>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


Вот теперь хорошо подумавши могу сказать что это функция RectVisible
даже проверил — работает при WM_PAINT и если брать hDC через GetDC тоже
Re[2]: как узнать, что окно загорожено другими окнами?
От: Аноним  
Дата: 23.04.02 22:28
Оценка:
Здравствуйте SWAN, Вы писали:

IF>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


SWAN>Вот теперь хорошо подумавши :) могу сказать что это функция RectVisible

SWAN>даже проверил — работает при WM_PAINT и если брать hDC через GetDC тоже

Да, это то, что нужно.
Спасибо!
Re: как узнать, что окно загорожено другими окнами?
От: Кодт Россия  
Дата: 24.04.02 06:10
Оценка:
Здравствуйте Ilya Fromsky, Вы писали:

IF>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.


По таймеру проверяем, нужно ли обновлять данные (isInvalidData), и если да, то обновляем их и инвалидируем изображение (InvalidateWindow() или тому подобное).
По WM_PAINT перерисовываем окно и инвалидируем данные (isInvalidData = true).

Сценарий работы выглядит так:
WM_event | invalid | invalid | action
         | data    | window  |
---------+---------+---------+-------
           yes       yes
WM_PAINT    -> yes    -> no    paint

           yes        no
WM_TIMER    -> no     -> yes   update data, invalidate window

            no       yes
WM_PAINT    -> yes    -> no    paint

... это был нормальный цикл WM_TIMER -> WM_PAINT -> WM_TIMER...

окно перерисовано вне очереди (по просьбе ОС)

            no       yes
WM_PAINT    -> yes    -> no    paint
           yes        no
invalidate yes        -> yes
WM_PAINT    -> yes    -> no    paint again

окно закрыто, WM_PAINT не приходит, таймер работает в холостую

           yes        no
WM_TIMER    -> no     -> yes   update data, invalidate window
            no       yes
WM_TIMER    -> no     -> yes   idle


Таймер может быть не оконным, а мультимедийным. Можно, наконец, делать таймеры одного выстрела (по WM_PAINT запускать, а по WM_TIMER останавливать).
Это не столь существенно.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.