Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Popup Panel


Автор: Superklug 12.12.2008, 00:18
Доброго всем времени суток!
Мне необходимо сделать всплывающее окно. Изначально я просто создал еще одну форму. Показывал ее когда надо и скрывал по событию OnDeactivate. В этом есть ряд недостатков, поэтому я решил создать компонент TPanel и показывать его как отдельное окно. Помогите пожалуйста с реализацией...
Чтобы разрешить "всплывать" за пределы формы, в качестве родителя указываю рабочий стол:
Код

pan = new TPanel(this);
pan->ParentWindow=GetDesktopWindow();

Теперь, на сколько я знаю, нужно установить какие-то параметры с помощью функций SetWindowLong и SetWindowPos. А вот какие не знаю =(

Надеюсь на вашу помощь...

P.S. В правильном ли я направлении пошел вообще?

Автор: Superklug 12.12.2008, 00:43
Вычитал, что нужно установить:
а) стили окна WS_BORDER | WS_EX_PALETTEWINDOW;//SetWindowLong
б) стиль класса окна CS_SAVEBITS; //SetWindowWord

С пунктом а) все понятно. А вот как использовать SetWindowWord не знаю(((

Автор: mrbrooks 12.12.2008, 10:18
Цитата(Superklug @  12.12.2008,  00:18 Найти цитируемый пост)
поэтому я решил создать компонент TPanel и показывать его как отдельное окно

это как это  smile 

на мой взгляд здесь можно заюзать либо вторую форму либо фрейм

Автор: Superklug 12.12.2008, 13:31
Цитата(mrbrooks @  12.12.2008,  10:18 Найти цитируемый пост)
это как это  smile 

Ну вот так например 
Код

SetWindowLong(Panel1->Handle,GWL_STYLE,GetWindowLong(Panel1->Handle,GWL_STYLE)|WS_OVERLAPPEDWINFOW);
SetWindowPos(Panel1->Handle,HWND_TOP,0,0,0,0,SWP_NIMOVE | SWP_NOSUZE | SWP_DRAWFRAME);

Ведь любой контрол - это тоже окно. Поэтому, на сколько я понимаю, мы можем отобразить его как угодно...

Еще недавно разбирался в компоненте, у которого "всплывает" TListBox. Там такой код:
Код

void __fastcall TPopupListBox::CreateParams(TCreateParams& Prms)
{
    TListBox::CreateParams(Prms); 
    Prms.Style |= WS_BORDER; 
    Prms.ExStyle |= WS_EX_PALETTEWINDOW; 
    Prms.WindowClass.style |= CS_SAVEBITS;
}
//---------------------------------------------------------------------------


void __fastcall TPopupListBox::CreateWnd()
{
    TListBox::CreateWnd(); 
    ::SetParent(WindowHandle, GetDesktopWindow());
}
//---------------------------------------------------------------------------

Указать в качестве родителя рабочий стол у меня получилось. А как присвоить окну параметр CS_SAVEBITS не знаю =(


Цитата(mrbrooks @  12.12.2008,  10:18 Найти цитируемый пост)
на мой взгляд здесь можно заюзать либо вторую форму либо фрейм

В случае со второй формой есть несколько неудобств... Например при ее появлении, главная форма становится неактивной( А с фреймами я вообще никогда не работал...

mrbrooks, помогите реализовать хотя бы какой-нибудь вариант. Заранее огромное спасибо! 

Автор: mrbrooks 12.12.2008, 15:26
Superklug, да здесь можно решить сколь угодно разными способами. Так пойдет?  smile 


Автор: Superklug 12.12.2008, 15:43
mrbrooks, мне нужно немного не то.
Фактически это PopupMenu, только боле продвинутый... Т.е. представляет собой не просто список элементов, а группу контролов.
Он должен пропадать так же как и любое всплывающее меню. Т.е. при щелчке вне меню либо нажатии Esc.

Вы, на сколько я понял, использовали вторую форму. При ее появлении, главная форма становится неактивной. Как этого избежать?

Автор: xvr 12.12.2008, 15:45
Цитата(Superklug @ 12.12.2008,  00:18)
Доброго всем времени суток!
Мне необходимо сделать всплывающее окно. Изначально я просто создал еще одну форму. Показывал ее когда надо и скрывал по событию OnDeactivate. В этом есть ряд недостатков, поэтому я решил создать компонент TPanel и показывать его как отдельное окно. Помогите пожалуйста с реализацией...
P.S. В правильном ли я направлении пошел вообще?

Нет, если мсье не мазохист конечно  smile Делаешь обычную форму (не забудь ее убрать из списка автоматически создаваемых форм в Project), где надо, создаешь и показываешь
Код

TMyPopupForm* pform=new TMyPopupForm(NULL);
pform->Show();
...
delete pform;


Цитата

В случае со второй формой есть несколько неудобств... Например при ее появлении, главная форма становится неактивной(
Не надо делать ShowModal и все будет пучком  smile 

Автор: mrbrooks 12.12.2008, 15:52
xvr, я ему аналогичное и скинул в архиве  smile

Добавлено через 29 секунд
И никаких ShowModal  - ов - чес слово

Автор: Superklug 12.12.2008, 21:23
mrbrooks, xvr, прочитайте первый пост... Я так уже делал. Меня не устроил результат.
Как сделать так, чтобы при всплывании второго окна, первое осталось активным?

Автор: xvr 13.12.2008, 17:06
Цитата(Superklug @ 12.12.2008,  21:23)
mrbrooks, xvr, прочитайте первый пост... Я так уже делал. Меня не устроил результат.
Как сделать так, чтобы при всплывании второго окна, первое осталось активным?

Поставь второй форме флаг fsStayOnTop в проперть FormStyle, сделай ей Show(), затем снова активизируй первую форму(SetFocus())

Автор: Superklug 13.12.2008, 22:57
Цитата(xvr @  13.12.2008,  17:06 Найти цитируемый пост)
Поставь второй форме флаг fsStayOnTop в проперть FormStyle, сделай ей Show(), затем снова активизируй первую форму(SetFocus())

Если так сделать, то первая форма будет неприятно "мигать". И еще при щелчке на вторую форму она, разумеется, станет активной...

А может с помощью SetWindowLong можно какие нибудь параметры окна установить, чтобы оно неактивным было?
Или подскажите как пользоваться функцией SetWindowWord...

Автор: xvr 13.12.2008, 23:06
Цитата(Superklug @ 13.12.2008,  22:57)
Цитата(xvr @  13.12.2008,  17:06 Найти цитируемый пост)
Поставь второй форме флаг fsStayOnTop в проперть FormStyle, сделай ей Show(), затем снова активизируй первую форму(SetFocus())

Если так сделать, то первая форма будет неприятно "мигать". И еще при щелчке на вторую форму она, разумеется, станет активной...

А может с помощью SetWindowLong можно какие нибудь параметры окна установить, чтобы оно неактивным было?
Или подскажите как пользоваться функцией SetWindowWord...

Попробуйте BorderStyle в bsToolWindow

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)