Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3] 4  Все   Вниз
  Печать  
Автор Тема: Несколько вопросов по поводу Visual C++  (Прочитано 80029 раз)
0 Пользователей и 20 Гостей смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #60 : 13-02-2010 13:16 » 

Не понял. Вроде окна блокируются по цепочке от модального через родители до основного, Дети заблокированных родителей тоже блокируются?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #61 : 13-02-2010 13:51 » 

Нет, не блокируются

но A - это главное окно. Что-то сильно курочит программу не хочется. Но я сейчас (как и вчера вечером) уже устал от активного дня и туплю, наверное Улыбаюсь
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #62 : 13-02-2010 14:20 » 

Поскольку в .NET Windows.Forms - тоже лишь обёртка над WinAPI, то написал тест:

Код: (Text) C#.NET
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.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #64 : 13-02-2010 15:15 » 

Ну это прибабахи MFC. Иди своим путём Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 13-02-2010 15:27 » 

m_B_init.SetParent(0);
 - не спасает тоже  )))
Записан

Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #67 : 14-02-2010 19:51 » 

хорошо )
Записан

Джон
просто
Администратор

de
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #69 : 15-02-2010 08:49 » 

Джон, тем не менее, работает это окно как модальный диалог, т.е. родители этого окна оказываются недоступными для пользовательских действий.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 15-02-2010 09:38 » 

Джон, я согласен, что дело именно в MFC - ведь в 6 студии работает так, а в 9 - иначе. А винда то не поменялась
Записан

Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #72 : 15-02-2010 11:09 » new

Прикол. Дело в логике:

Димка, как тебе такое Ага :


Код:
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();
        }
    }
}

А и В недоступны после запуска С. Ага

* Test1.exe (11 Кб - загружено 756 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #73 : 15-02-2010 11:20 » 

Но, зная Лёшку, с его: "А я так хочу!",

вообще-то, мне как раз красивее, как в 9-ке. Это клиент привык, это ЕМУ так нужно Улыбаюсь
« Последнее редактирование: 15-02-2010 11:22 от Алексей1153++ » Записан

Dimka
Деятель
Команда клуба

ru
Offline 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 » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #75 : 15-02-2010 12:08 » 

Да, я просто повторил вызовы как в лёшкином примере.

Даже если я вызываю немодальное окно явно с нулём:

Код:
        private void _showModelessDlgToolStripButton_Click(object sender, EventArgs e)
        {
            FormB dlg = new FormB();
            dlg.Show(null);
        }

Форма А всё-равно недоступна.


* Test1.rar (20.08 Кб - загружено 747 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #76 : 15-02-2010 12:11 » 

Можно по такой схеме сделать:
Код:
            a.Show();
            b.Show(a);
            b.Enabled = false;
            c.Show(b);
Но следует учитывать, что вызов Show несинхронный, т.е. программа не будет ждать закрытия окна.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #78 : 15-02-2010 12:25 » 

п 4 - тут всё понятно, оно у меняавтоматом отработает.

2 и 3 - "запирать" - как это делается ?
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #79 : 15-02-2010 12:33 » 

Цитата: Джон
Но это как-то...  неспортивно...
Ну если спортивно, то нужно иметь 2 цикла обработки событий Улыбаюсь Тогда что-то в этом духе:
Код: (Text)
            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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #80 : 15-02-2010 12:37 » 

Алексей1153++, по-моему это CWnd::EnableWindow
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #81 : 15-02-2010 12:46 » 

попробую
Записан

Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #84 : 15-02-2010 13:37 » 

Джон, а в MFC, сколь я помню, как раз есть формы, которые заводят для себя отдельные нити.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #85 : 15-02-2010 17:03 » 

Нити ? Потоки что ли ? Нет, модальные диалоги организуют цикл обработки очереди сообщений, поток они не создают

сейчас попробую это провернуть )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #86 : 15-02-2010 17:34 » 

вроде работает. Только при не блокированном главном окне надо не давать его закрыть (я это здесь не делал) - а то программа падает из-за оставшегося блокированным окна B

Код:
void 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();
}
}
}

* ABCmodal_vs9.rar (45.38 Кб - загружено 701 раз.)
Записан

Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #88 : 16-02-2010 06:41 » 

в реальной программе у меня сделано проще - если пытаются закрыть A , я вывожу сообщение, что неплохо было бы сначала покончить с C Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline 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."
Страниц: 1 2 [3] 4  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines