Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #60 : 13-02-2010 13:16 » |
|
Не понял. Вроде окна блокируются по цепочке от модального через родители до основного, Дети заблокированных родителей тоже блокируются?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #61 : 13-02-2010 13:51 » |
|
Нет, не блокируются но A - это главное окно. Что-то сильно курочит программу не хочется. Но я сейчас (как и вчера вечером) уже устал от активного дня и туплю, наверное
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #62 : 13-02-2010 14:20 » |
|
Поскольку в .NET Windows.Forms - тоже лишь обёртка над WinAPI, то написал тест: using System; using System.Windows.Forms;
namespace TestForms { class MainClass { private static Form CreateForm(string name) { Form form = new Form(); form.Text = name; return form; } private static void Test1(Form a, Form b, Form c) { a.Show(); b.Show(a); c.ShowDialog(b); }
private static void Test2(Form a, Form b, Form c) { a.Show(); b.Show(); c.ShowDialog(b); } delegate void Test(Form a, Form b, Form c); public static void Main (string[] args) { Test[] tests = new Test[] { new Test(Test1), new Test(Test2) }; for(int i = 0; i < tests.Length; i++) { Console.WriteLine(string.Format("Test {0}. Press ENTER to start.", i + 1)); Console.ReadLine(); Form a = CreateForm("A"); Form b = CreateForm("B"); Form c = CreateForm("C"); tests[i](a, b, c); Application.Run(a); } Console.WriteLine("Finished. Press ENTER to exit."); Console.ReadLine(); } } } Вижу, что всё нормально. Достаточно убрать из b owner-ссылку на a. Так что в крайнем случае можно обратиться непосредственно к WinAPI.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #63 : 13-02-2010 14:49 » |
|
Достаточно убрать из b owner-ссылку на a
если родителя не указать (а по умолчанию это 0) , то: virtual BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); pParentWnd - Points to the parent window object (of type CWnd) to which the dialog object belongs. If it is NULL, the dialog object's parent window is set to the main application window.
а главное у нас -это А
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #64 : 13-02-2010 15:15 » |
|
Ну это прибабахи MFC. Иди своим путём
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #65 : 13-02-2010 15:27 » |
|
m_B_init.SetParent(0); - не спасает тоже )))
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #66 : 14-02-2010 19:43 » |
|
Лёш, завтра на работе уже с 9ой буду пробовать что хотел, чтобы не нарушать чистоты эксперимента.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #67 : 14-02-2010 19:51 » |
|
хорошо )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #68 : 15-02-2010 08:43 » |
|
Лёш, не получилось пока. Dimka, я бы не стал проводить такую аналогию только потому, что MFC и .NET обёртки над Win API. Не однозначно, что ShowDialog вызывает именно модальный DialogBox. Это может быть и просто окно.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #69 : 15-02-2010 08:49 » |
|
Джон, тем не менее, работает это окно как модальный диалог, т.е. родители этого окна оказываются недоступными для пользовательских действий.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #70 : 15-02-2010 09:38 » |
|
Джон, я согласен, что дело именно в MFC - ведь в 6 студии работает так, а в 9 - иначе. А винда то не поменялась
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #71 : 15-02-2010 11:02 » |
|
Джон, тем не менее, работает это окно как модальный диалог, т.е. родители этого окна оказываются недоступными для пользовательских действий. Согласен. Просто есть разные способы создать модальное окно (вплоть до вырубания родительского) и я думаю, что в .NET используется самый универсальный, более того, в данном случае я бы сразу стал кричать что-то типа: А НАФИГА ОНО ТАКОЕ НУЖНО? и БАГ НАДО БЫЛО ЕЩЁ В 6ке УБИРАТЬ! Но, зная Лёшку, с его: "А я так хочу!", просто хотел попробвать поиграться с Owner.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #72 : 15-02-2010 11:09 » |
|
Прикол. Дело в логике: Димка, как тебе такое : namespace Test1 { public partial class FormA : Form { public FormA() { InitializeComponent(); }
private void _showModelessDlgToolStripButton_Click(object sender, EventArgs e) { FormB dlg = new FormB(); dlg.Show(); } } } namespace Test1 { public partial class FormB : Form { public FormB() { InitializeComponent(); }
private void _showDlgCButton_Click(object sender, EventArgs e) { FormC dlg = new FormC(); dlg.ShowDialog(); } } } А и В недоступны после запуска С.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #73 : 15-02-2010 11:20 » |
|
Но, зная Лёшку, с его: "А я так хочу!",
вообще-то, мне как раз красивее, как в 9-ке. Это клиент привык, это ЕМУ так нужно
|
|
« Последнее редактирование: 15-02-2010 11:22 от Алексей1153++ »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #74 : 15-02-2010 11:24 » |
|
Джон, не понял, к какому из вариантов относится приложенный exe. А, это вызовы форм. Вопрос снят. Из MSDN: If you use the version of this method that has no parameters, the dialog box being shown would be owned automatically by the currently active window of your application. По-моему, ключевое - "active window". Давайте посмотрим с точки зрения WinAPI. Модальность ведь обеспечивается тем, что цикл обработки сообщений переходит к модальному окну... Если в этом цикле помимо модального обслуживаются другие окна, то они будто бы должны быть живы. Или я неправильно понимаю?
|
|
« Последнее редактирование: 15-02-2010 12:04 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #75 : 15-02-2010 12:08 » |
|
Да, я просто повторил вызовы как в лёшкином примере. Даже если я вызываю немодальное окно явно с нулём: private void _showModelessDlgToolStripButton_Click(object sender, EventArgs e) { FormB dlg = new FormB(); dlg.Show(null); }
Форма А всё-равно недоступна.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #76 : 15-02-2010 12:11 » |
|
Можно по такой схеме сделать: a.Show(); b.Show(a); b.Enabled = false; c.Show(b);
Но следует учитывать, что вызов Show несинхронный, т.е. программа не будет ждать закрытия окна.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #77 : 15-02-2010 12:20 » |
|
Да вот и мне чёт тоже ничего умней в голову не приходит. Но это как-то... неспортивно...
Короче, Лёш, если надо быстрое решение, то ты тоже можешь так сделать:
1. Делаешь С диалог тоже немодальным. 2. Когда он открывается В запираешь. 3. Когда С закрывается В отпирается. 4. Когда А закрывается (если А это основное окно приложения) - закрываешь В и С.
П.4 нужен на всякий случай для чистоты.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #78 : 15-02-2010 12:25 » |
|
п 4 - тут всё понятно, оно у меняавтоматом отработает.
2 и 3 - "запирать" - как это делается ?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #79 : 15-02-2010 12:33 » |
|
Но это как-то... неспортивно... Ну если спортивно, то нужно иметь 2 цикла обработки событий Тогда что-то в этом духе: Form a = CreateForm("A"); a.Show(); Thread bThread = new Thread(delegate() { Form b = CreateForm("B"); b.Show(); Form c = CreateForm("C"); c.ShowDialog(b); Application.Run(b); }); bThread.IsBackground = true; bThread.Start(); Application.Run(a);
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #80 : 15-02-2010 12:37 » |
|
Алексей1153++, по-моему это CWnd::EnableWindow
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #81 : 15-02-2010 12:46 » |
|
попробую
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #82 : 15-02-2010 13:29 » |
|
Ага, плюс ещё наверное все контролы на нём. Ну плюс. На SetFocus отдавать его сразу диалогу С, не позволять менять размеры, перемещать и тд. Я бы просто делал по принципу разумной достаточности. Что в В юзер может напакостить, то и запирать.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #83 : 15-02-2010 13:30 » |
|
Ну если спортивно, то нужно иметь 2 цикла обработки событий Тогда что-то в этом духе: Остаётся повторить это в MFC проекте.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #84 : 15-02-2010 13:37 » |
|
Джон, а в MFC, сколь я помню, как раз есть формы, которые заводят для себя отдельные нити.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #85 : 15-02-2010 17:03 » |
|
Нити ? Потоки что ли ? Нет, модальные диалоги организуют цикл обработки очереди сообщений, поток они не создают
сейчас попробую это провернуть )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #86 : 15-02-2010 17:34 » |
|
вроде работает. Только при не блокированном главном окне надо не давать его закрыть (я это здесь не делал) - а то программа падает из-за оставшегося блокированным окна Bvoid C_B_DIALOG::OnButton1() { struct s_EnableKeeper { CWnd* pW;
s_EnableKeeper(CWnd* pW) { this->pW=pW; pW->EnableWindow(0); }
~s_EnableKeeper() { pW->EnableWindow(1); } };
if(((CButton*)GetDlgItem(IDC_chkBlockA))->GetCheck()) { C_C_DIALOG C(this); C.DoModal(); } else { s_EnableKeeper En(this);
C_C_DIALOG C; C.Create(C.IDD,this); C.ShowWindow(SW_SHOW); while(::IsWindow(C.m_hWnd) && C.IsWindowVisible()) { LONG counter=0; MSG m; if(::GetMessage(&m,0,0,0)) { counter=0; ::TranslateMessage(&m); ::DispatchMessage(&m); } else { counter++; extern CABCmodalApp theApp; theApp.OnIdle(counter); } }
if(::IsWindow(C.m_hWnd)) { C.DestroyWindow(); } } }
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #87 : 16-02-2010 06:27 » |
|
вроде работает. Только при не блокированном главном окне надо не давать его закрыть (я это здесь не делал) - а то программа падает из-за оставшегося блокированным окна B Лёш, это то, что я в п.4 написал. При закрытии А надо дать команду закрыть В, которое в свою очередь закроет С.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #88 : 16-02-2010 06:41 » |
|
в реальной программе у меня сделано проще - если пытаются закрыть A , я вывожу сообщение, что неплохо было бы сначала покончить с C
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #89 : 16-02-2010 08:40 » |
|
А зачем? И так по цепочке? Не любишь ты юзеров.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|