Страница 1 из 1

Программная установка оконного стиля

Добавлено: 28 мар 2005, 18:10
Gelert
Очередной мой вопрос по этой среде программирования.
Есть диалоговое окно, в свойствах мжно установить TopMOst=TRUE, что значит что окно будет поверх всех окон (Always On Top). А как сделать это программно, что пользователь сам выбирал, хочет ли он чтоб програ ьыла поверх всех окон или нет.
Короче мне нужна функция которая будет это устанавливать или снимать. типа SetTopMost().

Добавлено: 28 мар 2005, 18:15
Tima
Насколько я помню есть функция SetWindowPlacement. У нее один из параметров может задавать положение окошка. Если есть вопросы - в MSDN.

Добавлено: 28 мар 2005, 18:29
WinMain
Создаёшь окно функцией CreateWindowEx и в параметре dwExStyle указываешь константу WS_EX_TOPMOST.

Добавлено: 28 мар 2005, 19:30
Romeo
Tima, SetWindowPlacement может разместить окно поверх остальных единожды, в то время, как Gelert'у необходимо постоянное положение сверху. Это можно обеспечить лишь изменением соответствующего стиля. Gelert, если у тебя есть доступ к коду, создающему окно, то воспользуйся подсказкой WinMain'а. Или же если окно уже создано, то его стиль можно поменять следующим образом:

Код: Выделить всё

DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
dwStyle |= WS_EX_TOPMOST;
::SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle);

Добавлено: 28 мар 2005, 19:40
Romeo
Gelert, я поменял название темы. Постарайся давать информативные заголовки, этим ты окажешь помощь людям, которые отвечают на твои вопросы.

Добавлено: 28 мар 2005, 22:20
Gelert
Спасибо народ..
я тут еще покопался и нашел функцию SetWindowPos(...).

Добавлено: 28 мар 2005, 23:11
Romeo
Gelert, следует оперировать стилями, а не положением окна. SetWindowPos хороша только если окно требуется поместить поверх всех однократно, например по какому-то событию. Как только пользователь щёлкнит мышкой по любому другому окну, наше окно скроется под новым. Так вот, если же нужно, чтобы окно висело поверх постоянно (как TaskManager), без установки стиля не обойтись!

Добавлено: 29 мар 2005, 02:00
Gelert
Romeo, У меня все запахало... там первым параметром ставишь setTopMost - константуи все работает. Окно постоянно поверх всех остальных.
Тут по ходу дела возник один вопросик. Я недавно програмлю вод Visual, еще не совсем освоился, в том примере что ты привел
DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
dwStyle |= WS_EX_TOPMOST;
::SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle);
как получить указатель на окно (hWnd), который идет в качетве первого параметра функции GetWindowLong???
я поэтому и не стал работать со стилями. Если не затруднит поясни.

Добавлено: 29 мар 2005, 12:10
Tima
Romeo, вобщем у Gelert все получилось по SetWindowPos, а вот WinMain не прав. Gelert явно спросил
нужна функция которая будет это устанавливать или снимать
, а WinMain ответил что нужно вызывать CreateWindowEx - то есть использовать только один раз. А вот Romeo цитата из MSDN:
WS_EX_TOPMOST
Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.

Добавлено: 29 мар 2005, 12:17
Romeo
Если пользуешься MFC или WTL, то используй метод ModifyStyleEx класса CWnd или CWindow соответственно.