Проста програма, що використовує MDI інтерфейс h2>
У цьому розділі розглядається програма використовує
MDI (інтерфейс багатьох документів) p>
Ми створимо програму, в якій документом є
графічне зображення - круг. У ToolBar буде створена іконка, при натискання на
якою буде викликатися діалогове вікно, що дозволяє змінювати координати
кола. Розташування кола можна буде согранять у файл з розширенням CIR. P>
Створення проекту програми p>
1. Створіть новий проект (у мене MDI), що використовує
MDI інтерфейс з підтримкою MFC. Всі шість кроків у MFC AppWizard залиште без
зміни. p>
2. Якщо ви зробили все правильно, то створяться п'ять
класів: CMDIApp, CMainFrame, CChildFrame, CMDIDoc і CMDIView. У класі
документів CMDIDoc ви пишете код для підтримки даних програми, а в класі
подання CMDIView - код, який відповідає за те, що ви бачите на екрані. Ви
будете писати код у функціях-елементах тільки цих двох класів. p>
3. Оголошуємо елементи даних класу документа. Їх
буде два: координати кола по X і Y. Для цього відкриваємо файл CMDIDoc.h і
змінюємо оголошення класу CMDIDoc наступним чином: p>
class CMDIDoc:
public CDocument (protected: p>
// create from
serialization only CMDIDoc (); DECLARE_DYNCREATE (CMDIDoc)// Attributes public: int m_X;// координати кола по x int m_Y; p>
// координати
кола по y// Operations ... ... p>
4. Оголошуємо елементи даних класу подання. Їх
буде теж дві: координати кола по X і Y. Для цього відкриваємо файл
CMDIView.h і змінюємо оголошення класу CMDIView наступним чином: p>
class CMDIView:
public CView (protected: p>
// create from
serialization only CMDIView (); DECLARE_DYNCREATE (CMDIView)// Attributes public: CMDIDoc * GetDocument ();
int m_X; p>
// координати
кола по x int m_Y; p>
// координати
кола по y// Operations ... ... p>
Як ви бачите, імена змінних можуть збігатися (
зазвичай так і робиться). p>
5. Ініціалізіруем елементи даних класу документа.
Для цього відкрийте файл MDIDoc.cpp, знайдіть у ньому функцію OnNewDocument () і
напишіть в неї наступний код: p>
BOOL
CMDIDoc:: OnNewDocument () (if (! CDocument:: OnNewDocument ()) return FALSE; m_X =
100;// початкове положення по X = 100 m_Y = 100;
p>
// початкове положення по Y = 100 p>
// TODO: add reinitialization
code here// (SDI documents will reuse this document) return TRUE;) p>
6. Ініціалізіруем елементи даних класу
подання. Для цього потрібно створити функцію-елемент OnInitialUpdate () класу
подання: p>
Виберіть ClassWizard в меню View. На сторінці Message
Maps виберіть наступні події: p>
Class neme:
CMDIView Object ID: CMDIView Message: OnInitialUpdate p>
та натисніть Add Function p>
Напишіть наступний код у функцію OnInitialUpdate (): p>
void
CMDIView:: OnInitialUpdate () (CView:: OnInitialUpdate (); p>
// TODO: Add your
specialized code here and/or call the base class CMDIDoc * pDoc = GetDocument ();
p>
// отримати покажчик на документ p>
// оновити елементи даних подання p>
// відповідними значеннями документа. m_X =
pDoc-> m_X; m_Y = pDoc-> m_Y; pDoc-> SetTitle ( "ANDY"); p>
// всіх документів дається назва ANDY) p>
7. Тепер напишемо код для виводу кола на екран. P>
Функція OnDraw () класу подання автоматично
виконується кожного разу, коли потрібно вивести вікно документа. p>
Напишіть наступний код у функції OnDraw (): p>
void
CMDIView:: OnDraw (CDC * pDC) (CMDIDoc * pDoc = GetDocument ();
ASSERT_VALID (pDoc); p>
// TODO: add draw
code for native data here pDC-> Ellipse (m_X - 20, m_Y - 20, m_X + 20, m_Y +
20); p>
// малюємо коло діаметром 20) p>
8. Напишемо код для збереження і зчитування даних з
файлу. p>
Відкрийте файл MDIDoc.cpp, знайдіть у ньому функцію Serialize () і змініть її: p>
void CMDIDoc:: Serialize (CArchive & ar) (if
(ar.IsStoring ()) ( p>
// TODO: add
storing code here (це виконується, p>
якщо
вибрати SAVE) ar <
// записуємо m_X у вибраний файл ar <
// записуємо
m_Y у вибраний файл) else ( p>
// TODO: add
loading code here (це виконується, p>
якщо вибрати OPEN) ar>> m_X; p>
// зчитуємо значення з обраного файлу в m_X
ar>> m_Y; p>
// зчитуємо значення з обраного файлу в m_Y)) p>
9. Часто буває потрібно змінити деякі параметри
програми, такі як заголовок головного вікна або тип файлу за замовчуванням,
який виводиться у діалогових панелях SAVE і OPEN. Для цього потрібно вибрати
закладку ResourceView і відкрити пункт String Table. Ви побачите список
змінних проекту (три колонки: ID, Value і Caption). p>
IDR_MAINFRAME - заголовок головного вікна (змінюється в
полі Caption) p>
IDR_MCIRCLTYPE - тип файлу за замовчуванням, ви побачите 6
підрядка розділеними знаком n. Третя і четверта підрядка визначають тип
документа за замовчуванням. У мене CIR FILES (*. cir) і. Cir відповідно. Ви
можете поставити свої значення. p>
10. Тепер створимо кнопку в панелі інструментів. Для
цього потрібно вибрати закладку ResourceView і відкрити пункт Toolbar. Ви побачите
панель інструментів у режимі редагування. Натисніть на саму праву кнопку (
пунктирна квадрат), нижче намалюйте кнопку на ваш розсуд. Тепер двічі
натиснете на вашу кнопку і введіть ID: ID_MYBUTTON і Prompt: Зміна координат
кругаnІзмененіе координат кола. Ну от і все, кнопка готова. Тепер потрібно
створити функцію, яка буде виконуватись при натисканні на вашу кнопку: p>
Виберіть пункт меню View далі ClassWizard, виберіть
закладку Message Maps, Project: MDI, Class name: CMDIView, Object IDs:
ID_MYBUTTON, Message: COMMAND та натисніть Add Function. У відповідь
створиться функція void CMDIView:: OnMybutton (). p>
11. Тепер за аналогією з розділом 15 створимо
власне діалогове вікно з ID: IDD_MY_DIALOG і класом CMyDialog і розмістимо
в ньому чотири Edit Box зі змінними типу INT: m_DX - поточна позиція по X, m_DY
- Поточна позиція по Y, m_DXN - нова позііція по X, m_DYN - нова позііція по
Y. Не забудьте написати # include "MyDialog.h" у файлах MDIDoc.cpp і
MDIView.cpp. P>
12. Тепер напишемо код у функції OnMybutton (). p>
void
CMDIView:: OnMybutton () ( p>
// TODO: Add your
command handler code here CMDIDoc * pDoc = GetDocument (); p>
// отримуємо покажчик на документ CMyDialog MyD; p>
// створюємо змінну класу CMyDialog MyD.m_DX =
MyD.m_DXN = pDoc-> m_X; p>
// ініціалізмруем змінні діалогу MyD.m_DY =
MyD.m_DYN = pDoc-> m_Y;. P>
// MyD.DoModal (); p>
// створюємо новий діалог pDoc-> m_X = MyD.m_DXN; p>
// отримуємо нові значення pDoc-> m_Y = MyD.m_DYN; p>
//
OnInitialUpdate (); p>
// синхронізуємо дані Invalidate (TRUE
); P>
// перемальовує екран (виклик OnDraw ()) pDoc-> SetModifiedFlag (); p>
// ставимо прапор зміни документа) p>
13. Ну от і все, програма готова. Звідси можна взяти
робочу програму, що використовує MDI, в якій використовується власне
діалогове вікно. p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net/
p>