КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Call GETMESSAGE, ds offset msg, 0, 0, 0
Создание многооконного приложения Создание окна, обработка событий и реакция на события – вот три основных вопроса, которые мы рассмотрим в этой главе. Известно, что каждое приложение для Windows начинается с WinMain. Через параметры, переданные этой функции можно было получить командную строку, идентификатор предыдущего экземпляра программы и другие характеристики. Немного сложнее процедура инициализации приложения происходит в Assembler. Первым шагом в инициализации приложения под Windows будем считать вызов функции INITTASK. После выполнения эта функция возвращает: При успешном завершении AX=1 DX содержит nCmdShow, то есть параметр, указывающий на стиль просмотра окна ES:BX содержит адрес командной строки. SI содержит идентификатор ранее загруженной программы hPrevInstance. DI содержит идентификатор загруженной программы hInstance. После обработки входных параметров нужно инициализировать приложение, используя функцию INITAPP. Единственным параметром этой функции служит идентификатор приложения hInstance. Функция INITAPP возвращает в AX=1, если приложение успешно проинициализировано. Теперь, когда все сложности по инициализации закончились, мы наконец-то сможем создать наше первое окно на Assembler. Процесс создания окна можно разделить на несколько этапов: Заполнение структуры WNDCLASS. Регистрация класса окна с помощью функции RegisterClass. Создание окна с помощью функции CreateWindow. Вывод окна на экран, используя функцию ShowWindow. Обновление окна с помощью функции UpdateWindow. Рассмотрим эти этапы подробнее. Структура WNDCLASS является одним из кирпичей фундамента, на котором построена Windows. В этой структуре содержится вся информация о создаваемом окне. Описание этой структуры находится в файле WINDOWS.INC. Структура WNDCLASS clsStyleclsLpfnWndProc: DWORD clsCbClsExtra: WORD clsCbWndExtra: WORD clsHInstance: WORD clsHIcon: WORD clsHCursor: WORD clsHbrBackground: WORD clsLpszMenuName: DWORD clsLpszClassName: DWORD clsStyle: WORD Элемент clsStyleclsLpfnWndProc определяет адрес функции окна, которая обрабатывает сообщения для окон данного класса. Элемент clsCbClsExtra задает число байт, которое необходимо дополнительно запросить у Windows под эту структуру, для хранения собственных данных, присоединенных классу. Элемент clsCbWndExtra задает число байт, которое необходимо дополнительно запросить у Windows для размещения всех структур, создаваемых совместно с данным классом, для хранения собственных данных, присоединенных к окну. Элемент clsHInstance сообщает Windows о том, кто создает определение класса. Когда завершается последний экземпляр программы, Windows удаляет все связанные с ним определения классов. Элемент clsHIcon определяет пиктограмму, которая будет использоваться для изображения приложения, например на панели задач. Вы можете создать пиктограмму сами или воспользоваться одной из определенных: IDI_APPLICATION – стандартная пиктограмма для приложения IDI_HAND – «стоп» IDI_QUESTION – «вопросительный знак» IDI_EXCLAMATION – «восклицательный знак» IDI_ASTERISK – «информация» Элемент clsHCursor идентифицирует курсор мыши, используемый в данном окне по умолчанию. Если вы не хотите создавать свой курсор, то можно воспользоваться одним, из представляемых Windows: IDC_ARROW – стрелка. IDC_IBEAM – вертикальная черта. IDC_WAIT – «песочные часы». IDC_CROSS – крестик. IDC_UPARROW – вертикальная черта. IDC_SIZE – четыре стрелки, указывающие в разные стороны. IDC_ICON – курсор, используемый при drag&drop. IDC_SIZENWSE – двунаправленная стрелка «северо-запад/юго-восток». IDC_SIZENESW – двунаправленная стрелка «северо-восток/юго-запад». IDC_SIZEWE – двунаправленная стрелка «восток-запад». IDC_SIZENS – двунаправленная стрелка «север-юг». Элемент clsHbrBackground задает цвет фона для окна. Для его определения можно воспользоваться любой из 20 системных констант цвета: COLOR_SCROLLBAR – цвет полосы прокрутки. COLOR_BACKGROUND – цвет фона окна. COLOR_ACTIVECAPTION – цвет заголовка активного окна. COLOR_INACTIVECAPTION – цвет заголовка неактивного окна. COLOR_MENU – цвет меню. COLOR_WINDOW – цвет окна. COLOR_WINDOWFRAME – цвет обрамления окна. COLOR_MENUTEXT – цвет текста меню. COLOR_WINDOWTEXT – цвет текста окна. COLOR_CAPTIONTEXT – цвет текста в заголовке окна. COLOR_ACTIVEBORDER – цвет активной границы окна. COLOR_INACTIVEBORDER – цвет неактивной границы окна. COLOR_APPWORKSPACE – цвет рабочего места окна. COLOR_HIGHLIGHT – цвет подсветки. COLOR_HIGHLIGHTTEXT – цвет подсвеченного текста. COLOR_BTNFACE – цвет передней части кнопки. COLOR_BTNSHADOW – цвет тени кнопки. COLOR_GRAYTEXT – цвет «серого» текста. COLOR_BTNTEXT – цвет текста в кнопке. COLOR_INACTIVECAPTIONTEXT – цвет текста в заголовке неактивного окна. COLOR_BTNHILIGHT – цвет текущей кнопки. При использовании этих констант к их значению обязательно нужно прибавлять единицу, так как первое значение для них равно нулю, а ноль является недействительным значением для логического номера кисти. Элемент clsLpszMenuName – содержит пару сегмент: смещение на имя меню окна, определенное в файле ресурсов. Элемент clsLpszClassName – содержит пару сегмент: смещение на имя класса. Поскольку после регистрации класс становиться доступен всем другим приложениям Windows, имя класса должно быть уникальным. Элемент clsStyle определяет свойства окна, которые могут комбинироваться при помощи сложения. Если этому параметру присвоить ноль, то Windows установит значение clsStyle автоматически. Опишем существующие стили окна. CS_BYTEALIGNCLIENT – оказывает влияние на ширину окна, задавая выравнивание клиентской области на границе байтов. CS_BYTEALIGNWINDOW – устанавливает выравнивание окна по границе байтов. CS_CLASSDC – обеспечивает контекст устройства, используемый совместно всеми окнами класса. CS_DBLCLKS – служит для установки таймера после получения первого сообщения о нажатии кнопки на мыши. CS_GLOBALCLASS – позволяет приложению создавать окно этого класса, не считаясь со значением параметра clsHInstance. CS_HREDRAW – определяет, что окно будет перерисовываться, как только измениться его горизонтальный размер. CS_VREDRAW – определяет, что окно будет перерисовываться, как только измениться его вертикальный размер. CS_NOCLOSE – запрещает пункт «Close» системного меню. CS_OWNDC – предоставляет частный контекст устройства для каждого окна в данном классе. CS_PARENTDC – устанавливает, что дочерние окна не могут рисовать в родительском окне. CS_SAVEBITS – предписывает системе сохранять копию части экрана, поврежденной окном. Теперь, когда вы ознакомились с полями структуры WNDCLASS можно их мысленно запомнить и, передав адрес структуры в качестве параметра в функцию REGISTERCLASS, произвести регистрацию окна. После успешной регистрации класса окна мы можем создавать окна этого класса. Для создания окон используется функция CREATEWINDOW. Эта функция очень громоздка, так как содержит большое число параметров, поэтому постараемся объяснить их назначение. Параметры функции CREATEWINDOW: lpszClassName: DWORD lpszWindowName: DWORD dwStyle: DWORD x: WORD y: WORD nWidth: WORD nHeight: WORD hWndParent: WORD hMenu: WORD hInstance: WORD lpParam: DWORD Параметр lpszClassName содержит адрес строки названия класса окна. В данном случае мы будем использовать только что зарегистрированный класс окна. Параметр lpszWindowName содержит адрес строки, которая будет идентифицировать окно в панели задач, а также будет видна в заголовке окна. Параметр dwStyle содержит двойное слово параметров (стилей) окна. Параметры x, y, nWidth, nHeight содержат геометрические координаты местоположения окна на экране. Параметр hWndParent содержит идентификатор родительского окна. Если это окно основное, то значение этого параметра должно быть равно 0. Параметр hMenu содержит идентификатор меню для создаваемого окна. Параметр hInstance содержит идентификатор приложения, которое создает это окно. Параметр lpParam содержит дополнительную информацию об окне. После создания окна его нужно вывести на экран и вставить в очередь обработки сообщений. Используйте функцию SHOWWINDOW, передайте ей в параметрах – идентификатор вашего окна и стиль просмотра окна. Для вставки окна в очередь обработки сообщений используется функция UPDATEWINDOW с параметром – идентификатор окна. Теперь, когда наше первое окно создано и видно на экране, надо попробовать поработать с ним. В данный момент наше окно и приложение, в том числе, представляют собой два мертвых груза, и для того, чтобы наша программа ожила нужно начать обрабатывать сообщения. Прежде чем привести пример, надо разобраться с еще одной немаловажной структурой – MSGSTRUCT. Эта структура описывает формат сообщения Windows. Мы рассмотрим только часть ее элементов, ибо в большинстве случаев остальные совсем не используются. msHWND: WORD – идентификатор окна HWND, которому было передано сообщение. msMESSAGE: WORD – идентификатор сообщения. msWPARAM: WORD – параметр 1. msLPARAM: DWORD – параметр 2. Как видите, структура сообщения Windows проста, однако, процедура ее обработки не очень. msg MSGSTRUCT <0> msg_loop: ; Получаем сообщение ; Проверяем на наличие сообщения WM_QUIT (AX=0)
Дата добавления: 2014-01-06; Просмотров: 336; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |