Базови елементи на приложение изградено с MFC поддръжка
| Информационни технологии | 2009-12-04 | 142 сваляния |
12. Базови елементи на приложение изградено с MFC поддръжка: приложение, рамка, прозорец. Асоциране на събщения и карти на съобщения. Макроси свързани с картите на събщенията. Последователност при търсене на съответствие за подадено съобщение. Кодови таблици и макрос _T.
За съобщенията и карта на съобщението:
Картата на съобщението съпоставя съобщението и метод за обработката му.
Подразбиращия се механизъм в една визуализационна среда е virtual method таблица за достъп до методите (чрез Runtime се конструира VMT). Чрез VMT би работил, но трябва да се направи VMT за всички съобщения, но може да се използва само едно.За това този механизъм е неефективен и е заменен с картата на съобщенията.
Картата на съобщенията се отнася в рамката на един клас, а не на цяло приложение.За всеки клас в който се генерира и обработва съобщението трябва да има карта на съобщенията.За да постави карта на съобщенията трябва:
1. В декларазията на класа да се постави DECLARE_Messege_Map.
2. В реализацията на класа трябва да се имплементира картата между Begin_messege_Map и end_messege_map.Между тях се поставя запис за всяко интересуващо ни приложение.
В Begin_messege_Map има два параметъра.Първия е класа към който се структурира картата, а втория е неговия родител.
Ако средата не предлага твърда врезка между съобщението и обработващата функция, то в картата трябва да се добави запис.
Тук (в нашия пример) е:
On_MESSAGE(WM_MYMESSAGE, OnMyMessage)
afx_msg LPRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
Декларацията на картата Declare трябва да е в раздела protected. Също така е хубаво да е накрая.
Declare_Message_Map прави селедното:
1.Структурира масив от структури за всяко съобщение и съответстващата му функция.
2.Създава структура чиито полета сочат първия масив, а друг себеподобни структури в родителя.
Begin_Message_Map()- позволява да влезем в картата, т.е връща указател към картата.
Елементите на масива от структури създадени чрез Declare се попълват от елементите след BEGIN_MESSAGE_MAP.
message map структури _messageEntries масиви member ф-ии
C

Wnd
&
CcmdTarget::messageMap WM_DRAWITEM CWnd::OnDrawItem
&CWnd::_messageEntries[0] .

CFrameWnd
&
CWnd::MessageMap
&CFrameWnd::_messageEntries[0]



W
M_MENUSELECT CFrameWnd::OnMenuSelect

WM_CREATE CFrameWnd::OnCreate
W
M_DESTROY CFrameWnd::OnDestroy
C
helloWnd .
&
CFrameWnd::messageMap
&
CHelloWnd::_messageEntries[0] WM_PAINT CHelloWnd::OnPaint
В програмата съобщението се обработва само в Hellownd (там само има Declaref_Message_Map).
С Hellownd е наследник на CFrameWnd, която пък е наследник на CWnd.
Ако примерно е дошло съобщение в C Hellownd-on.CREATE , то го няма и се търси обработка в родителския клас CFrameWnd, където има обработка и се обработва. Ако примерно дойде On Paint то се обработва директно в СHellownd , защото вече е декларирано.
Кодова таблица на макрос _Т(той е свързан с обработката на низове)
Hello ANSI
LHello-UNICODE
_T(Hello)- според директива #define_UNICODE
Забележка: 1.Декларация TCHAR вместо char;
2.TCHAR* или LPTSTR или LPTSTR вместо char*;
3.дължината на знак е sizeof(TCHAR);
4.вместо стандартни run-time функции:strcopy()->tcscpy() или tcscall();
Тагове от реферата: поддръж, градено, емент, приление











