C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 41. Обмен данных с немодальным диалогом / Уроки MFC / Visual C++

Visual C++. MFC
Урок 41. Обмен данных с немодальным диалогом

На прошлом уроке мы создали немодальное диалоговое окно, но никакого обмена данными между ним и основным окном нашец программы не было. Сейчас мы это исправим. Откройте второе диалоговое окно в редакторе ресурсов и добавьте на него один edit. Оставьте идентификатор edit'а без изменений. С помощью ClassWizard'а добавьте к edit'у переменную m_sData типа CString (для этого перейдите в ClassWizard'е на вкладку Member Variables, выделите строку IDC_EDIT1 и нажмите на кнопку Add Variable). Кроме edit'а добавьте в диалоговое окно кнопку. Для нее задайте идентификатор IDC_APPLY и надпись на ней - Apply.

Теперь нам надо внести небольшие изменения в код, созданный на прошлом уроке. А именно, в классе CDlg2 второго диалогового окна нам нужен указатель на первое окно (так как мы будем передавать данные не закрыв второе окно - оно же у нас немодальное). Делаем это следующим образом: сначала заводим соответствующую переменную в классе второго диалогового окна:

class CNModalDlg;
class CDlg2 : public CDialog
{
public:
    CDlg2(CWnd* pParent = NULL);   // standard constructor
    CNModalDlg* m_pDlg; //Указатель на первое окно
    ...

Обратите также внимание, что перед определением класса CDlg2 мы добавили строку

class CNModalDlg;
...

Без нее компилятор будет ругаться - не знаю, мол, что это за тип такой CNModalDlg*.

Далее в существующем конструкторе класса второго диалогового окна мы в эту переменную записываем соответсвующее значение:

#include "NModalDlg.h"
...
CDlg2::CDlg2(CWnd* pParent /*=NULL*/)
    : CDialog(CDlg2::IDD, pParent)
{
    ...
    m_pDlg=(CNModalDlg*)pParent;
}

Обратите внимание, что мы include'ом включили файл NModalDlg.h (это заголовочный файл для нашего основного окна).

Теперь изменим обработчик для кнопки в первом диалоговом окне:

void CNModalDlg::OnButton1() 
{
    if(m_pDlg2==NULL){
        m_pDlg2=new CDlg2(this);
        m_pDlg2->Create(IDD_DIALOG1);
        m_pDlg2->ShowWindow(SW_SHOWNORMAL);
    }
    else{
    ...
}

Как вы видите, здесь мы вместо конструктора без параметров вызываем конструктор с параметром this. Тем самым, когда второй диалог создается, в его переменную m_pDlg записывается указатель на первое диалоговое окно.

И, наконец, в обработчик для кнопки Apply добавьте следующий код:

void CDlg2::OnApply() 
{
    // TODO: Add your control notification handler code here
    //Передаем данные из edit'а в переменную m_sData
    UpdateData();
    //Передаем данные в основное окно
    m_pDlg->SetWindowText(m_sData);
}

Запускайте программу и вызывайте немодальное окно. То, что вы в его edit'е напечатаете, появится после нажатия на кнопку Apply в заголовке основного окна.