Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://progs.biz

Рассылка №46

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

Полные версии уроков (с картинками) можно найти по адресам
Урок 40. Немодальное диалоговое окно.
Урок 41. Обмен данных с немодальным диалогом.

Visual C++. MFC. Урок 40. Немодальное диалоговое окно

Немодальное диалоговое окно, как известно, позволяет переключаться на основное окно приложения. Классический пример такого окна - это окно для поиска текста в Word'е. Когда это окно находится на экране, вы все равно имеете возможность продолжать набирать текст. На этом занятии мы и посмотрим, как делать окна акого типа.

Создайте новый проект с помощью AppWizard'а. Тип проекта выбираем Dialog Based, имя пусть для определенности будет NModal. Все параметры у Wizard'а можно оставить без изменения. Для того, чтобы не плодить лишний код, можете убрать галочки для поддержки ActiveX'ов и для окна About.

После того, как заготовка для нашего приложения будет создана, добавьте новый ресурс для диалогового окна (Ctrl+R). В нем ничего добавлять не требуется, только в свойствах (property) для этого диалога поставьте галочку для свойство Visible (на вкладке More Styles).

Создаем на его основе новый класс CDlg2 (для сего щелкаем на диалоге правой кнопкой мыши и затем выбираем ClassWizard).

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

class ... {
 ...
CDlg2 *m_pDlg2;
 ...

Разумеется, так как мы тут используем переменную типа CDlg2, то нам надо добавить соответствующий заголовочный файл:

...
#include "Dlg2.h"
 ...
CDlg2 *m_pDlg2;

Этот указатель надо обнулить в конструкторе класса первого диалогового окна (у меня это класс CNModalDlg):

CNModalDlg::CNModalDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CNModalDlg::IDD, pParent)
{
 ...
    m_pDlg2=NULL;
}

После этого добавьте на первое диалоговое окно кнопку. Как раз при нажатии на нее и появится наше второе немодальное диалоговое окно. В ее обработчик внесите следующий код:

void CNModalDlg::OnButton1()
{
    // TODO: Add your control notification handler code here
    if(!m_pDlg2){ //если диалог не создан
        m_pDlg2=new CDlg2; //то создаем его
        m_pDlg2->Create(IDD_DIALOG1);
    }
    else{ //если создан
        m_pDlg2->SetActiveWindow(); //то делаем его активным
    }
}

Запускаем программу. При нажатии на добавленную нами кнопку покажеться второе диалоговое окно, причем мы сможем переключаться между ними!

Наверх

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 в заголовке основного окна.

Наверх
Рассылки сайта progs.biz:
Рассылки Subscribe.Ru
Сайтостроение (уроки по HTML, PHP, MySQL, веб-дизайну)

Уроки по созданию сайта - HTML, PHP, JavaScript, PhotoShop, ASP, работа с базами данных, скрипты, SSI, Flash, использование HTML-редакторов (Dreamweaver, Homesite). Каждый урок рассчитан на 10-15 минут. Каждая серия уроков независима от других.


Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное