А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?
Здравствуйте, Лемминг, Вы писали:
Л>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?
А ты сначала докажи, что не работает.
Здравствуйте, kero, Вы писали:
K>Здравствуйте, Лемминг, Вы писали:
Л>>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?
K>А ты сначала докажи, что не работает.
У меня не работает. Говорит, Invalid Parameter. Без этого флага работает на ура.
Здравствуйте, kero, Вы писали:
K>Код? (И винда какая?)
Винда XP Pro. А код примерно такой:
...
handle = BeginDeferWindowPos(10);
// всякая фигня
while (e) {
// еще какая-то фигня
handle = DeferWindowPos( handle, e->hwnd, 0, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOSENDCHANGING );
if (!handle) {
errorcode = GetLastError();
break;
}
e = e->next;
}
if (handle) EndDeferWindowPos (handle);
Здравствуйте, Лемминг, Вы писали:
Л>Винда XP Pro. А код примерно такой:
[...]
Так вот вы о чем... Ну, см. MSDN — "EndDeferWindowPos Function":
Remarks
The EndDeferWindowPos function sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to each window identified in the internal structure.
А вы включаете SWP_NOSENDCHANGING и удивляетесь, что не работает
И с чего вы взяли, что "иначе возможно зацикливание"? Честно набросал себе пример (сдвиг нескольких кнопок по WM_SIZE их паренту) — таки OK.
Здравствуйте, 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 в цикле? Если второе, то пожалуй и смысла в этой бодяге никакого.
Здравствуйте, Лемминг, Вы писали:
Л>Кстати, есть информация, как именно работает EndDeferWindowPos —
Л>одномоментно перемещает все окна и затем рассылает им сообщения
Л>или поочередно перемещает каждое окно и сообщает ему об этом, как SetWindowPos в цикле?
Все же есть некоторая разница между *ED и *ING:
WM_WINDOWPOSCHANGING Notification
...
Remarks
...
An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS.
Делайте выводы.