Одна форма над другой
От: Dumka  
Дата: 15.02.08 08:45
Оценка:
Подскажите, пожалуйста, как сделать так чтобы форма1 всегда находилась над (в смысле перед) формой2, но при этом, не была always on top для всех других окон (такой эффект получается если установить topmost = true для формы1).

15.02.08 13:55: Перенесено модератором из '.NET' — AndrewVK
Re: Одна форма над другой
От: tyger Россия  
Дата: 15.02.08 08:53
Оценка:
Здравствуйте, Dumka, Вы писали:

D>Подскажите, пожалуйста, как сделать так чтобы форма1 всегда находилась над (в смысле перед) формой2, но при этом, не была always on top для всех других окон (такой эффект получается если установить topmost = true для формы1).

Вызвай так:

topForm.Show(bottomForm);

или
topForm.ShowDialog(bottomForm);


одна из них точно сработает.
... << RSDN@Home 1.2.0 alpha rev. 784>>
Re[2]: Одна форма над другой
От: Dumka  
Дата: 18.02.08 08:15
Оценка:
Здравствуйте, tyger, Вы писали:

T>Здравствуйте, Dumka, Вы писали:


D>>Подскажите, пожалуйста, как сделать так чтобы форма1 всегда находилась над (в смысле перед) формой2, но при этом, не была always on top для всех других окон (такой эффект получается если установить topmost = true для формы1).

T>Вызвай так:

T>
T>topForm.Show(bottomForm); 
T>

T>или
T>
T>topForm.ShowDialog(bottomForm); 
T>


T>одна из них точно сработает.


Попробывал написать в обработчике загрузки верхней формы (mainForm — нижняя форма):

MainForm mainForm = new MainForm();
Show(mainForm);

потом так
MainForm mainForm = new MainForm();
ShowDialog(mainForm);

Вылетает ошибка:
Form that is already visible cannot be displayed as a modal dialog box. Set the form's visible property to false before calling showDialog.
Изменил текст на:
MainForm mainForm = new MainForm();
mainForm.Visible = false;
ShowDialog(mainForm);

Все равно та же ошибка... В чем может быть дело?
Re[3]: Одна форма над другой
От: tyger Россия  
Дата: 18.02.08 09:07
Оценка: 3 (1)
Здравствуйте, Dumka, Вы писали:

D>>>Подскажите, пожалуйста, как сделать так чтобы форма1 всегда находилась над (в смысле перед) формой2, но при этом, не была always on top для всех других окон (такой эффект получается если установить topmost = true для формы1).


D>Попробывал написать в обработчике загрузки верхней формы (mainForm — нижняя форма):


D>
D>MainForm mainForm = new MainForm();
D>Show(mainForm);
D>

D>Вылетает ошибка:
D>Form that is already visible cannot be displayed as a modal dialog box. Set the form's visible property to false before calling showDialog.
D>Все равно та же ошибка... В чем может быть дело?

Хм.
Вот в том месте, где у вас должна показаться "верхняя" форма делаем так:
Form topForm = new Form();
topForm.ShowDialog(this);//Предполагая, что this - это ваша mainForm.


т.е. в терминах Вашего первого вопроса:
Form форма1 = new Form();
форма1.ShowDialog(форма2);


Продолжая мысль, предполагаем, что у Вас есть главная форма Вашего приложения, называемая MainForm, наследник от Form.
Она создана и в данный момент выполняется. На этой форме существует некий Button, который выводит на экран диалоговое модальное окно, которое должно быть в топе. Тогда код можно представить так:
class MainForm:Form
{
...
Button essentialButton = new Button("click here");
...

essentialButton.Click += new System.EventHandler(essentialButton_ClickHandler);

void essentialButton_ClickHandler(object sender, EventArgs e)
{
    TopForm form = new TopForm();
    form.ShowDialog(this);
}
}

class TopForm:Form
{}
... << RSDN@Home 1.2.0 alpha rev. 784>>
Re: Одна форма над другой
От: fomich0ff  
Дата: 19.02.08 09:07
Оценка:
Здравствуйте, Dumka, Вы писали:

D>Подскажите, пожалуйста, как сделать так чтобы форма1 всегда находилась над (в смысле перед) формой2, но при этом, не была always on top для всех других окон (такой эффект получается если установить topmost = true для формы1).


Попробуйте так

форма1.Owner = форма2
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[4]: Одна форма над другой
От: Dumka  
Дата: 19.02.08 11:46
Оценка:
Здравствуйте, tyger, Вы писали:

T>Здравствуйте, Dumka, Вы писали:


T>Продолжая мысль, предполагаем, что у Вас есть главная форма Вашего приложения, называемая MainForm, наследник от Form.

T>Она создана и в данный момент выполняется. На этой форме существует некий Button, который выводит на экран диалоговое модальное окно, которое должно быть в топе. Тогда код можно представить так:
T>
T>class MainForm:Form
T>{
T>...
T>Button essentialButton = new Button("click here");
T>...

T>essentialButton.Click += new System.EventHandler(essentialButton_ClickHandler);

T>void essentialButton_ClickHandler(object sender, EventArgs e)
T>{
T>    TopForm form = new TopForm();
T>    form.ShowDialog(this);
T>}
T>}

T>class TopForm:Form
T>{}
T>


Спасибо, теперь всё заработало, только возникла такая проблема — на нижней форме есть кнопка, так вот если происходила работа с верхней формой (то есть она активна) и в этот момент щелкнуть по кнопке на нижней, то по первому щелчку происходит активация нижней формы, а только по второму — обработка нажатия кнопки. Данный эффект крайне нежелателен — нужно сделать, чтобы отработка нажатия на кнопку происходила по первому щелчку. Сейчас делаю так — обрабатываю событие MouseHover кнопки и по нему произвожу активацию нижней формы, всё работает нормально за исключением того, что активация формы происходит даже если работа ведется в другом приложении, а курсор мыши случайно попал на кнопку в этой форме. Подскажите, пожалуйста, как решить эту проблему.
Re[5]: Одна форма над другой
От: tyger Россия  
Дата: 20.02.08 05:38
Оценка:
Здравствуйте, Dumka, Вы писали:

D>на нижней форме есть кнопка, так вот если происходила работа с верхней формой (то есть она активна) и в этот момент щелкнуть по кнопке на нижней, то по первому щелчку происходит активация нижней формы, а только по второму — обработка нажатия кнопки. обрабатываю событие MouseHover кнопки и по нему произвожу активацию нижней формы, всё работает нормально за исключением того, что активация формы происходит даже если работа ведется в другом приложении, а курсор мыши случайно попал на кнопку в этой форме.

Если работает событие MouseHover, то должно работать и MouseClick, проверьте! Если же так станется, что MouseClick до кнопки не доходит, т.к. собитие клика мышью только передает фокус ввода нижней форме, то хотябы до самой формы MouseClick должен дойти, попробкйте обработать его, а там уже можно получить координаты клика и преобразовать их в нужный клик по кнопке.
... << RSDN@Home 1.2.0 alpha rev. 784>>
Re[6]: Одна форма над другой
От: Dumka  
Дата: 20.02.08 06:11
Оценка:
Здравствуйте, tyger, Вы писали:

T>Здравствуйте, Dumka, Вы писали:


D>>на нижней форме есть кнопка, так вот если происходила работа с верхней формой (то есть она активна) и в этот момент щелкнуть по кнопке на нижней, то по первому щелчку происходит активация нижней формы, а только по второму — обработка нажатия кнопки. обрабатываю событие MouseHover кнопки и по нему произвожу активацию нижней формы, всё работает нормально за исключением того, что активация формы происходит даже если работа ведется в другом приложении, а курсор мыши случайно попал на кнопку в этой форме.

T>Если работает событие MouseHover, то должно работать и MouseClick, проверьте! Если же так станется, что MouseClick до кнопки не доходит, т.к. собитие клика мышью только передает фокус ввода нижней форме, то хотябы до самой формы MouseClick должен дойти, попробкйте обработать его, а там уже можно получить координаты клика и преобразовать их в нужный клик по кнопке.

Я не совсем правильно описал ситуацию. У меня эта проблема возникает при работе не с кнопкой (с ней, как это не странно всё ок), а кнопками на toolStripPanel. Проверил MouseClick не срабатывает, решение проблемы с помощью координат, мне тоже приходило на ум, но как-то, мне кажется, оно некрасиво.
Re[7]: Одна форма над другой
От: tyger Россия  
Дата: 20.02.08 09:21
Оценка:
Здравствуйте, Dumka, Вы писали:

D>Я не совсем правильно описал ситуацию. У меня эта проблема возникает при работе не с кнопкой (с ней, как это не странно всё ок), а кнопками на toolStripPanel. Проверил MouseClick не срабатывает, решение проблемы с помощью координат, мне тоже приходило на ум, но как-то, мне кажется, оно некрасиво.

На сколько я помню, ToolStrip не отражается на WinAPI-control, и все события ловит непосредственно подложка ToolStrip, на которой лежат кнопки, а уж потом она преобразует, как раз таки, координаты в нажатие на соотвествующую кнопку на ToolStrip, так что попробуйте ловить клик на подложке...
Да и обработки клика на форме и преобразования из координат не будет выглядеть некрасиво.
... << RSDN@Home 1.2.0 alpha rev. 790>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.