Здравствуйте, 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 в цикле? Если второе, то пожалуй и смысла в этой бодяге никакого.