Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Створення обробника меню




Якщо ви запустите попередній проект, то меню Dialog буде сірим:

 

Так виходить тому, що у нашого вікна немає обробника. Додамо його. Для цього внесіть в наш код такі зміни:

 

CMyMainWnd ()

{/ / Конструктор

LoadFrame (IDR_MENU1);

} / / Вводимо функцію для обробки клацання по меню

void OnMyMenuDialog ();

...

Потім напишіть реалізацію цієї функції в кінці нашого файлу:

 

... void CMyMainWnd :: OnMyMenuDialog ()

{

AfxMessageBox ("Menu!"); / / Показ MessageBox'а

}

 

Після цього нам треба зв'язати ідентифікатор нашого меню із написаної вище функцією. Для з'ясування, який ідентифікатор має меню, перейдіть на вкладку ResourceView, потім подвійним клацанням на меню IDR_MENU1 відкрийте редактор меню і подвійним клацанням на пункті меню Dialog відкрийте його властивості:

Звідси видно, що ідентифікатор для меню - це ID_MYMENU_DIALOG. Для зв'язування його з нашої функцією додайте наступний код:

 

BEGIN_MESSAGE_MAP (CMyMainWnd, CFrameWnd) / / початок карти повідомлень

ON_COMMAND (ID_MYMENU_DIALOG, OnMyMenuDialog)

/ / зв'язування ідентифікатора з функцією

END_MESSAGE_MAP () / / кінець карти повідомлень

 

Цей фрагмент коду можна додати, скажімо, відразу після оголошення класу CMyMainWnd (не додайте його всередину якого-небудь класу. Ці рядки треба помістити поза класів). Зверніть увагу на параметри макросу BEGIN_MESSAGE_MAP. Перший - показує, для якого класу ми пишемо нашу карту повідомлень. Другий - вказує батьківський клас для нашого класу, тобто клас, який буде обробляти ті повідомлення, які не може обробити наш клас CMyMainWnd.

Ми ввели карту повідомлень для класу CMyMainWnd. Її ще треба визначити в самому класі. Для цього в кінці класу CMyMainWnd імпользуется DECLARE_MESSAGE_MAP ();};

Готово! Запускайте програму, вибирайте меню Dialog і милуйтеся на MessageBox:

 

3. Додавання діалогового вікна

У цьому уроці ми додамо ще один ресурс - діалогове вікно. Воно буде з'являтися при виборі нашого меню Dialog.

Зайдіть в меню Insert, потім у підменю Resource і далі в діалоговому вікні виберіть пункт Dialog і натисніть на кнопку New. З'явиться діалогове вікно в режимі конструктора:

Тепер напишемо код, за яким вікно буде з'являтися. Додайте наступні рядки в обробник нашого меню (рядок AfxMessageBox ("Menu!"); Можна видалити):

void CMyMainWnd :: OnMyMenuDialog ()

{

CDialog dlg (IDD_DIALOG1);

dlg.DoModal ();

}

 

Запустіть проект. Тепер при виборі меню у нас з'явиться наше діалогове вікно.

Код можна злегка змінити. Так, щоб програма знала, що ми натиснули в нашому діалозі - кнопку OK або Cancel:

void CMyMainWnd::OnMyMenuDialog()

{

CDialog dlg(IDD_DIALOG1);

if(dlg.DoModal()==IDOK)

AfxMessageBox("Кнопка OK");

else AfxMessageBox("Кнопка Cancel");

}

 

Під'єднуємо майстер ClassWizard

 

В Visual C + + крім майстрів для створення простого додатка є такий чудовий майстер як ClassWizard. Він призначений для роботи з класами - для добавки в них методів і властивостей, для додавання змінних до елементів діалогового вікна і для інших цілей. ClassWizard автоматично під'єднається до вашого проекту, якщо ви запускаєте який-небудь майстер для створення заготовки для вашого застосування. Ми ж пишемо наші перші програми з MFC без майстрів, тому нам треба майстер ClassWizard під'єднати. Частина класів у нас вже написана без нього. Якщо ми хочемо в подальшому використовувати ClassWizard і для вже написаних класів, то ми повинні внести в них деякі зміни (тобто додати код, який вніс би ClassWizard, якби писав заготовку для наших класів сам). Зробимо це.

 

Вставте наступний код у protected-секцію класу CMyMainWnd:

class CMyMainWnd: public CFrameWnd

{

protected: / / {{AFX_MSG (CMyMainWnd) / /}}

AFX_MSG ...

 

Потім вставте код в public-секцію класу CMyMainWnd:

public: / / {{AFX_VIRTUAL (CMyMainWnd) / /}} AFX_VIRTUAL ...

 

І, нарешті, в карту повідомлень класу CMyMainWnd:

BEGIN_MESSAGE_MAP (CMyMainWnd, CFrameWnd) / / {{AFX_MSG_MAP (CMy MainWnd) / /}} AFX_MSG_MAP ... END_MESSAGE_MAP ()

 

Доданий нами код буде компілятором ігноруватися (це ж коментар), але для ClassWizard він дуже важливий. Саме між доданими нами рядками ClassWizard і буде писати щось своє.

Після цього натисніть комбінацію клавіш Ctrl + W для виклику ClassWizard. Так як файлу для нього немає (з розширенням *. Clw), то він запропонує вам його створити:

Відповідайте Так. У вікні спочатку натисніть на Add All (для під'єднання існуючих класів), і потім на OK:

З'явиться вікно ClassWizard.

Зверніть увагу, що в випадаючому списку Class Name буде наш клас CMyMainWnd. Це тому, що саме в нього ми додали рядки типу

/ / {{AFX_ ... (CMyMainWnd) / /}} AFX_ ...

Натискаємо OK для закриття ClassWizard. Якщо він нам буде потрібен, то викликаємо його комбінацією клавіш Ctrl + W.

Зверніть увагу, що в папці вашого проекту з'явиться файл ClassWizard'а (з розширенням *. Clw):

 

4. Додавання діалогу за допомогою класу

Ми розглянули створення діалогового вікна. При цьому ми не створювали новий клас. Подивимося тепер, як можна створити діалогове вікно з створенням нового класу.

Почнемо з того, що створимо ресурс для діалогового вікна. Для цього заходимо в меню Insert, далі вибираємо Resource. У діалозі вибираємо Dialog і натискаємо на New. Для того, щоб не сплутати наш діалог з попереднім, змініть його заголовок. Для цього клацніть на ньому правою кнопкою миші і виберіть Properties. У вікні властивостей змініть властивість Caption на Dialog (class):

 

Додавання діалогового вікна.

Закрийте вікно властивостей. Тепер використовуємо ClassWizard для створення нового класу. Для цього викличте для нашого нового діалогового вікна контекстне меню і виберіть у ньому ClassWizard. У вікні Adding a Class виберіть Create a new class і натисніть на OK:

 

З'явиться наступне діалогове вікно New Class. У ньому задайте властивість Name як CDlg і переконайтеся, що у випадному списку Dialog ID вибраний ідентифікатор нашого нового діалогового IDD_DIALOG2, після чого натисніть OK:

 

Після цього у вікні ClassWizard в списку класів з'явиться наш новий клас:

 

Тепер займемося необхідними змінами в коді. Їх кілька. По-перше, треба змінити обробник нашого меню. До цього в ньому викликалося перше діалогове вікно. Приберіть з обробника старий код та додайте код для появи нашого другого діалогового вікна:

void CMyMainWnd :: OnMyMenuDialog ()

{

CDlg dlg; dlg.DoModal ();

}

 

Так як ми використовуємо клас CDlg, то його заголовний файл треба додати в клас реалізації нашого класу CMyMainWnd (це файл, в якому ми написали обробник для меню):

 

# include <afxwin.h>

# include "resource.h"

# include "Dlg.h" ...

 

Тепер, якщо ви запустите нашу програму і виберете відповідне меню, то з'явиться наше нове діалогове вікно:

 

5. Обмін даними з діалогом

У цьому уроці ми з вами подивимося як, використовуючи ClassWizard, проводити обмін даних між програмою і діалоговим вікном. Наша програма буде передавати рядок з діалогового вікна в своє головне вікно і назад. Передана рядок буде з'являтися у заголовку нашого застосування.

Додайте на наше діалогове вікно Edit:

Для того, щоб передавати дані в діалог і назад, нам треба завести дві змінні - одну в класі діалогового вікна, а іншу - у віконному класі CMyMainWnd. Спочатку заведемо змінну в класі діалогового вікна. Для цього викликаємо ClassWizard, переходимо в ньому на вкладку Member Variables, у випадному списку Class name вибираємо клас нашого діалогового вікна CDlg, потім виділяємо ідентифікатор IDC_EDIT1 (це ідентифікатор Edit'а, який ми додали в наш діалог), і, нарешті, натискаємо на кнопку Add Variable:

Народитися вікно Add Member Variable. У ньому задайте m_sMyString в якості імені для нової змінної (і переконайтеся, що для ComboBox'а Variable type варто тип CString):

Натисніть OK. Додана нами змінна здасться в ClassWizard:

Крім того вона здасться в класі CDlg на вкладці ClassView:

Тепер додамо змінну у віконний клас:

class CMyMainWnd: public CFrameWnd

{

...

public: CString m_sMyString;

...

 

Тепер залишилося переписати код для нашого меню. Він повинен виглядати так:

void CMyMainWnd :: OnMyMenuDialog ()

{

CDlg dlg;

dlg.m_sMyString = m_sMyString; / / Передаємо дані в діалог

if (dlg.DoModal () == IDCANCEL) / / Якщо натиснули на cancel,

return; / / то виходимо

m_sMyString = dlg.m_sMyString; / / Передаємо дані і діалогу

SetWindowText (m_sMyString); / / Новий заголовок для вікна

}

Запускаємо програму і викликаємо наше діалогове вікно. Задаємо в ньому новий рядок:

 

Натискаємо на кнопку OK. Введений рядок здасться в заголовку нашої програми:

 

Також зверніть увагу, що при повторному виклику діалогу в ньому знову здасться наша рядок.

 

КОНТРОЛЬНІ ЗАПИТАННЯ

1. Назвіть послідовність етапів Створення меню?

2. Як Створити обробник меню, якими способами Це можна здійснити?

3. Назвіть послідовність етапів створення діалогового вікна?

4. Назвіть послідовність етапів створення діалогу за допомог класу?
Лекція № 9

Тема: Розробка додатка управління базою даних

ПЛАН:

1. Створення додатка, що відображає дані з БД;

2. Забезпечення видалення, редагування, додавання записів в БД;

3. Забезпечення сортування та фільтрації записів з БД.

4. Стандарт ODBC і DAO

 

1. Створення додатка, що відображає дані з БД

Створення екранної форми для відображення вмісту бази даних. Нехай наша програма називається DB. Як зазначено раніше створіть заготівку програми. Потім вам необхідно модифікувати діалог, пов'язаний з похідним класом від CRecordView, призначеним для відображення даних у вікні додатка. Оскільки цей діалог є просто спеціалізованим типом діалогового вікна, пов'язаного з базою даних, модифікацію можна здійснити за допомогою редактора ресурсів Visual Studio:

1. Для відображення ресурсів додатка клацніть на корінці вкладки ResourceView. Розгорніть дерево ресурсів, клацнувши на знаку "+ '" перед папкою DB Resources. Далі, відкрийте папку ресурсів Dialog і зробіть подвійне клацання на ідентифікаторі діалогового вікна IDD_DB_FORM (AppWizard генерує діалог IDD_DB_FORM) і тим самим відкрийте діалог в редакторі ресурсів.

2. Виділіть рядок у центрі діалогового вікна, а потім видаліть його, натиснувши клавішу <Del>.

3. Користуючись інструментами редактора діалогового вікна, додайте в нього текстові поля редагування і статичні написи за зразком, показаному на рис. 9.1. Привласніть полях редагування ідентифікатори відповідно до шаблону: IDC_назва таблиці_назва поля (наприклад для поля ID таблиці User IDC_USERID, а для поля FirstName - ідентифікатор IDC_USERFIRSTNAME). Для текстового поля, яке містить ідентифікатор IDC_USERID, встановіть стиль Read-OnIу (визначається однойменним прапорцем на вкладці Styles у вікні властивостей Edit Properties). Часто перед назвою поля на етапі проектування ставиться назва таблиці. Особливо це зручно, якщо поле з такою назвою існує в кількох таблицях.

4. Кожне з цих текстових полів буде являти собою поле запису бази даних. Атрибут Read-Only (тільки для читання) установлена для першого (текстового) поля з тієї причини, що воно буде містити первинний ключ бази даних, який не підлягає зміні.

5. Для виклику майстра СlassWizard виберіть команду View \ ClassWizard і в розкрився вікні клацніть на корінці вкладки Member Variables.

6. Вибравши ресурс IDC_USERFIRSTNAME, клацніть на кнопці Add Variable. Розкриється діалогове вікно Add Member Variable.

7. Клацніть на стрілці поруч із списком Member Variable Name і виберіть у ньому значення m_pSet-> m_UserFirstName (рис. 9.2).

8. Аналогічно зв'яжіть з елементами редагування інші змінні-члени (m_pSet-> m_UserMiddleName, m_pSet-> m_UserLastName і m_pSet-> m_UserEMail). Коли це буде зроблено, вкладка Member Variables вікна MFC ClassWizard повинна виглядати так, як показано на рис. 9.3. Вибравши змінні-члени класу додатка CDBSet (похідного від класу MFC CRecordset) в якості змінних для елементів управління в класі уявлення бази даних (у формі), ви встановили зв'язок, за допомогою якої може відбуватися обмін даними між елементами редагування і джерелом даних.

9. Після клацання на кнопці ОК у вікні MFC ClassWizard внесені зміни будуть зафіксовані в тексті програми.

Рис.9.1. Створення діалогового вікна, яке буде використовуватися в якості форми для бази даних

Рис. 9.2. Зв'язування поля IDC_USER _USERFIRSTNAME c змінної-членом m_UserFirstName класу вибірки даних

Рис. 9.3.Связь елементів управління із змінними-членами класу CDBSet

 

Ми завершили створення екранної форми для відображення даних у додатку Employee. Відкомпілюйте і запустіть програму і ви побачите вікно, показане на мал. 9.4. Додаток відображає вміст записів таблиці User. Використовуючи елементи навігації, розташовані на панелі інструментів, можна перемішатися від одного запису таблиці User до іншої.

 

Рис. 9.4. Відображення в додатку даних з таблиці User

 

Перевіривши можливість переміщення в базі даних, спробуйте оновити будь-яку з записів. Для цього достатньо просто змінити вміст будь-якого з полів запису (за винятком поля UserID, яке є первинним ключем і не може бути змінене). При переході до іншого запису програма автоматично перенесе відредаговані дані в таблицю. Команди меню Record (Запис) програми дозволяють переміщатися по записах в базі даних точно так, як піктограми панелі інструментів. Додавання і видалення записів. Після включення в створюване додаток можливості додавати і видаляти записи в таблиці бази даних воно перетвориться на повнофункціональну програму обробки однофайлової (але не реляційної) бази даних. У нашому випадку в ролі однофайлової бази даних виступає таблиця User реляційної бази даних віртуального магазину.

 

2. Забезпечення видалення, редагування, додавання записів в БД

Додавання і видалення записів у таблиці бази даних реалізуються досить просто завдяки існуванню в Visual C + + класів CRecordView і CRecordset, що надають всі необхідні методи для виконання цих стандартних операцій. Необхідно буде додати в додаток кілька команд меню (див. створення меню). Для додавання до додатка команд Add (Додати) і Delete (Видалити) виконайте наступні дії:

1. Клацніть на корінці вкладки ResourceView, відкрийте папку Menu і зробіть подвійний Клацання на меню IDR_MAINFRAME. На екрані розкриється вікно редактора меню.

2. Клацніть у меню Record і тим самим відкрийте його, а потім клацніть на порожній області в нижній частині цього меню. Виберіть команду View \ Properties і перемістіть розкрилося діалогове вікно Properties на підходяще для нього місце.

3. У полі ID введіть значення ID_RECORD_ADD, а в полі Caption введіть значення & Add Record. У результаті в меню Record буде додана нова команда.

4. У наступний порожній елемент меню внесіть команду видалення, що має ідентифікатор ID_RECORD_DELETE (поле ID) та заголовок Delete Record (поле Caption), як показано на рис.9.5.

 

Рис. 9.5. Додавання в меню команд додавання і видалення записів

 

Далі необхідно додати на панель інструментів пару нових піктограм (додаток 4) і пов'язати з командами меню. Виконайте наступні дії:

1. У дереві ресурсів у вікні ResourceView відкрийте папку Toolbar і зробіть подвійне клацання на ідентифікаторі IDR_MAINFRAME. Панель інструментів додатка буде відображена у вікні редактора ресурсів.

2. Клацнувши на порожній піктограмі панелі інструментів, виберіть її, а потім за допомогою інструментів графічного редактора намалюйте на ній блакитний знак "плюс", як показано на рис. 9.6.

3. Зробіть подвійне клацання на новій піктограмі панелі інструментів. Розкриється вікно властивостей Toolbar Button Properties. У списку ID виберіть значення ID_RECORD_ADD.

4. Знову виділіть порожню піктограму панелі інструментів і намалюйте на ній червоний знак "мінус", надайте піктограмі ідентифікатор ID_RECORD_DELETE аналогічно "плюса". Перетягніть піктограми додавання і видалення лівіше піктограми довідки, поміченої знаком питання.

Рис. 9.6. Додавання піктограми на панель інструментів

 

Тепер, коли в меню вже додані нові команди і на панель інструментів поміщені відповідні піктограми, необхідно сформувати програмний код, який буде обробляти командні повідомлення, що посилаються, коли користувач клацає на піктограмі або вибирає пункт меню.

Так як в нашому додатку з базою даних пов'язаний клас уявлення, в ньому слід організувати перехоплення цих повідомлень. Виконайте наступні операції:

1. Розкрийте вікно ClassWizard і виберіть у ньому вкладку Message Maps.

2. У списку Class Name виберіть CDBView, а в списку Object IDS - значення ID_RECORD_ADD, після чого зробіть подвійне клацання на значенні COMMAND в списку Messages. Розкриється діалогове вікно Add Member Function.

3. Клацніть на кнопці ОК, прийнявши для нової функції ім'я, запропоноване за замовчуванням. Ім'я нової функції з'явиться в списку Member Functions в нижній частині вікна ClassWizard.

4. Аналогічним чином додайте метод для обробки команди ID_RECORD_DELETE. Закрийте вікно майстра СIassWizard, клацнувши на кнопці ОК.

5. У вікні ClassView, двічі клацнувши на елементі CDBView, відкрийте файл DBView.h. В оголошенні класу додайте наступні рядки в розділ Attributes:

protected:


Поделиться:

Дата добавления: 2014-12-03; просмотров: 111; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты