Здравствуйте Ilya Fromsky, Вы писали:
IF>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.
IsWindowVisible
Re[2]: как узнать, что окно загорожено другими окнами?
Здравствуйте SWAN, Вы писали:
IF>>Например, дочернее окно автоматически обновляется каждую секунду. Но если оно загорожено другими окнами, оно не должно обновлять инфомацию.
SWAN>IsWindowVisible
Нет, не это. IsWindowVisible -> The visibility state of a window is indicated by the WS_VISIBLE style bit.
Окно может иметь стиль WS_VISIBLE и быть при это загорожено другим окном.
Re[3]: как узнать, что окно загорожено другими окнами?
Здравствуйте 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]: как узнать, что окно загорожено другими окнами?
Здравствуйте 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]: как узнать, что окно загорожено другими окнами?
Здравствуйте 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: как узнать, что окно загорожено другими окнами?
Здравствуйте 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: как узнать, что окно загорожено другими окнами?
Здравствуйте 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 останавливать).
Это не столь существенно.