Re[6]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: Лемминг  
Дата: 17.02.10 09:52
Оценка:
Здравствуйте, kero, Вы писали:

K>Здравствуйте, Лемминг, Вы писали:


K>Так вот вы о чем... Ну, см. MSDN — "EndDeferWindowPos Function":

K>

Remarks
K>The EndDeferWindowPos function sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to each window identified in the internal structure.

K>А вы включаете SWP_NOSENDCHANGING и удивляетесь, что не работает

K>И с чего вы взяли, что "иначе возможно зацикливание"? Честно набросал себе пример (сдвиг нескольких кнопок по WM_SIZE их паренту) — таки OK.


Так и SetWindowPos посылает эти сообщения. Но если поставить флаг, то WM_WINDOWPOSCHANGING не посылается. Я наивно полагал, что EndDeferWindowPos будет вести себя так же. В документации по самой DeferWindowPos этот флаг описан как ни в чем не бывало (как всегда писали доку копипастом и забыли убрать лишнее ).

Насчет зацикливания — если в двух словах, у меня не только кнопки двигаются по WM_SIZE пэренту, но и размер пэрента может корректироваться по наличию в нем кнопок, отсюда и зацикливание. Конечно, оно маловероятно, но если сейчас оставить эти грабли, то рано или поздно я на них наступлю. Так что придется, наверное, вернуться к обычному SetWindowPos.

Кстати, есть информация, как именно работает EndDeferWindowPos — одномоментно перемещает все окна и затем рассылает им сообщения или поочередно перемещает каждое окно и сообщает ему об этом, как SetWindowPos в цикле? Если второе, то пожалуй и смысла в этой бодяге никакого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.