Шаг 13 - Обмен данными с диалоговой панелью без DDX

Создание проекта

Дополняем наш проект. В файле ресурсов необходимо создать еще одну простую диалоговую панель. Можете использовать старую, но не запутайтесь с идентификаторами !

13_1.gif (4599 b)

Создаем код

Нам нужно объявить идентификатор списка:

......
#define IDC_MYEDIT 102	// Идентификатор поля редактирования
#define IDC_LIST1 103	// Идентификатор поля со списком
......

Мы создадим наш класс CMyDialog. Описание класса:

class CMyDialog : public CDialog
{
public:
	CMyDialog( UINT nIDTemplate,CWnd* pParentWnd = NULL);	// конструктор
	~CMyDialog();	// деструктор
	virtual BOOL OnInitDialog();	// инициализация
	virtual void OnOK();	// реакция на нажатие OK
	CString GetString();	// получить строку
private:
	CListBox *cListBox;	// указатель на элемент управления
	CString csListTextItem;	// возвращаемое значение
};

Реализация:

CMyDialog::~CMyDialog()
{
	if (cListBox!=NULL) delete cListBox;	// если объект был создан удалить
}
CString CMyDialog::GetString()
{
	return csListTextItem;	// вернуть результат
}

void CMyDialog::OnOK()	// когда нажмут кнопку OK
{
	if (cListBox->GetCurSel()==LB_ERR )	// если в списке ничего не выбрано
	{
		AfxMessageBox("Select Item List Box");	// сообщить о ошибке
	}
	else	// иначе, то есть что-то выбрано
	{
		cListBox->GetText(cListBox->GetCurSel(),csListTextItem); // получить результат
		CDialog::OnOK();	// вызвать функцию предка
	}
}

CMyDialog::CMyDialog(UINT nIDTemplate, CWnd* pParentWnd)
		:CDialog(nIDTemplate,pParentWnd)
{
	cListBox=NULL;	// Объекта нет, NULL
}

BOOL CMyDialog::OnInitDialog()
{
	CDialog::OnInitDialog();	// метод предка
	CenterWindow();		// по центру окна
	CRect rect(10, 10, 100, 100);	// координаты для списка
	cListBox=new CListBox();	// создать объект списка
	cListBox->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_NOTIFY|WS_VSCROLL|WS_BORDER,rect,
		this, IDC_LIST1);	// и сам список связав его с идентификатором
	if (cListBox!=NULL)
	{
		cListBox->AddString("God");	// добавить строку
		cListBox->AddString("Bad");	// еще
		cListBox->AddString("VOID");	// еще
		return TRUE;	// сказать что все удачно.
	}
	else return FALSE;	// не смогли создать список
}

И применение:

void CMainWnd::OnLButtonDblClk( UINT, CPoint)
{
	CMyDialog about(IDD_DIALOG2);	// создать объект нашего класса
	if (about.DoModal()==IDOK)	// если пользователь выбрал OK
	{
		AfxMessageBox(about.GetString());	// показать результат
	}
}

Обратите внимание, что вызывается панель по двойному щелчку левой кнопкой. Вот так будет выглядеть программа после вызова диалоговой панели.

13_2.gif (3482 b)

Описание

Смотрите, в объявление класса CMyDialog добавилась функция OnInitDialog(). Это аналог функции OnCreate(), т.е. в ней описываются все элементы создания диалога. Функция OnOk() виртуальная и будет вызвана по нажатию кнопки OK. GetString() для возврата данных, мы ведь договорились своими методами, правда? CListBox* - указатель на будущий ListBox (окно со списком). csListTextItem - cтрока, которую вернет функция GetString().

Функция возврат строки GetString(). Там написано return csListTextItem - это понятно, вернуть строку.

Функция OnOK(). Когда пользователь нажмет кнопку Ok, управление передается в эту функцию. Дальше она проверяет, выбрали ли вы слово из списка используя константу LB_ERR. Эта константа возвращается когда нет выбора в поле со списком. Так, если выбора нет, тогда сообщается об этом и продолжить диалог. А вот если выбор был, с помощью функции GetText() получаем текст. В ней необходимо указать, куда будет возвращаться строка. Индекс мы берем текущий - GetCurSel() скажет, что выбрано(номер строки). И напоследок вызываем OnOk папы, он завершит диалог и вернёт результат.

В методе OnInitDialog() вызываем одноименный метод папы. Пусть он всё необходимое сделает. CenterWindow() поставит диалоговое окно по середине от текущего окна, это красиво. Создаем объект типа CRect для будущего списка. Создаем объект списка используя new, и окно списка используя Create(). Параметры - атрибуты списка, размер, куда вставлять и идентификатор. Addstring() добавляет строки в список.

И в конце изменяем реакцию на двойной щелчок левой кнопкой мыши. Вызываем панель, и в случае нажатия кнопки Ok показываем, что выбрано.

Запускайте и пробуйте, получится точно !

Шпаргалка

Создайте свой класс диалогового окна, переменные для данных, переменные для элементов управления.

class CMyDialog : public CDialog
{
	......
private:
	CListBox *cListBox;
	CString csListTextItem;
}

Опишите идентификаторы будущих элементов:

......
#define IDC_LIST1 103	// Идентификатор поля со списком
......

Перегрузите OnInitDialog(), создав в нем Ваши элементы управления:

BOOL CMyDialog::OnInitDialog()
{
	......
	CRect rect(10, 10, 100, 100);
	cListBox=new CListBox();
	cListBox->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_NOTIFY|
		WS_VSCROLL|WS_BORDER,rect,this, IDC_LIST1);
	......
}

Создайте функции возврата данных:

class CMyDialog : public CDialog
{
	......
	CString GetString();
	......
}

Перегрузите OnOk() для того, чтобы проверить, что пользователь ввел данные и вернуть данные из элементов управления в переменные.

void CMyDialog::OnOK()
{
	......
	cListBox->GetText(cListBox->GetCurSel(),csListTextItem);
	CDialog::OnOK();
	......
}

После завершения работы диалогового окна получите Ваши данные:

void CMainWnd::OnLButtonDblClk( UINT, CPoint)
{
	......
	about.DoModal();
	AfxMessageBox(about.GetString());
	......
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 05.09.99 (обновлено 28.06.2001)