Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Popup Panel 
:(
    Опции темы
Superklug
Дата 12.12.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

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

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

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

P.S. В правильном ли я направлении пошел вообще?
PM MAIL   Вверх
Superklug
Дата 12.12.2008, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

С пунктом а) все понятно. А вот как использовать SetWindowWord не знаю(((
PM MAIL   Вверх
mrbrooks
Дата 12.12.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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

это как это  smile 

на мой взгляд здесь можно заюзать либо вторую форму либо фрейм
PM MAIL   Вверх
Superklug
Дата 12.12.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Цитата(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, помогите реализовать хотя бы какой-нибудь вариант. Заранее огромное спасибо! 

Это сообщение отредактировал(а) Superklug - 12.12.2008, 13:33
PM MAIL   Вверх
mrbrooks
Дата 12.12.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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



Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Superklug.rar 183,29 Kb
PM MAIL   Вверх
Superklug
Дата 12.12.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

Вы, на сколько я понял, использовали вторую форму. При ее появлении, главная форма становится неактивной. Как этого избежать?
PM MAIL   Вверх
xvr
Дата 12.12.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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


Цитата

В случае со второй формой есть несколько неудобств... Например при ее появлении, главная форма становится неактивной(
Не надо делать ShowModal и все будет пучком  smile 
PM MAIL   Вверх
mrbrooks
Дата 12.12.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



xvr, я ему аналогичное и скинул в архиве  smile

Добавлено через 29 секунд
И никаких ShowModal  - ов - чес слово
PM MAIL   Вверх
Superklug
Дата 12.12.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



mrbrooks, xvr, прочитайте первый пост... Я так уже делал. Меня не устроил результат.
Как сделать так, чтобы при всплывании второго окна, первое осталось активным?
PM MAIL   Вверх
xvr
Дата 13.12.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

PM MAIL   Вверх
Superklug
Дата 13.12.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

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

А может с помощью SetWindowLong можно какие нибудь параметры окна установить, чтобы оно неактивным было?
Или подскажите как пользоваться функцией SetWindowWord...
PM MAIL   Вверх
xvr
Дата 13.12.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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

Попробуйте BorderStyle в bsToolWindow
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.