Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Макросы-компоненты карты сообщений
Содержание книги
- Решение задач лп с помощью пакета ilog OPL Studio
- sum(j in Products) a[i,j]*x[j]>=b[i];
- forall(i in Parameters : i <> Calories)
- Тестирование программного обеспечения
- Тестирование в итеративном жизненном цикле проекта
- Принципы поиска ошибок при тестировании
- Проверка в нормальных условиях предполагает тестирование на данных, которые характерны для реальных условий функционирования программы.
- Дж. Шеферд. Программирование на Microsoft VIsual C++. Net
- Система, управляемая сообщениями
- By byte (8-битовое целое без знака)
- h дескриптор (handle) - обычно DWORD
- quot;SubSystem"->"/SUBSYSTEM:WINDOWS" или "/SUBSYSTEM:CONSOLE"
- Include "windows. H". Lresult callback windowproc(. Lparam lparam). Paintstruct PS;. HDC hdc;. Char lpszhello[]="hello, World. ";. Switch (wmessage). HDC = beginpaint(hwnd, &ps);. Rect RT;. Getclientrect(hwnd, &rt);. Amp;rt,dt_
- Подготавливаем данные класса окна и регистрируем его
- LPARAM lParam; // конкретный смысл которой зависит от
- Регистрация класса окна и Создание окна
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow,
- Оконная процедура регистрируется в системе и вызывается всякий раз, когда Windows выполняет какую-либо операцию над окном приложения.
- GetClientRect(hWnd, &rt);. DrawText(hdc,lpszHello,strlen(lpszHello),&rt,DT_LEFT);. EndPaint(hWnd, &ps);. case WM_DESTROY: PostQuitMessage(0); break;. return DefWindowProc(hWnd,wMessage,wParam,lParam);. return 0;
- Общие сведения о сообщениях Win32
- Аппаратные (входные данные от мыши, клавиатуры и таймера);
- Список (list Box) –элемент отображения списка элементов, позволяющий пользователю выбрать один или несколько из них.
- пиктограммы (icons) – битовые массивы, использующиеся для визуального представления различных объектов в системе.
- CCmdTarget - базовый класс для всех объектов, которые могут получать и отправлять сообщения.
- Шаг2. Выбираем «An empty project»
- Макросы-компоненты карты сообщений
- afx_msg void OnLButtonUP(UINT nFlags, CPoint point);
- Nmhdr *pnotifystruct, //указатель на структуру с данными
- Посылает сообщение в объект класса cwnd или его потомка, непосредственно вызывая оконную процедуру, и не выходит из нее, пока та не обработает сообщение;
- strMessageText.Format("Error number %d", nError);
- Архитектура «Документ-представление» и MDI-приложения
- HMENU CMDIChildWnd::m_hMenuShared
- дескриптор меню, ассоциированного с окном “MDI child”.
- CDocument* CView:: GetDocument()
- Динамическое создание с помощью конструктора
- virtual POSITION CDocument::GetFirstViewPosition()
- Класс шаблона cdoctemplate в приложении отвечает за взаимодействие документов, их представлений и фреймов. В MDI приложении используется его потомок cmultidoctemplate.
- CMultiDocTemplate* pDocTemplate;
- CFrameWnd* pFrame,CDocument* pDoc, BOOL bMakeVisible=TRUE);
- POSITION CWinApp::GetFirstDocTemplatePosition()
- Документ, связанный с активным представлением
- AFX_THREADPROC pfnThreadProc, // Глобальная функция потока
- UINT Msg, // идентификатор сообщения
- Solver* pSolver; //Solver to use
- virtual CDocument* CFrameWnd::GetActiveDocument()
- SendMessage(WM_COMMAND,ID_FILE_SAVE,0);
- while (::GetMessage(&msg, NULL,0,0))
- Объекты, объявленные как volatile, не подвержены оптимизации и временному хранению в регистрах, но читаются и записываются каждый раз напрямую в память.
- if (!m_thisThreadParams.pResults) return 1;
- if (m_thisThreadParams.pResults)
Сообщения в MFC
Все сообщения в MFC разделены на следующие три категории:
· Сообщения Windows, имена которых начинаются с WM_, за исключением WM_COMMAND. Сообщения этой категории предназначены для обработки в оконных процедурах.
· Извещения (WM_COMMAND, WM_NOTIFY и др.) для родительских окон от дочерних окон, в частности, от элементов управления (кнопок, списков, строковых редакторов и т.д.). Исключение: извещение BN_CLICKED, посылаемое элементом управления BUTTON при нажатии клавиши, которые трактуется как командное сообщение.
· Командные сообщения WM_COMMAND от объектов интерфейса пользователя: меню, кнопок панелей инструментов и клавиш-акселераторов. Могут обрабатываться не только окнами, но и другими потомками CCmdTarget, например, приложениями.
Независимо от категории сообщения, при его получении некоторая часть программы должна выполнить определенную последовательность действий. В MFC для обработки сообщений используются функция-обработчики, принадлежащие классам-получателям. Принципы работы обработчиков не меняются от того, к какой категории относится сообщение, хотя механизмы их вызова могут быть различны (об этом речь пойдет в другой раз). Рассмотрим каким образом сообщению сопоставляется его обработчик.
Библиотека MFC берет на себя обработку большинства сообщений низкого уровня, таких как WM_KEYDOWN (нажатие клавиши клавиатуры), WM_MOUSEMOVE (перемещение мыши) и других, и позволяет пользователю в первую очередь работать с более информативными сообщениями(например, в некоторое поле введен текст, или нажата кнопка “OK”). Вместо того, чтобы самому писать функцию процедуры окна и указывать в ней все возможные сообщения, пользователь использует стандартный набор макросов библиотеки MFC, позволяющих определить для каждого класса набор обрабатываемых им сообщений.
Вспомним функцию OnPaint из Листинга 4. Можно подумать, что OnPaint – идеальный кандидат на роль виртуальной функции. При таком подходе базовый класс окна определил бы виртуальные функции для сообщений о событиях, связанных с мышью, и других стандартных сообщений, а производные классы могли бы при необходимости их переопеделять. К сожалению, такой подход имеет серьезные недостатки, т.к. класс CWnd, например, должен был бы объявить виртуальные функции более чем для 100 сообщений. Каждый его производный класс потребовал бы таблицу диспетчеризации виртуальных функций, где для каждой функции хранилась бы 4-байтовая запись. Таким образом, для каждого типа окна или элемента управления потребовалось бы хранить таблицу из более чем 400 байтов. Кроме того, в каждом приложении имеется свой набор сообщений от меню, кнопок и других команд, но на все случаи нельзя завести обработчики в базовом классе окна.
Чтобы обойти эти проблемы в MFC при увязке сообщений и их обработчиков используются макросы, формирующие карту сообщений, устроенную подобно таблице виртуальных функций.
Каждый наш класс, производный от класса CCmdTarget, должен включать в себя карту сообщений для обработки поступающих ему сообщений, если мы хотим что-то добавить к стандартным обработчикам этого класса. Первая часть карты сообщений расположена в h-файле и заканчивается макросом DECLARE_MESSAGE_MAP(). Вторая часть расположена в cpp-файле, и начинается макросом BEGIN_MESSAGE_MAP с двумя аргументами (имя нашего класса, имя базового класса из MFC) и кончается END_MESSAGE_MAP().
Поскольку карта сообщений формируется автоматически мастерами Visual C++, нам нет надобности подробно разбираться в ее макросах. Перечислим только некоторые из них.
Для каждого стандартного сообщения Windows определен свой макрос в форме:
ON_WM_XXX // XXX – имя сообщения, например, PAINT для WM_PAINT,
|