Загальна інформація про MFC Ієрархія класів MFC Місце MFC в середовищі розробника Visual C

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Загальна інформація про MFC. Ієрархія класів MFC. Місце MFC в середовищі розробника Visual C + +

Ієрархія основних класів MFC. CObject (забезпечує базові операції введення / виводу) → CGDIObject (підтримка графічних об'єктів); CDC (клас, що забезпечує зв'язок з пристроями); CExeption (обробка виняткових ситуацій в MFC); CFile (базовий клас для обробки файлів); CMenu (підтримка об'єктів меню); CCmdTarget (базовий для обробки повідомлення) 1) → CWnd (базовий клас для вікон); З FrameWnd; 2) → CWinThread; CwinApp;

Структура простий MFC програми. Програма на MFC містить, принаймні, 2 класу. І ці класи породжуються від CWnd і CWinThread. Для реалізації простої програми зробимо наступну послідовність кроків: 1) Створити клас додатків, породжений від CWinApp. 2) Створити клас вікна, породжений від CFrameWnd. 3) Для класу додатка оголосити функцію InitInstance (). 4) У конструкторі класу вікна викликати функцію Create для створення вікна. 5) Оголосити глобальний об'єкт докладання. 6) Створити карту повідомлення. 7) Підключити заголовні файли і визначитися з типом об'єктів.

/ / App.h

class CApp: public CWinApp

{Public: BOOL InitInstance ();};

Class CMainWin: public CFrameWnd

{Public: CMainWin (); DECLARE_MESSAGE_MAP ()

};

/ / App.cpp

# Include <afxwin.h>

# Include "App.h"

BOOL CApp:: InitInstance ()

{M_pMainWnd = newCMainWin; m_pMainWnd → ShouWindow (m_nCmdShow); m_pMainWnd → UpdateWindow (); return TRUE;}

CMainWin:: CMainWin ()

{Create (NULL, "Перша MFC-програма");}

CApp App;

BEGIN_MESSAGE_MAP (CMainWin, CFrameWnd)

END_MESSAGE_MAP ()

MFC - (Microsoft Foundation Class Library) базова бібліотека класів; Ієрархія класів MFC. Бібліотека MFC містить велику ієрархію класів, написаних на C + +. У її вершині знаходиться клас CObject, який містить різні функції, які використовуються під час виконання програми і призначені, зокрема, для надання інформації про поточний типі під час виконання, для діагностики, і для серіалізациі. Інформація про тип часу виконання. Якщо покажчик або посилання посилається на об'єкт, похідний від класу CObject, то в цьому випадку передбачений механізм визначення реального типу об'єкта за допомогою макросу RUNTIME _ CLASS (). Хоча в C + + є механізм RTTI, механізм, реалізований в MFC, набагато ефективніший в продуктивності.

Діагностика. Кожен клас, похідний від CObject, може за запитом перевірити свій внутрішній стан і видати діагностичну інформацію. Це інтенсивно використовується в MFC при налагодженні.

Серіалізациі. Серіалізация - це механізм, що дозволяє перетворити поточний стан об'єкта в послідовний потік байт, який зазвичай потім записується на диск, і відновити стан об'єкта з послідовного потоку, зазвичай при читанні з диску. Це дозволяє зберігати поточний стан програми на диску, і відновлювати його при наступному запуску.

Основні класи. Деякі класи породжуються безпосередньо від CObject. Найбільш широко використовуваними серед них є CCmdTarget, CFile, CDC, CGDIObject і CMenu. Клас CCmdTarget призначений для обробки повідомлень. Клас CFile призначений для роботи з файлами. Клас CDC забезпечує підтримку контекстів пристроїв. Про контекстах пристроїв ми будемо говорити трохи пізніше. У цей клас включені практично всі функції графіки GDI. CGDIObject є базовим класом для різних DGI-об'єктів, таких як пір'я, кисті, шрифти та інші. Клас CMenu призначений для маніпуляцій з меню. Від класу CCmdTarget породжується дуже важливий клас CWnd. Він є базовим для створення всіх типів вікон, включаючи масштабовані ("звичайні") і діалогові, а також різні елементи управління. Найбільш широко використовуваним похідним класом є CFrameWnd. Як Ви побачите в подальшому, в більшості програм головне вікно створюється за допомогою саме цього класу. Від класу CCmdTarget, через клас CWinThread, породжується, напевно, єдиний з найбільш важливих класів, звернення до якого в MFC-програмах відбувається прямо: З WinApp. Це один з фундаментальних класів, оскільки призначений для створення самого додатка. У кожній програмі є один і тільки один об'єкт цього класу. Як тільки він буде створений, додаток почне виконуватися.

Функції-члени в MFC. Більшість функцій, що викликаються в MFC-програмі, є членами одного з класів, визначених у бібліотеці. Більшість функцій API доступні через функції-члени MFC. Тим не менш, завжди можна звертатися до функцій API прямо. Іноді це буває необхідним, але все ж у більшості випадків зручніше використовувати функції-члени MFC.

Глобальні функції в MFC. У бібліотеці є ряд глобальних функцій. Всі вони починаються з префікса Afx. (Коли MFC тільки розроблялася, то проект називався AFX, Application Framework. Після низки істотних змін AFX була перероблена в MFC, але колишня назва збереглося в багатьох ідентифікаторах бібліотеки і в назвах файлів.) Наприклад, дуже часто використовується функція AfxMessageBox (), що відображає заздалегідь певне вікно повідомлення. Але є і член-функція MessageBox (). Таким чином, часто глобальні функції перекриваються функціями-членами. Файл AFXWIN. H. Всі MFC-програми включають заголовний файл AFXWIN. H. У ньому, а також у різних допоміжних файлах, містяться описи класів, структур, змінних і інших об'єктів MFC. Він автоматично підключає більшість заголовних файлів, що відносяться до MFC, в тому числі і WINDOWS. H, в якому визначені всі функції Windows API та інші об'єкти, які використовуються при традиційному програмуванні на С і "чистому" APL.

Каркас MFC-програми. У найпростішому випадку програма, написана з допомогою MFC, містить два класи, породжувані від класів ієрархії бібліотеки: клас, призначений для створення додатку, і клас, призначений для створення вікна. Іншими словами, для створення мінімальної програми необхідно породити один клас від CWinApp, а інший - від CFrameWnd. Ці два класи обов'язкові для будь-якої програми. Крім створення вищезазначених класів, у програмі також повинна бути організована обробка всіх повідомлень, що надходять від Windows. У даному прикладі програма ще нічого корисного не робить, тому відповідати на кожне повідомлення не потрібно. MFC обробить всі повідомлення, які нас не цікавлять. Проте в цьому прикладі є карта відгуків на повідомлення, або просто карта повідомлень. Пізніше ми розглянемо її детальніше. Для створення стандартного вікна в додатку повинен успадковуватися клас від CFrameWnd. У даному прикладі він називається CMainWin. Він містить конструктор і макрос DECLARE _ MESSAGE _ MAP (). Макрос насправді розгортається в декларацію карти повідомлень, яка визначає, яка член-функція класу повинна викликати у відповідь на повідомлення Windows. Цей макрос застосовується для будь-якого вікна, в якому обробляються повідомлення. Він повинен бути останнім у декларації класу. Саме вікно створюється в конструкторі за допомогою виклику функції Create (). Ця функція використовується майже у всіх додатках. Вона виконує дії зі створення вікна. У цьому прикладі наведено найпростіший випадок її використання. Поки нам потрібно знати, що другий параметр визначає заголовок вікна, а перший найчастіше дорівнює NULL.

Клас Сарр програми породжується від CWinApp. Цей клас відповідає за роботу програми. У прикладі використовується член-функція з наступним прототипом: virtual BOOL CWinApp:: lnitlnstance (); Це віртуальна функція, яка викликається кожного разу при запуску програми. У ній повинні здійснюватися всі дії, пов'язані з ініціалізацією додатки. Функція має повертати TRUE при успішному завершенні і FALSE в іншому випадку. У нашому випадку, у функції спочатку створюється об'єкт класу CMainWin, і покажчик на нього запам'ятовується у змінній m _ pMainWnd. Ця змінна є членом класу CWinThread. Вона має тип CWnd * і використовується майже у всіх MFC-програмах, тому що містить покажчик на головне вікно. У наступних двох рядках через неї викликаються функції-члени вікна. Коли вікно створено, викликається функція з прототипом: BOOL CWnd:: ShowWindow (int How);

Обробка повідомлень. Windows взаємодіє з додатком, посилаючи йому повідомлення. Тому обробка повідомлень є ядром усіх додатків. У традиційних програмах Windows (написаних з використанням тільки API) кожне повідомлення передається в якості аргументів віконної функції. Там зазвичай за допомогою великого оператора switch визначається тип повідомлення, витягується інформація і виробляються потрібні дії. Це громіздка і загрожує помилками процедура. За допомогою MFC все робиться набагато простіше. Тут ми розглянемо обробку в програмі деяких найбільш часто використовуваних повідомлень.

Обробка повідомлень в MFC. У MFC включений набір визначених функцій-обробників повідомлень, які можна використовувати в програмі. Якщо програма містить таку функцію, то вона буде викликатися щоразу, коли надходить пов'язане з нею повідомлення. За наявності додаткової інформації в повідомленні вона передається в якості аргументів функції. Для організації обробки повідомлень потрібно виконати наступні дії: У карту повідомлень програми повинна бути включена команда відповідного повідомлення. Прототип функції-обробника повинен бути включений в опис класу, відповідального за обробку даного повідомлення. У програму повинна бути включена реалізація функції-обробника.

2. Поняття контексту пристрою, застосування контекстів пристрої, обробка повідомлень WM _С HAR, WM _ PAINT

У широкому сенсі контекст пристрою є шляхом, за коториму Windows-програма, використовуючи відповідний драйвер, виводить інформацію в робочу область вікна. Контекст пристрою є структурою, яка повністю визначає стан цього драйвера і спосіб виведення інформації.

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

У традиційних Windows-програмах контекст пристрою отримують викликом функції GetDC (), а звільняють за допомогою ReleaseDC (). Оскільки Windows може надати лише невелика кількість контекстів, важливо, щоб програма звільнила контекст після закінчення роботи з ним. MFC має відповідні класи, здатні керувати цим процесом. Зокрема, при створенні екземпляра об'єкта типу CClientDC програмі надається контекст пристрою. Якщо цей об'єкт необхідно вилучити, викликається функція ReleaseDC () і контекст пристрою автоматично звільняється. Конструктор класу СClientDC записується у вигляді:

СClientDC (CWnd * Windows);

де параметр Windows є покажчиком на вікно, якому надається контекст пристрою. Для активного вікна можна вказати ключове слово this.

Висновок в клієнтську область вікна програми може забезпечуватися за допомогою функції TextOut ():

virtual BOOL CDC:: TextOut (int X, int Y, LPCSTR lpszStr, int Length);

де X, Y - координати точки початку виведення в пікселях (щодо лівого верхнього кута вікна програми), lpszStr - покажчик на рядок, який виводиться, а Length - його довжина. Приклад ілюструє можливий варіант реалізації обробника натиснення клавіш клавіатури - в точку (1, 1) вікна програми.

Приклад обробника натиснення клавіш клавіатури

char str [80]; / / рядок символів для виведення

void CMainWin:: OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)

{CClientDC dc (this); / / отримання контексту вікна

dc.TextOut (1,1, "", 3); / / видалення старого тексту

wsprintf (str, "% з", ch); / / формування рядки з кодом клавіші

dc.TextOut (1, 1, str, strlen (str)); / / вивід рядка в координату (1, 1)

}

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

Оновлення вмісту робочої області вікна програми

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

Повідомленням WM_PAINT відповідає макрокоманда ON_WM_PAINT (), а макрокоманді - обробник OnPaint (). Цей обробник може виглядати наступним чином:

Приклад обробника повідомлення WM_PAINT

void CMainWin:: OnPaint ()

{CPaintDC dc (this); / / отримання контексту вікна

dc.TextOut (1,1, str, strlen (str)); / / відображення символу

}

У прикладі наведено обробник OnPaint (), який забезпечує виведення на екран символу, введеного з клавіатури користувачем відповідно оброблювачу OnChar (), записаному в попередньому прикладі. Видно, що для отримання контексту влаштування тут використаний об'єкт іншого типу, а саме CPaintDC. На відміну від CClientDC, який працює тільки з клієнтською частиною вікна програми, CPaintDC забезпечує роботу з усією площиною вікна.

У програмі бажаним було б, щоб Windows самостійно вирішувала, коли їй викликати повідомлення WM_PAINT. Це так і відбувається, наприклад, коли користувач програми мінімізує вікно, максимізує, рухає екраном, змінює розміри вікна і т.п.. Але іноді необхідно проводити оновлення вікна примусово. Для того, щоб надіслати повідомлення WM_PAINT, програма викликає функцію InvalidateRect () - член класу CWnd, яка має наступний прототип:

void CWnd:: InvalidateRect (LPCRECT lpRegion, BOOL Erase = TRUE);

де lpRegion - покажчик на область вікна, яку необхідно оновити, Erase - прапор, який у значенні TRUE встановлює вилучення попереднього вмісту вікна. Якщо вказати першим параметру значення NULL, відбудеться повне оновлення вікна. Виклик функції InvalidateRect () забезпечує примусову посилку повідомлення WM_PAINT і виконання обробника OnPaint ().

Повне оновлення вікна, як наприклад:

InvalidateRect (NULL);

займає багато ресурсів системи, яка візуально може виглядати мерехтінням робочого вікна програми. Цього можна уникнути, задавши окремо область оновлення, наприклад:

СRect region (10,10,100,100);

InvalidateRect (region);

в такому випадку буде оновлюватися лише область, обмежена прямокутником з лівим верхнім кутом (10,10) і нижнім правим кутом (100,100). Такий варіант оновлення стає особливо цікавим, якщо необхідно забезпечити рухливість окремих елементів вікна, а цього можна досягти з одночасним застосуванням обробки повідомлення таймера WM_TIMER.

3. Основи роботи з текстом в MFC. Функції виведення тексту, установки кольорів, режимів відображення, отримання метрик

У Windows є практично необмежені можливості з управління висновком тексту. Деякі з функцій зараз втратили своє колишнє значення (або те, що було задумано, виявилося майже неможливим реалізувати), інші ж дуже широко використовуються.

Невелике введення

Будь-який шрифт, з яким ми маємо справу в Windows, характеризується кількома параметрами. Гарнітура (typeface) - це сукупність декількох накреслень шрифту, об'єднаних стильовими та іншими ознаками. Приклад гарнітур: Arial, Times New Roman, MS Sans Serif. Розмір шрифту - це висота прямокутника, в який містяться всі символи шрифту, виражається в спеціальних одиницях - пунктах. Пункт дорівнює 1 / 72 частини дюйма. Ця одиниця прийшла з поліграфії. Накреслення - це специфічні характеристики шрифту. У Windows доступні чотири накреслення: нормальне (normal), курсивне (italic), жирне (bold) і жирне курсивне (bold italic). Крім того, шрифти можуть бути моно (fixed pitch ', приклад - Courier New, і пропорційні (variable pitch), приклад - Times New Roman.

Зараз в Windows в основному використовуються шрифти двох груп: растрові (приклади - MS Sans Serif, Fixedsys) та контурні TrueType (приклади - Arial, Courier New). Перші являють собою жорстко певні бітові матриці для кожного символу і призначені для відображення не дуже великого тексту на екрані. Другі являють собою дуже складні об'єкти. У них задані контури символів, які зафарбовуються за певними правилами. Кожен шрифт TrueType - це програма на спеціальній мові, яка виконується інтерпретатором під назвою растеризатор. Програма шрифту повністю визначає спосіб розрахунку конкретних бітових матриць символів на основі контурів. При використанні символів маленького розміру (висотою приблизно до 30 точок) модель контурів стає некоректною і символи сильно спотворюються. Для боротьби з цим в якісних шрифтах використовується розмітка (хінт). Розмітка шрифту-надзвичайно складний і довгий процес, тому на ринку зустрічається трохи якісно розмічених шрифтів. Тому використовувати TrueType шрифти для виведення тексту на екран небажано, за винятком стандартних шрифтів Windows (Times New Roman, Arial та Courier New), які дуже якісно розмічені.

Координати при виведенні тексту

За виведення тексту у вікно в MFC відповідає функція CDC:: TextOut (). Їй потрібно вказати координати для виведення рядка. Ці координати є логічними координатами, тобто вони вимірюються в логічних одиницях. Це відноситься і до інших функцій виведення інформації у вікно. У процесі відображення інформації логічні координати перетворюються в пікселі. За замовчуванням логічними координатами є пікселі, що для нас дуже зручно.

Завдання кольору тексту і фону

При виведенні тексту за допомогою функції TextOutQ за замовчуванням текст виводиться чорним кольором на поточному (зазвичай білому) фоні. Однак за допомогою наступних функцій ці параметри можна змінити:

virtual COLORREF CDC:: SetTextColor (COLORREF Color); virtual COLORREF CDC:: SetBkColor (COLORREF Color);

Функції повертають значення попереднього кольору. Тип COLORREF представляє собою 32-розрядне беззнаковое ціле число - представлення кольору у вигляді червоної, зеленої та синьої компонент, кожна розміром у 8 біт. Для формування цього значення існує макрос RGB ().

Завдання режиму відображення фону

За допомогою функції SetBkMode () можна задати режим відображення фону. Прототип функції такий: int CDC:: SetBkMode (int Mode);

Функція визначає, що відбувається з поточним кольором фону (а також деяких інших елементів) при відображенні тексту. Режим може приймати одне з двох значень: OPAQUE і TRANSPARENT. У першому випадку при виведенні тексту буде виводиться також і поточний фон. У другому випадку фон виводиться не буде (він буде "прозорим"). За замовчуванням використовується режим OPAQUE.

Отримання метрик тексту

Більшість текстових шрифтів є пропорційними, тобто ширина символів у них різна. Крім того, відстань між рядками залежить як від шрифту, так і від його розміру. Весь виведення в Windows здійснюється програмно, тому необхідно враховувати всі ці параметри.

Наприклад, при виведенні одного текстового рядка після іншої передбачається, що відомі висота шрифту і кількість пікселів між рядками. Отримати цю інформацію можна за допомогою функції:

BOOL CDC:: GetTextMetrics (LPTEXTMETRICS TextAtttrib) const; Параметр є покажчиком на структуру TEXTMETRIC, в яку будуть записані установки поточного шрифту контексту пристрою. Структура має досить багато полів. Найбільш важливі поля такі:

LONG tmHeight Повна висота шрифту

LONG tmAscent Висота над базовою лінією

LONG tmDescent Висота підрядкових елементів

LONG tmlntemalLeading Порожній простір над символами

LONG tmExternalLeading Порожній інтервал між рядками

LONG tmMaxCharWidth Максимальна ширина символів

Для отримання числа логічних одиниць по вертикалі між рядками потрібно скласти значення tmHeight і tmExternalLeading. Це не те ж саме, що і висота символів.

Зміна шрифтів

Припустимо, що ми маємо готовий ініціалізований екземпляр класу CFont, що містить певний шрифт (як це зробити, ми розглянемо трохи нижче). Для зміни шрифту в контексті пристрою використовується член-функція SelectObject (), яка в нашому випадку приймає один параметр - покажчик на об'єкт шрифту. Після виконання цієї функції текст буде виводиться новим шрифтом. Хоча функція повертає покажчик на об'єкт старого шрифту, зберігати його зовсім не обов'язково.

Ініціалізація об'єкту шрифта: вибір шрифту

Після того, як об'єкт класу CFont створений, необхідно ініціювати його конкретним шрифтом зі встановлених в системі, з заданими параметрами. Це може бути як растровий, так і контурний шрифт. Напевно, Ви справедливо очікуєте наявності функції, яка дозволяє встановити тільки гарнітуру шрифту, накреслення і розмір, після чого шрифт буде ініціалізованим. На жаль, ні в MFC ні в Windows такої функції немає. Єдина функція, яка підходить для виконання цього завдання, має такий прототип:

BOOL CFont:: CreateFont (int nHeight, int nWidth,

int nEscapement,

int nOrientation,

int nWeight,

BYTE bltalic,

BYTE bUnderline,

BYTE cStrikeOut,

BYTE nCharSet,

BYTE nOutPrecision,

BYTE nClipPrecision,

BYTE nQuality,

BYTE nPitchAndFamily,

LPCTSTR IpszFacename);

Функція вкрай незручна, і сенс багатьох її параметрів на сьогоднішній день не є актуальним.

Функція була створена давно, і тоді здавалася захоплюючою ідея підстановки і заміни шрифтів, суть якої полягала в наступному: програміст задає такі параметри шрифту, які він хоче мати, a Windows сама на основі наявних в системі шрифтів проведе необхідні трансформації і синтезує необхідний шрифт з наявних . Згодом виявилося, що ця технологія не може бути задовільно працездатною (так як практично це складне завдання з області штучного інтелекту). Також функція дозволяє проводити трансформації шрифту - розтягувати і стискати його, виводити текст під кутом. Зараз це використовується рідко. Графічні пакети використовують свої алгоритми трансформацій, і часто використовують шрифти PostScript. Суть же полягає в тому, що якісно можуть бути відображені тільки ті шрифти і в тих передвістях, які присутні в системі, причому без трансформацій (тобто з використанням хінтів, які відключаються при трансформаціях). Для більшості сучасних програм потрібна висока якість відображення тексту, тому ніякі трансформації і підстановки недоречні. Практично, є розумними лише два варіанти поведінки: або програма буде використовувати точно той шрифт, який запросила, в такому вигляді, в якому його створив розробник, або відмовиться працювати за відсутності шрифту.

Розглянемо приклад коду, який дозволяє задати розмір шрифту, накреслення і гарнітуру, мінімізувавши можливі трансформації шрифту і синтезу при відсутності заданого. Такі ж параметри функцій CreateFontQ Ви можете використовувати у своїх програмах.

Бажано також перевіряти наявність шрифту, якщо він не є стандартним. Ось код, який використовується у прикладі програми (покажчик на об'єкт шрифту зберігається у змінній mjpFoni):

void CMainFrame:: SetClientFont (CString Typeface, / / Гарнітура

int Size, / / розмір у пунктах

BOOL Bold, / / Ознака жирного накреслення

BOOL Italic / / Ознака похилого накреслення

}

{

/ / Отримаємо контекст вікна

CWindowDC winDC (this);

/ / Дізнаємося, скільки пікселів в одному логічному дюймі У

int pixelsPerlnch = winDC.GetDeviceCaps (LOGPIXELSY);

/ / Дізнаємося висоту в пікселях шрифту розміром Size пунктів

int fontHeight =-MulDiv (Size, pixelsPerlnch, 72);

/ / Встановлюємо параметр жирності для функції CreateFont ()

int Weight = FW_NORMAL;

if (Bold)

Weight = FWBOLD;

/ / Видаляємо попередній примірник шрифту - не можна двічі ініціалізувати шрифт викликом CreateFont ().

delete m pFont;

mjpFont = new CFont;

/ / Створення шрифту. Більшість параметрів не використовуються.

m_pFont-> CreateFont (fontHeight, 0, 0, 0, Weight, Italic, О, О,

DEFAULT_CHARSET, OUT_DEFAULT PRECIS,

CLIP_DEFAULT_PRECIS, PROOF_QUALITY,

DEFAULT_PITCH | FF_DONTCARE, Typeface);

}

Література

1. Рад Б.Я., Яковлєв С.О. "Робототехніка". - М.: Вищ. шк., 2007 .- 271 с.

2. Методич ескіе вказівки до курсової ї р а бот е за дисципл і н е "Робототехніка та мехатроніка" для студент про в спец і альності і ГКСР ". 2005.

3. Радіоелектроніка. Пічукін Г.В. М. 1999.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Контрольна робота
63.9кб. | скачати


Схожі роботи:
Загальна інформація про Україну її економічне та екологічне становище
Робота в середовищі Visual Basic
Робота з графічним пакетом Corel Draw і створення тестової програми в середовищі Visual Basic
Ссавці Загальна інформація
Ящірки загальна інформація
Cсавці Загальна інформація
Інформація про товар
Інформація в бухгалтерській звітності про основні засоби її оцінки
Загальна характеристика і місце речове-правових позовів в системі способів захисту речових прав
© Усі права захищені
написати до нас