Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как определить видимую часть окна?


Автор: voov 18.8.2008, 13:16
Во время отрисовки окна нужно определить его видимую часть.
GetClientRect - возвращает клиентскую часть окна, но не всегда эта часть полностью видима, иногда часть клиентской области перекрыта и в таких случаях мне нужно нарисовать маркер.
Так вот как узнать какая часть клиентской области окна видимая?

Автор: Earnest 18.8.2008, 16:35
У CPaintDC можно спросить GetClipBox - возвращаемое значение дает некоторое представление, перекрыта ли часть окна. Если это так, можно дальше спросить GetClipRgn, если тебе нужна точная раскладка по прямоугольникам.

Автор: voov 20.8.2008, 10:57
Че-то не получается... GetClipBox всегда возвращает NULLREGION.
Нужно както по другому определять. 

Может не достаточно обрисовал ситуацию, объясню подробнее. 
Несколько окон нахидятся в перемещаемой панели. Панель можно таскать мышкой на границы - изменять ее размер. При этом изменяется и размер дочерних окон. Окна можно уменьшать до определенного момента (есть минимальный размер), после которого размер панели все еще уменьшается, а дочерние окна остаются минимального размера, но видны не полностью. Например (меня интересует именно эта ситуация), не видна нижняя часть окна.

Автор: voov 20.8.2008, 11:52
Пока сделал через PtVisible. Определяю видима ли нижняя левая точка окна. Если нет, то нахожу самую нижнюю видимую точку и от нее рисую маркер.
Работает, но хотелось бы более элегантное решение.

Автор: Earnest 20.8.2008, 11:59
Ясно, окно не перекрыто, а просто отсечено родителем... Хм...
А попробуй проверить WindowRect и как он соотносится с родительским?
А еще, ведь эта ситуация возникает в какой-то определенный момент (панель уменьшается), и это делает именно твой код (ну не твой, но доступный тебе). Нельзя ли в этот момент поставить флаг?

Автор: voov 20.8.2008, 13:24
Цитата(Earnest @  20.8.2008,  11:59 Найти цитируемый пост)
А попробуй проверить WindowRect и как он соотносится с родительским?

Об этом думал, но не хочется впутывать родителя в отрисовку дочернего окна.

Цитата(Earnest @  20.8.2008,  11:59 Найти цитируемый пост)
Нельзя ли в этот момент поставить флаг?

С этой стороны не заходил, зациклился на отрисовке. Можно конечно. Но в этом случае все равно нужно определять самую нижнюю видимую точку в дочернем окне для отрисовки маркера.
Можно конечно вместе с флагом и размер видимой области передавать, но тогда уже помоему проще сравнивать WindowRect дечернего окна с родительским. Наверное на этом и остановлюсь.

Автор: Earnest 20.8.2008, 13:56
Цитата(voov @  20.8.2008,  14:24 Найти цитируемый пост)
Об этом думал, но не хочется впутывать родителя в отрисовку дочернего окна.

Дык кто просит? Дочернее окно не может проверить WindowRect свой и родителя?

Цитата(voov @  20.8.2008,  14:24 Найти цитируемый пост)
 Но в этом случае все равно нужно определять самую нижнюю видимую точку в дочернем окне для отрисовки маркера.

Насчет флага, мне уже не кажется мысль такой умной. Тем более все равно нужно искать границы. А всять два ректа и пересечь - делов-то...

Автор: voov 20.8.2008, 14:33
Пересек. Получилось то, что нужно и довольно красиво.
Earnest, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)