А как сделать форму совсем модальной?
При этом моя прога может быть где-то на бакграунде.
Я не хочу выводить эту новую форму как ShowModal(), так как тогда на главной форме нельзя будет на кнопки жать. (и почему-то не помогат это ShowModal, другие приложения перебивают мое окно)
И на форме стоит FormStyle=fsStayOnTop;
Собсна вопрос:
Как сделать мою форму OnTop???
вообще-то если у формы стоит StayOnTop, то она итак поверх всех окон должна быть... ты хочешь сказать, что тебе это не помогает?
именно это я и хочу сказать :(
вот моя форма:
object blk_frm: Tblk_frm
Left = 351
Top = 448
BorderIcons = []
BorderStyle = bsNone
Caption = 'blk_frm'
ClientHeight = 34
ClientWidth = 360
Color = clBlack
FormStyle = fsStayOnTop
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
и она все равно скрывается, когда я в другую прогу иду...
именно это я и хочу сказать :(
вот моя форма:
object blk_frm: Tblk_frm
Left = 351
Top = 448
BorderIcons = []
BorderStyle = bsNone
Caption = 'blk_frm'
ClientHeight = 34
ClientWidth = 360
Color = clBlack
FormStyle = fsStayOnTop
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
и она все равно скрывается, когда я в другую прогу иду...
Борланд не знаю, но попробуй с помощью Windows API:
SetWindowPos(hWnd, HWND_TOPMOST, x, y, cx, cy, 0);
именно это я и хочу сказать :(
вот моя форма:
object blk_frm: Tblk_frm
Left = 351
Top = 448
BorderIcons = []
BorderStyle = bsNone
Caption = 'blk_frm'
ClientHeight = 34
ClientWidth = 360
Color = clBlack
FormStyle = fsStayOnTop
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
и она все равно скрывается, когда я в другую прогу иду...
действительно хрень какая-то - работает так как надо, то есть поверх всех только если это главная форма приложения... а для дочерних форм это почему-то не выполняется :((( - глюк!!!
действительно хрень какая-то - работает так как надо, то есть поверх всех только если это главная форма приложения... а для дочерних форм это почему-то не выполняется :((( - глюк!!!
Она не обязательно должна быть главной. Можно же в MDI приложении создать недочернюю форму. А для дочерних, по-моему, логично - они ж дочерние :)
под дочерней я имею ввиду не форму в MDI приложнии, а вообще любую форму которая не главная - просто неправильно выразился...
Понятно.
Но всёж-таки можно не-main форму заставить быть сверху. Сразу не скажу как, но можно. Аккуратно проследить как и когда она создается; обновить её во-время... Там кажется есть заморочка с Refresh(): он вызывает несколько других методов, причем не всегда одни и те же.
А задача, видимо, сделать сплэш? (ту картинку, которая бережет нервы юзера во время неспешной загрузки программы :) ) Если очень надо, могу найти проект со сплэшем, посмотрю точнее.
Понятно.
Но всёж-таки можно не-main форму заставить быть сверху. Сразу не скажу как, но можно. Аккуратно проследить как и когда она создается; обновить её во-время... Там кажется есть заморочка с Refresh(): он вызывает несколько других методов, причем не всегда одни и те же.
А задача, видимо, сделать сплэш? (ту картинку, которая бережет нервы юзера во время неспешной загрузки программы :) ) Если очень надо, могу найти проект со сплэшем, посмотрю точнее.
Хм... рефрешать... по-моему это несколько геморройно... это же как оно будет грузить систему...
Вот та же аська, как же оно-то делается stay_on_top...
Попробовал
SetWindowPos(hWnd, HWND_TOPMOST, x, y, cx, cy, 0); - не хочет оно делаться стайонтоп :( Хотя ен ругается, что не видит такой функции, но по f7 внутрь не заходит. Может я чего-то не прописал, нужно для апеишных функций что-либо инклудить?
Нет, я не хочу делать заставку при загрузке. Там был одby пример в экзамплах гдей-то, но мне кажется, что это несколько другой механизм...
у аськи получается потому что там главное окно... с этим то проблем нет...
Что значит главное окно? :D
В Windows есть родительские и дочерние окна, никаких главных окон нет.
В общем случае окно создается с помощью CreateWindow, и что-то я не вижу среди аргументов указания на то, что окно главное или нет.
УЧИТЕ МАТЧАСТЬ!
Попробовал
SetWindowPos(hWnd, HWND_TOPMOST, x, y, cx, cy, 0); - не хочет оно делаться стайонтоп :( Хотя ен ругается, что не видит такой функции, но по f7 внутрь не заходит. Может я чего-то не прописал, нужно для апеишных функций что-либо инклудить?
Глупости.
Может ты просто скопировал строку кода?
Тогда понятно. Параметры то нужно указывать.
BOOL SetWindowPos(
HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
Вот так все получится:
void __fastcall TForm2::FormShow(TObject *Sender)
{
SetWindowPos(Form2->Handle,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
}
Что значит главное окно? :D
В Windows есть родительские и дочерние окна, никаких главных окон нет.
В общем случае окно создается с помощью CreateWindow, и что-то я не вижу среди аргументов указания на то, что окно главное или нет.
УЧИТЕ МАТЧАСТЬ!
А что знание IE и клавиатуры, вкупе с http://forum.codenet.ru не избавляет от необходимости знать матчасть???=)
LOL
главное - по аналогии с MainForm - то есть окно которое создается первым... родительские и дочерние окна - это только в MDI приложениях...
SetWindowPos - функция Win32API, т.о. говорим в контексте Win32API.
Так вот, никаких MainForm в Windows НЕТ.
Сл-но, и никаких главных окон тоже НЕТ.
И нет разницы первым это окно создали, вторым и т.д.
А в качестве дочернего окна рассмотрим кнопочку на любом диалоге. Так вот, она - есть дочернее окно по отношению к диалоговому окну, а диалоговое окно - есть родительское окно по отношению к кнопочке. И так со всеми контролами, не только с кнопочками.
Так что MDI - лишь относительно редкий частный случай соотношения дочернее-родительское окно.
SetWindowPos(Form2->Handle,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);
вот так вот я и пробовал, но не работает оно как надо...
То есть, оно становиться типа он_топ, но только пока мое приложение активно... Как только я сворачиваю свое приложение, или кликаю на другом - эта он_топ_форма скрывается...
Цель же, заставить форму висеть поверх всего!!
Как в аське. То, что в аське висит - главная форма, я думаю, значения не имеет - если можно заставить (а ведь можно как-то) главное висеть так, то можно и не главное так же заставить - апишным функциям без разницы...
SetWindowPos - функция Win32API, т.о. говорим в контексте Win32API.
Так вот, никаких MainForm в Windows НЕТ.
Сл-но, и никаких главных окон тоже НЕТ.
И нет разницы первым это окно создали, вторым и т.д.
А в качестве дочернего окна рассмотрим кнопочку на любом диалоге. Так вот, она - есть дочернее окно по отношению к диалоговому окну, а диалоговое окно - есть родительское окно по отношению к кнопочке. И так со всеми контролами, не только с кнопочками.
Так что MDI - лишь относительно редкий частный случай соотношения дочернее-родительское окно.
да понятно что в Windows ничего такого нет - я про Билдер говорю! просто я всегда главную форму приложения называю MainForm - вот и все... и кстати мы немного отклоняемся от темы, тебе не кажется... - человека интересует не то что лежит на форме - кнопки, например и не MDI приложения - его интересует другое окно! в Windows разницы нет, а в Билдере оказалось - есть!
в Windows разницы нет, а в Билдере оказалось - есть!
Не понял, где есть какая разница?
Как можно сделать в билдере так, чтобы главное окно висело поверх всего-всего. Если так можно сделать в билдере, то я могу согласиться с тем, что не с маинформами могут быть проблемы, но вот мои скудные знания АПИфункций говорят мне, что для апи-функций такой разницы нет, и что если можно заставить быть он_топ главное (начальное) окно, то можно и любое другое...
Не понял, где есть какая разница?
Как можно сделать в билдере так, чтобы главное окно висело поверх всего-всего. Если так можно сделать в билдере, то я могу согласиться с тем, что не с маинформами могут быть проблемы, но вот мои скудные знания АПИфункций говорят мне, что для апи-функций такой разницы нет, и что если можно заставить быть он_топ главное (начальное) окно, то можно и любое другое...
да я ж не спорю насчет windows, api и всего остального - наоборот - полностью согласен, прото не знаю как это сделать... а в билдере достаточно у формы сделать FormStyle = fsStayOnTop и все...
но это только для главного окна приложения :(
Main Form - это всего лишь форма, которая создается первой.
Цель же, заставить форму висеть поверх всего!!
Как в аське. То, что в аське висит - главная форма, я думаю, значения не имеет - если можно заставить (а ведь можно как-то) главное висеть так, то можно и не главное так же заставить - апишным функциям без разницы...
Это точно. Достаточно взять в пример WinAmp, где при определенных настройках можно добиться того, что все его вспомогательные окна (PlayList, эквалайзер и др.) будут всегда наверху.
Это точно. Достаточно взять в пример WinAmp, где при определенных настройках можно добиться того, что все его вспомогательные окна (PlayList, эквалайзер и др.) будут всегда наверху.
Ещё раз говорю, НЕТ никаких главных окон ни в Аське, ни в Winamp.
В Windows для того, чтобы окно было поверх всех остальных, оно должно иметь стиль WS_POPUP, но не должно иметь стиль WS_CHILD. Не знаю, что там Борланд намухлевал, но стиль окна нормальным образом (через редактор ресурсов) вы видимо задать не можете. Тогда попробуйте установить стиль с помощью SetWindowLong:
// Retrieve the current window style.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
// Set the window style ~WS_CHILD and WS_POPUP
if(dwStyle) {
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
}
Что такое hWnd, думаю, не надо объяснять? :D
Ещё раз говорю, НЕТ никаких главных окон ни в Аське, ни в Winamp.
В Windows для того, чтобы окно было поверх всех остальных, оно должно иметь стиль WS_POPUP, но не должно иметь стиль WS_CHILD. Не знаю, что там Борланд намухлевал, но стиль окна нормальным образом (через редактор ресурсов) вы видимо задать не можете. Тогда попробуйте установить стиль с помощью SetWindowLong:
// Retrieve the current window style.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
// Set the window style ~WS_CHILD and WS_POPUP
if(dwStyle) {
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
}
Что такое hWnd, думаю, не надо объяснять? :D
А никто про главные окна и не говорит...
Разговор просто про основную форму (не буду называть ее главной ;-) ).
А никто про главные окна и не говорит...
Разговор просто про основную форму (не буду называть ее главной ;-) ).
Основная форма...
Те же штаны, только наизнанку...
Кто её сделал основной? Как ты сказал системе "Вот эта форма основная" ?
Так что "основная" или нет, это понятие чисто человеческое, система не знает ни про какие основные, главные формы. Более того, НЕТ в Windows такого понятия, как форма. Есть понятие "окно", отсюда и название "Windows".
Основная форма...
Те же штаны, только наизнанку...
Кто её сделал основной? Как ты сказал системе "Вот эта форма основная" ?
Так что "основная" или нет, это понятие чисто человеческое, система не знает ни про какие основные, главные формы. Более того, НЕТ в Windows такого понятия, как форма. Есть понятие "окно", отсюда и название "Windows".
А в Билдере есть! Main form - это форма, которая создается первой. Да, "главность" у неё ни ахти какая, но создается первой и поэтому считается главной. Ну называется она так - ну что поделать?!
А в Билдере есть! Main form - это форма, которая создается первой. Да, "главность" у неё ни ахти какая, но создается первой и поэтому считается главной. Ну называется она так - ну что поделать?!
Ок. Называйте свои формы хоть по фамилиям, их в Windows, всё равно, нет.
А кто Вам сказал, что Winamp, Icq написаны в Борланде?
Мне порой кажется, что пользователи Борланда, думают, что их программы по волшебному слову работают в обход системы Windows. Типа:"...в Windows нет, а в Борланде есть!"
Как бы вы там не называли эти свои сущьности (форма, ящик, чемодан..), они в конечном итоге не что иное, как ОКНА.
Ещё раз говорю, НЕТ никаких главных окон ни в Аське, ни в Winamp.
Да бог с ними, этими окнами, главными и не главными... Это не суть важно...
// Retrieve the current window style.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
// Set the window style ~WS_CHILD and WS_POPUP
if(dwStyle) {
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
}
Что такое hWnd, думаю, не надо объяснять? :D
Наверно нет, а вот что такое WS_CHILD и WS_POPUP объясни плиз. Борланд на них не ругается, но и эффекта от вызова этой функции я не наблюдаю... точно все также...
можно более подробно расписать пример вызова этой функции, плиз?
Наверно нет, а вот что такое WS_CHILD и WS_POPUP объясни плиз. Борланд на них не ругается, но и эффекта от вызова этой функции я не наблюдаю... точно все также...
можно более подробно расписать пример вызова этой функции, плиз?
MSDN чтоли цитировать???Хорошо лови!
Window Styles
The following styles can be specified wherever a window style is required. After the control has been created, these styles cannot be modified, except as noted.
WS_CHILD Creates a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
WS_POPUPCreates a pop-up window. This style cannot be used with the WS_CHILD style.
Ок. Называйте свои формы хоть по фамилиям, их в Windows, всё равно, нет.
А кто Вам сказал, что Winamp, Icq написаны в Борланде?
Мне порой кажется, что пользователи Борланда, думают, что их программы по волшебному слову работают в обход системы Windows. Типа:"...в Windows нет, а в Борланде есть!"
Как бы вы там не называли эти свои сущьности (форма, ящик, чемодан..), они в конечном итоге не что иное, как ОКНА.
Заметь, никто не сказал "главное окно". Потому что именно "форм" в Windows нет, а в Builder есть. Да, в конечном итоге это окно. Но скроллер тоже окно, а называется скроллером. И очень правильно на счет сущностей: в Биледре есть форма, которую надо понимать как элемент дизайна, как экземпляр класса TForm, как окно, которое во время разработки зовётся "формой".
Давай откажемся от имён и будем называть друг друга "homo sapiens номер...". Ну нет в природе ни Mark'ов ни Green'ов - есть существа, в конечном итоге являющиеся людьми.
Заметь, никто не сказал "главное окно". Потому что именно "форм" в Windows нет, а в Builder есть. Да, в конечном итоге это окно. Но скроллер тоже окно, а называется скроллером. И очень правильно на счет сущностей: в Биледре есть форма, которую надо понимать как элемент дизайна, как экземпляр класса TForm, как окно, которое во время разработки зовётся "формой".
Давай откажемся от имён и будем называть друг друга "homo sapiens номер...". Ну нет в природе ни Mark'ов ни Green'ов - есть существа, в конечном итоге являющиеся людьми.
Ок. Убедил (на время) :D
Вот только скроллер является классом окна зарегистрированного в системе, и никто тебе не мешает пользовать его как стандартное окно. А судя по тому, что SetWindowLong не прокатывает, Билдер мешает использовать созданные, как "форма", окна как стандартное окно. Класс TForm не просто враппер окна, он сидит между окном и программером и мешает последнему, делая всё так, как посчитали предпочтительным дяди из Борланда. Хотели простоты? Получите! За Вас всё решили.
Видимо и в данном случае (PopUp) класс TForm возврашает настройки окна в исходное. Зачем, не знаю, но думаю, что можно попробовать переопределить, как вы говорите, главное окно. Думаю, это лишь указатель на класс TForm (или т.п.), который является членом класса приложения (TApplication или т.п.). Ну и пусть этот указатель указывает на др., нужное окно.
Ок. Убедил (на время) :D
Вот только скроллер является классом окна зарегистрированного в системе, и никто тебе не мешает пользовать его как стандартное окно. А судя по тому, что SetWindowLong не прокатывает, Билдер мешает использовать созданные, как "форма", окна как стандартное окно. Класс TForm не просто враппер окна, он сидит между окном и программером и мешает последнему, делая всё так, как посчитали предпочтительным дяди из Борланда. Хотели простоты? Получите! За Вас всё решили.
Воздержусь от комментариев, иначе это будет напоминать тему "Возразите мне если я не прав", которая тоже породила бурные обсуждения.
Зачем, не знаю, но думаю, что можно попробовать переопределить, как вы говорите, главное окно. Думаю, это лишь указатель на класс TForm (или т.п.), который является членом класса приложения (TApplication или т.п.). Ну и пусть этот указатель указывает на др., нужное окно.
Переопределить совсем не сложно - я говорил об это выше... только вот автору темы уже по-моему неинтересно :D
Переопределить совсем не сложно - я говорил об это выше... только вот автору темы уже по-моему неинтересно :D
Точно :)
Мне не нужны пространные рассуждения о смысле жизни окон...
Для счастья мне всего лишь нужно, чтобы мое окно (пусть не главное, пусть даже главное (буду вызывать отдельную приладу (например из другой дллки))) висело ВСЕГДА поверх ВСЕХ окон...
Ещё раз говорю, НЕТ никаких главных окон ни в Аське, ни в Winamp.
В Windows для того, чтобы окно было поверх всех остальных, оно должно иметь стиль WS_POPUP, но не должно иметь стиль WS_CHILD. Не знаю, что там Борланд намухлевал, но стиль окна нормальным образом (через редактор ресурсов) вы видимо задать не можете. Тогда попробуйте установить стиль с помощью SetWindowLong:
// Retrieve the current window style.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
// Set the window style ~WS_CHILD and WS_POPUP
if(dwStyle) {
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
}
Что такое hWnd, думаю, не надо объяснять? :D
Упустил один момент...
Попробуй вместе с WS_POPUP использовать WS_EX_TOPMOST.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
DWORD dwExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle | WS_EX_TOPMOST);
У меня есть форма, куда я вывожу некоторую информацию, и я хочу, чтобы эта новая висела поверх всех остальных окон пользователя.
При этом моя прога может быть где-то на бакграунде.
Я не хочу выводить эту новую форму как ShowModal(), так как тогда на главной форме нельзя будет на кнопки жать. (и почему-то не помогат это ShowModal, другие приложения перебивают мое окно)
И на форме стоит FormStyle=fsStayOnTop;
Собсна вопрос:
Как сделать мою форму OnTop???
Попробуй в конструкторе написать
[COLOR=green]Form->FormStyle=fsStayOnTop[/COLOR],
если не получится в конструкоре, тогда попробуй поставить в OnCreate(OnShow как будет удобнее) строчку которую я выделил в зел. цвет.
Учти "Form" должен совпадать с именем твоей формы.
Попробуй в конструкторе написать
[COLOR=green]Form->FormStyle=fsStayOnTop[/COLOR],
если не получится в конструкоре, тогда попробуй поставить в OnCreate(OnShow как будет удобнее) строчку которую я выделил в зел. цвет.
Учти "Form" должен совпадать с именем твоей формы.
М-да... И четырех лет не прошло...
М-да... И четырех лет не прошло...
"Я сегодня первый день:angel:", шучу второй:devil:, я недавно этот форум нашёл, поэтому не мог ответить, да и 4 года назад я ещё незнал, что такое С++.
;)
Упустил один момент...
Попробуй вместе с WS_POPUP использовать WS_EX_TOPMOST.
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
SetWindowLong( hWnd, GWL_STYLE, (dwStyle & ~WS_CHILD)|WS_POPUP );
DWORD dwExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle | WS_EX_TOPMOST);
Что САМОЕ интересное: я как тупой билдеро-писака решил тупым-притупым способом проверить меняется ли хоть что-то:
ShowMessage(dwStyle);
SetWindowLong(fmTest->Handle,GWL_STYLE,(dwStyle & ~WS_CHILD)|WS_POPUP);
dwStyle = GetWindowLong(fmTest->Handle, GWL_STYLE);
ShowMessage(dwStyle);
DWORD dwExStyle = GetWindowLong(fmTest->Handle, GWL_EXSTYLE);
ShowMessage(dwExStyle);
SetWindowLong(fmTest->Handle, GWL_EXSTYLE, dwExStyle | WS_EX_TOPMOST);
dwExStyle = GetWindowLong(fmTest->Handle, GWL_EXSTYLE);
ShowMessage(dwExStyle);
Дак вот: Значения переменных dwStyle и dwExStyle НЕ МЕНЯЮТСЯ :!!!: Не говоря уже о том, что форма не становится он-топовой
Я лично хотел сделать чтоб окошко (VCL), создаваемое в ДЛЛ было он-топ. Через SetWindowLong не получилось... Через FormStyle=fsStayOnTop получилось, но сталкнулся с удивительным извращением: все MessageDlg - появляются ЗА формой, т.е. их не видно!!!!!!!! При этом переделав все MessageDlg в апишные MessageBox - все стало ОК.
Мораль: хочу конструктор форм, который бы интерпретировал все через винапи. Т.к. вцл - жуть, цлх - не лучше, а невизуально - геморойно!!!
Как ужасен мир.................