Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Написание инициализирующего кода

Инициализацию элементов управления лучше всего производить в функции OnInitDialog. Эта функция является обработчиком сообщения WM_ INITDIALOG, поэтому запустите Class Wizard, и создайте ее. А затем добавьте в нее следующий код.

BOOL Ankets::OnInitDialog()

{

// Преобразуем идентификатор списка в указатель на этот список.

// Note: Нельзя пытаться обратиться к элементу управления,

// преобразовав его идентификатор, если у него есть переменная-

// член из категории Control.

CListBox* pList=(CListBox*) GetDlgItem(IDC_LIST1);

CSliderCtrl* pSlid=(CSliderCtrl*) GetDlgItem(IDC_SLIDER1);

// Инициализация списка

pList->InsertString(-1,"Окрошка");

// Добавляем новый элемент в список. -1 означает, что

// данный элемент добавляется в конец списка.

pList->InsertString(-1,"Пельмени");

pList->InsertString(-1,"Картошка");

pList->InsertString(-1,"Блинчики");

pList->InsertString(-1,"Пирожки");

///////////////////////////////////////////////////

//Инициализация ползунка. Установка максимального и

//минимального значений.

pSlid->SetRange(0,100);

return CDialog::OnInitDialog();

}

Присваивание переменным начальных значений.

Если нужно, то можно установить начальные значения переменных в функции, откуда происходит вызов диалогового окна. В нашем случае это обработчик сообщения поступающего от пункта меню. Поэтому при помощи ClassWizard создайте обработчик сообщения поступающего от пункта “модальный” и добавьте в него следующий код.

void CMainFrame::OnMenuModal()

{

//Note: Не забудьте в начале данного класса подключить

// описание класса Ankets, при помощи команды

// #include "Ankets.h"

//Создание переменной my_dialog

Ankets my_dialog;

//Пример присваивания начального значения списку

my_dialog.m_eat="Блинчики";

//Вызов модального диалогового окна

my_dialog.DoModal();

}

Самостоятельная работа.

Добавьте вывод введенной информации в окно приложения. Для до вызова DoModal получите указатель на текущий контекст устройства, и в нем выведите текст на экран.

Добавление немодального диалогового окна. Добавьте ресурс “диалоговое окно”, и создайте для него класс CNemodal, производный от CDialog. Не забудьте в свойствах ресурса установить свойство Visible.

Добавление нового конструктора. Так как AppWizard изначально генерирует модальный конструктор, то нам он не подходит. Поэтому мы должны создать новый немодальный конструктор и еще функцию создания немодального диалогового окна. Эти функции должны быть объявлены как Public. Также необходимо добавить закрытую переменную, в которой будет храниться указатель на объект CView.

private:

// Переменная указатель на объект Cview.

CView* m_pView;

………………………………..

//Немодальный конструктор

CNemodal::CNemodal(CView *pView)

{

//Сохраняем указатель на переданный экземпляр класса CView

m_pView=pView;

}

// Функция создания немодального окна

BOOL CNemodal::Create()

{

// Создание немодального окна

return CDialog::Create(CNemodal::IDD);

}

Чтобы при генерации модального окна не происходило ошибок, вставьте в модальный конструктор следующую строчку:

m_pView=NULL;

Добавление нового идентификатора сообщения. Добавьте в файл Nemodal.h следующее описание:

#define WM_GOODBYE WM_USER+5

Редактирование функций OnOK и OnCancel. Добавьте обработчики кнопок Ok и Cancel, и отредактируйте их следующим образом:

// Вызывается когда пользователь нажимает

// кнопку Ok

void CNemodal::OnOK()

{

// Если созданное диалоговое окно создано

// при помощи немодального конструктора то отсылаем

// сообщение WM_GOODBYE

if (m_pView != NULL)

{

// Если немодальное окно, то тогда обновляем данные,

// и посылаем сообщение WM_GOODBYE от кнопки OK

UpdateData(TRUE);

m_pView->PostMessage(WM_GOODBYE,IDOK);

}

else

// Если же модальное окно, то пользуемся

// стандартной функцией.

CDialog::OnOK();

}

// Вызывается когда пользователь нажимает

// кнопку Cancel

void CNemodal::OnCancel()

{

// Если созданное диалоговое окно создано

// при помощи немодального конструктора то отсылаем

// сообщение WM_GOODBYE

if (m_pView != NULL)

{

// Если немодальное окно, то посылаем сообщение

// WM_GOODBYE от кнопки CANCEL

m_pView->PostMessage(WM_GOODBYE,IDCANCEL);

}

else

// Если же создано модальное окно,

// то пользуемся стандартной функцией.

CDialog::OnCancel();

}

Редактирование класса CL4_1View. Для того чтобы Вы могли работать с немодальным диалоговым окном необходимо в классе CL4_1View создать указатель на экземпляр диалогового окна. Для этого добавьте в заголовочный файл следующие строки.

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

//Определение класса CNemodal

//для того чтобы не надо было

//подключать заголовочный файл

// к каждому классу

class CNemodal;

// Создание переменной указывающей на

// объекты класса CNemodal.

private:

CNemodal* m_pDlg;

Создание обработчика сообщения WM_GOODBYE. Добавьте в класс CL4_1View обработчик сообщения WM_GOODBYE. Сделать это придется вручную, так как это нестандартное сообщение. Для этого сначала необходимо добавить макрос в таблицу сообщений, связывающий данное сообщение с конкретной функцией – обработчиком. А затем добавить саму функцию.

Добавление макроса

BEGIN_MESSAGE_MAP(CL4_1View, CView)

// Макрос связывающий сообщение с функцией-обработчиком

ON_MESSAGE(WM_GOODBYE,OnGoodbye)

//{{AFX_MSG_MAP(CL4_1View)

ON_WM_LBUTTONDOWN()

ON_COMMAND(ID_MENU_NEMODAL, OnMenuNemodal)

ON_WM_RBUTTONDOWN()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Добавление прототипа

protected:

// Прототип функции-обработчика собщения WM_GOODBYE

afx_msg void CL4_1View::OnGoodbye(UINT wParam, LONG lParam);

//{{AFX_MSG(CL4_1View)

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMenuNemodal();

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

Добавление функции

// Функция - обработчик сообщения WM_GOODBYE

void CL4_1View::OnGoodbye(UINT wParam, LONG lParam)

{

// Уничтожаем немодальное окно

m_pDlg->DestroyWindow();

}

Вызов немодального окна. Для того чтобы добавить в Вашу программу возможность вызова немодального окна необходимо создать в классе CL4_1View обработчик сообщения ON_COMMAND, которое посылается пунктом меню “Немодальное”.

// Обработчик пункта "Немодальное"

void CL4_1View::OnMenuNemodal()

{

//Если указатель на окно равен 0

//(Если окно не создано)

if (m_pDlg->GetSafeHwnd()==0)

{

//Создаем окно

m_pDlg->Create();

}

}