Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | Игры с DeferWindowPos (http://forum.oszone.net/showthread.php?t=46857)

pva 18-03-2005 13:46 307958

Win32 API | Игры с DeferWindowPos
 
1. можно ли естественным образом отменить DeferWindowPos? Я раскладываю окна и вдруг решил их переразложить, так и не доделав операцию (заканчивать её - пустая трата времени). Конечно, можно загнать заранее неверные параметры в DeferWindowPos, но хочется сделать это более культурно.

2. Что если в цикл с DeferWindowPos два раза засунуть одно и то же окно с разными параметрами? Будет две операции, последняя или неизвестно, какая?

hasherfrog 19-03-2005 21:05 308310

1. Имхо, нет. Даже просто "оборвать посылкой некорректных параметров" - и то неизвестно, как сделать. Судя по документации, память будет утекать и утекать.
2. Последняя, имхо. Если Вы дадите SWP_NOZORDER, то первый засыл не будет иметь для системы смысла. Если не укажите - то
Цитата:

If SWP_NOZORDER is not specified, the system places the window identified by the hWnd parameter in the position following the window identified by the hWndInsertAfter parameter. If hWndInsertAfter is NULL or HWND_TOP, the system places the hWnd window at the top of the Z order. If hWndInsertAfter is set to HWND_BOTTOM, the system places the hWnd window at the bottom of the Z order.
Хотя кто их там знает, чуваков из mS. Можно попробовать милион раз поочерёдно запихивать два онка в одно дерево и посмотреть, есть в конце концов "оборвется" DeferWindowPos - значит, оптимизации там нет 8(
Если вдруг надумаете попробовать - расскажите о результатах, ок?

pva 22-03-2005 10:29 308951

Пример задачи неверных параметров:
Код:

HWND parent = CreateWindow(..., GetDesktopWindow(), ...);
HWND child = CreateWindow(..., child, ...);

...
HDWP hdwp = BeginDeferWindowPos(...);

hdwp = DeferWindowPos(hdwp, parent, 0, 0, 0, 400, 300, SWP_NOZORDER|SWP_NOMOVE);
hdwp = DeferWindowPos(hdwp, child, 0, 0, 0, 100, 25, SWP_NOZORDER);
// hdwp is always 0 here

...
EndDeferWindowPos(hdwp);

в месте, помеченном комментарием, следуя SDK нужно забыть об hdwp и больше его не использовать. Это работает 100%, началось с того, что я такой глюк заметил.


Время: 19:23.

Время: 19:23.
© OSzone.net 2001-