DeferWindowPos не работает с SWP_NOSENDCHANGING
От: Лемминг  
Дата: 16.02.10 11:31
Оценка:
А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?
Re: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: kero Россия  
Дата: 16.02.10 11:58
Оценка:
Здравствуйте, Лемминг, Вы писали:

Л>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?


А ты сначала докажи, что не работает.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: Лемминг  
Дата: 16.02.10 12:04
Оценка:
Здравствуйте, kero, Вы писали:

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


Л>>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?


K>А ты сначала докажи, что не работает.


У меня не работает. Говорит, Invalid Parameter. Без этого флага работает на ура.
Re[3]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: kero Россия  
Дата: 16.02.10 13:20
Оценка:
Здравствуйте, Лемминг, Вы писали:

Л>У меня не работает. Говорит, Invalid Parameter. Без этого флага работает на ура.


Код? (И винда какая?)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: Лемминг  
Дата: 16.02.10 15:59
Оценка:
Здравствуйте, 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);
Re[5]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: kero Россия  
Дата: 16.02.10 18:49
Оценка:
Здравствуйте, Лемминг, Вы писали:

Л>Винда 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
Дата: 21.07.14
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 в цикле? Если второе, то пожалуй и смысла в этой бодяге никакого.
Re[7]: DeferWindowPos не работает с SWP_NOSENDCHANGING
От: kero Россия  
Дата: 17.02.10 13:32
Оценка:
Здравствуйте, Лемминг, Вы писали:

Л>Кстати, есть информация, как именно работает 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.

Делайте выводы.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.