Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [BC++] Указать дочернее окно. Как сделать, Чтобы было поверх главного 
:(
    Опции темы
MuForum
Дата 4.8.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Доброе время суток!
- Столкнулся с такой проблемой, что необходимо отобразить дочернее окно, но чтобы оно было всегда поверх главного.
- В C# данный пример я реализовывал следующим методом:
Код

        private void bor_FSettings_Show()
        {
            this.Enabled = false;
            // ----
            if (_FSettings == null || _FSettings.IsDisposed) _FSettings = new bor_FSettings(this);
            if (!_FSettings.Created)
            {
                int _CorX = 0;
                int _CorY = 0;
                if (this.Visible)
                {
                    _CorX = this.Location.X + (int)((this.Size.Width - _FSettings.Size.Width) / 2);
                    _CorY = this.Location.Y + (int)((this.Size.Height - _FSettings.Size.Height) / 2);
                }
                else _FSettings.StartPosition = FormStartPosition.CenterScreen;
                // ----
                _FSettings.Location = new Point(_CorX, _CorY);
                _FSettings.Owner = this; // Сдесь я указывал родителя, поверх которой форма 'FSettings' будет отображатся.
                _FSettings.Show();
            }
        }


- В 'C++ Builder' аналог данного кода я, к сожалению, реализовать не могу.
- Пробовал делать следующим образом:
Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        // ----
        FSettings->Parent = FMain;
        FMain->SendToBack();
        FSettings->BringToFront();
        // ----
        FSettings->Show();
}

- К сожалению, при использование данного способа форма 'FSettings' не отображается =(

Это сообщение отредактировал(а) MuForum - 4.8.2008, 09:25


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Если динамически создавать форму то собственно надо под нее выделить память:

Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        TForm *FSettings = new TForm(this);
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        FSettings->Show();
}

PM MAIL   Вверх
MuForum
Дата 4.8.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(mrbrooks @ 4.8.2008,  09:25)
Если динамически создавать форму то собственно надо под нее выделить память:

Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        TForm *FSettings = new TForm(this);
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        FSettings->Show();
}

Проблема в том, что данный способ не даёт того результата, который требуется!
- В данном примере форма 'FSettings' только появится поверх главного, но как только переведёш фокус на главную форму, то форма 'FSettings' уйдёт назад, то есть не будет видно.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        TForm *FSettings = new TForm(this);
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        FSettings->FormStyle = fsStayOnTop; //поверх всех окон
        FSettings->Show();

}


либо можно сделать форму как модальную - но к главной форме ты доступ не получишь пока не закроешь модальную форму

Это сообщение отредактировал(а) mrbrooks - 4.8.2008, 09:34
PM MAIL   Вверх
MuForum
Дата 4.8.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Я сделал маленький проект на C# программы, которой мне нужно.
- При нажатие на кнопку 'Settings', появляется форма 'FSettings', и затем при перемещение формы 'FMain', форма 'FSettings' всегда остаётся поверх формы 'FMain'.

P.S. -> Программа располагается по следующему пути: '.\Example_Owner\bin\Release\Example_Owner.exe'
- Для простомотра программы необходимо наличие 'Microsoft .NET Framework 2.0'.

Это сообщение отредактировал(а) MuForum - 4.8.2008, 09:48

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Example_Owner.rar 61,51 Kb


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Чем тебе предложенный вариант не нравится?
PM MAIL   Вверх
MuForum
Дата 4.8.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(mrbrooks @ 4.8.2008,  09:41)
Чем тебе предложенный вариант не нравится?

Мне необходимо, чтобы форма 'FSettings' была поверх только формы 'FMain', а не использовать z-ю максимальную позицию в списке окно. (HWND_TOPMOST).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        TForm *FSettings = new TForm(this);
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        FSettings->ShowModal();
}


Это сообщение отредактировал(а) mrbrooks - 4.8.2008, 09:49
PM MAIL   Вверх
MuForum
Дата 4.8.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(mrbrooks @ 4.8.2008,  09:48)
Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        TForm *FSettings = new TForm(this);
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        FSettings->ShowModal();
}

Данный вариант блокирует главную форму 'FMain', а мне необходимо, чтобы к главной форме 'FMain' был доступ.

- Ваш пример аналог данного варианта:
Код

void __fastcall TFMain::FSettings_Show(TObject *Sender)
{
        FSettings->Left = FMain->Left + int((FMain->Width - FSettings->Width) / 2);
        FSettings->Top = FMain->Top + int((FMain->Height - FSettings->Height) / 2);
        FSettings->Caption = FMain->Caption;
        // ----
        FSettings->Show();
        this->Enabled = false;
}
....
void __fastcall TFSettings::FormClose(TObject *Sender, TCloseAction &Action)
{
        FMain->Enabled = true;
}

- Но меня данный способ, к сожалению, не устраивает =(

Это сообщение отредактировал(а) MuForum - 4.8.2008, 09:55


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Увы иных решений такой своеобразной задачи у меня нет. smile 
PM MAIL   Вверх
MuForum
Дата 4.8.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(mrbrooks @ 4.8.2008,  09:57)
Увы иных решений такой своеобразной задачи у меня нет. smile


Благодарю за помощь.
- Вы старались помочь, но видно в специфику языка такую задачу так легко не решить.
- Я тоже ломал голову вчера, но так и не смог решить эту задачу =(

Это сообщение отредактировал(а) MuForum - 4.8.2008, 10:03


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
mrbrooks
Дата 4.8.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MuForum @ 4.8.2008,  10:01)
Цитата(mrbrooks @ 4.8.2008,  09:57)
Увы иных решений такой своеобразной задачи у меня нет. smile


Благодарю за помощь.
- Вы старались помочь, но видно в специфику языка такую задачу так легко не решить.
- Я тоже ломал голову вчера, но так и не смог решить эту задачу =(

Язык здесь имхо не причем. Работаем то с VCL. В таких случаях решает WinAPI. Но это уже абсолютно другая песня.
PM MAIL   Вверх
Rrader
  Дата 4.8.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Код

SetWindowPos(FSettings->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);


Это сообщение отредактировал(а) Rrader - 4.8.2008, 16:32


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
mrbrooks
Дата 4.8.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Rrader @ 4.8.2008,  16:13)
Код

SetWindowPos(FSettings->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE || SWP_NOMOVE);

имхо. возможно я и не прав - но флаги разделяют одной "палочкой"  smile 
Код

SetWindowPos(FSettings->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);


честно говоря я не думаю что это сильно изменит ситуацию по сравнению с fsStayOnTop и тем что хочет автор. 

Цитата

HWND_TOP - Помещает окно наверху Z-последовательности. 
HWND_TOPMOST - Помещает окно перед не самыми верхними окнами. Окно сохраняет свою самую верхнюю позицию даже тогда, когда оно неактивное.

как я понял нужна некая смесь  smile 
PM MAIL   Вверх
Rrader
  Дата 4.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Цитата(mrbrooks @  4.8.2008,  23:28 Найти цитируемый пост)
имхо. возможно я и не прав - но флаги разделяют одной "палочкой"

Поправил smile Лучше одной палочкой, я машинально написал.

Цитата(mrbrooks @  4.8.2008,  23:28 Найти цитируемый пост)
честно говоря я не думаю что это сильно изменит ситуацию по сравнению с fsStayOnTop и тем что хочет автор.

Абсолютно разные вещи smile 

Это сообщение отредактировал(а) Rrader - 4.8.2008, 16:32


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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