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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Очередной мой вопрос по этой среде программирования.
Есть диалоговое окно, в свойствах мжно установить TopMOst=TRUE, что значит что окно будет поверх всех окон (Always On Top). А как сделать это программно, что пользователь сам выбирал, хочет ли он чтоб програ ьыла поверх всех окон или нет.
Короче мне нужна функция которая будет это устанавливать или снимать. типа SetTopMost().
Tima
Сообщения: 43
Зарегистрирован: 23 сен 2004, 11:17
Откуда: Харьков
Контактная информация:

Насколько я помню есть функция SetWindowPlacement. У нее один из параметров может задавать положение окошка. Если есть вопросы - в MSDN.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Создаёшь окно функцией CreateWindowEx и в параметре dwExStyle указываешь константу WS_EX_TOPMOST.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

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

DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
dwStyle |= WS_EX_TOPMOST;
::SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Gelert, я поменял название темы. Постарайся давать информативные заголовки, этим ты окажешь помощь людям, которые отвечают на твои вопросы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Спасибо народ..
я тут еще покопался и нашел функцию SetWindowPos(...).
Мужчина должен уметь делать все, кроме как рожать детей и трахаться в задницу.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Gelert, следует оперировать стилями, а не положением окна. SetWindowPos хороша только если окно требуется поместить поверх всех однократно, например по какому-то событию. Как только пользователь щёлкнит мышкой по любому другому окну, наше окно скроется под новым. Так вот, если же нужно, чтобы окно висело поверх постоянно (как TaskManager), без установки стиля не обойтись!
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Romeo, У меня все запахало... там первым параметром ставишь setTopMost - константуи все работает. Окно постоянно поверх всех остальных.
Тут по ходу дела возник один вопросик. Я недавно програмлю вод Visual, еще не совсем освоился, в том примере что ты привел
DWORD dwStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
dwStyle |= WS_EX_TOPMOST;
::SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle);
как получить указатель на окно (hWnd), который идет в качетве первого параметра функции GetWindowLong???
я поэтому и не стал работать со стилями. Если не затруднит поясни.
Мужчина должен уметь делать все, кроме как рожать детей и трахаться в задницу.
Tima
Сообщения: 43
Зарегистрирован: 23 сен 2004, 11:17
Откуда: Харьков
Контактная информация:

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.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если пользуешься MFC или WTL, то используй метод ModifyStyleEx класса CWnd или CWindow соответственно.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить