Всплывающие подсказки

Изучение основ программирования на 32-битном ассемблере с применением API-функций. Ознакомление с основами разработки программы, демонстрирующей работу одного из разделов ОС Windows - всплывающих подсказок. Анализ результатов работы данной программы.

Рубрика Программирование, компьютеры и кибернетика
Вид отчет по практике
Язык русский
Дата добавления 10.02.2015
Размер файла 105,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Минобрнауки России

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

"Ижевский государственный технический университет

им. М.Т. Калашникова"

Кафедра "Вычислительная техника"

Отчёт по курсовой работе

Всплывающие подсказки

Выполнил:

студент группы 8-78-3

М.В. Симонов

Проверил: к.т.н., доцент

Вахрушева Е.А.

Ижевск 2014

Содержание

  • Цель работы
  • Введение
  • 1. Всплывающие подсказки
  • 2. Листинг
    • 2.1 Файл HINT.RC
    • 2.2 Файл HINT.INC
    • 2.3 Файл HINT.ASM
  • 3. Результат работы программы
  • Вывод
  • Список литературы
  • Цель работы
  • Цель курсовой работы: изучение основ программирования на 32-битном ассемблере, при помощи которого необходимо разработать программу, демонстрирующую работу одного из разделов ОС WINDOWS.
  • В данном варианте рассмотрена работа всплывающими подсказками.
  • Введение
  • Ассемблер - один из самых старых из существующих сегодня языков программирования. Когда-то это был самый основной язык, без которого нельзя было заставить компьютер сделать что-то полезное.
  • Постепенно ситуация менялась. Появились более удобные средства общения с компьютером. Но в отличие от других языков ассемблер не умирал.
  • Если коротко, то ассемблер - это символическое представление машинного языка. Все процессы в машине на самом низком, аппаратном уровне приводятся в действие только командами машинного языка.
  • Отсюда понятно, что, несмотря на общее название, язык Ассемблера для каждого типа компьютера свой. Это касается и внешнего вида программ, написанных на Ассемблере, и идей, отражением которых этот язык является.
  • Известно, что к программированию на языке ассемблера обращаются тогда, когда от программы требуется максимальная скорость исполнения, когда необходимо обеспечить взаимодействие с нестандартными внешними устройствами, когда необходимо полностью использовать возможности процессора и операционной системы. На языке ассемблера можно запрограммировать все, на что способна соответствующая вычислительная машина, то есть ассемблер является машинно-ориентированным языком программирования. Программируя на ассемблере иногда в силу привычки, иногда в силу необходимости, особенно при организации интерфейса пользователя, приходится многократно программировать одни и те же элементарные задачи. В языках высокого уровня эта проблема решена применением стандартных функций и процедур. В ассемблере эта проблема могла бы быть решена за счет библиотек стандартных функций, как на уровне исходных текстов, так и объектных кодов, но такие библиотеки не стандартизованы и не распространяются вместе с компиляторами. С появлением Windows 95 ситуация несколько изменилась. Создание приложений на языке ассемблера представляет собой весьма сложную задачу в связи с высоким уровнем интеграции прикладной программы и операционной системы, но теперь нет необходимости многократно решать проблемы пользовательского интерфейса и управления исполнением команд на уровне машинных команд. Они решаются теперь с помощью операционной системы за счет обращения к функциям интерфейса прикладного программирования - Application Programming Interface (API).
  • Основные положения программирования в ОС WINDOWS:
  • Программирование в Windows основывается на использовании функций API (Application Program Interface, т.е. интерфейс программного приложения). Их количество достигает двух тысяч. Программа в значительной степени состоит из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы происходит посредством таких функций.
  • Список функций API и их описание перечислен в файле WIN32.HLP, который поставляется, например, с пакетом Borland C++.
  • Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура обработки сообщений.
  • Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.
  • Операционная система Windows использует линейную модель памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например EBX.
  • Следствием пункта 5 является то, что фактически нет ограничений в объеме данных, кода или стека (объеме локальных переменных). Выделение в тексте программы сегмента кода и сегмента данных является теперь простой формальностью, улучшающей читаемость программы.
  • Операционная система Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность - любая процедура может быть запущена как самостоятельная задача.
  • 1. Всплывающие подсказки
  • В данной курсовой работе рассмотрен вопрос о всплывающих подсказках. В визуальных языках программирования всплывающие подсказки организуются посредством установки соответствующих свойств объектов, расположенных на объекте-контейнере. Задача состоит в разработке механизма, позволяющего без каких-либо дополнительных библиотек устанавливать подсказки на любые объекты, расположенные в окне.
  • 1. Заметим, что всплывающая подсказка - это всего лишь окно с определенными свойствами. Вот эти свойства: DS_CENTER, WS_POPUP, WS_VISIBLE, WS_BORDER. В принципе можно экспериментировать - добавлять или удалять свойства. Но без одного свойства никак не обойтись - это WS_POPUP. POPUP можно перевести как поплавок. Кроме того, определение всплывающего окна в файле ресурсов не должно содержать опции CAPTION.
  • 2. Появление подсказки не должно менять ситуацию в диалоговом окне. Это значит - вызов подсказки должен быть немодальным, при помощи функции CreateDialogIndirect. Кроме того, следует предусмотреть переустановку фокуса на диалоговое окно. Для этого достаточно в нужном месте вызвать функцию SetFocus.
  • 3. Подсказка - это диалоговое окно, и, следовательно, оно должно иметь свою функцию. Что должна содержать эта функция? По крайней мере, обработку трех событий: WM_INITDIALOG, WM_PA1NT, WM_TIMER. По получении сообщения WM_INITDIALOG следует определить размер и положение подсказки.
  • Кроме того, если предположим, что подсказка должна спустя некоторое время исчезать, следует установить таймер.
  • По получении сообщения WM_PAINT следует вывести в окно текст подсказки. Если определять размер окна подсказки точно по строке выводимого текста, то цвет фона подсказки будет полностью определяться цветом выводимого текста. По приходе сообщения WM_TIMER мы закрываем подсказку.
  • 4. В основном диалоговом окне определим таймер, в функции которого будет проверяться положение курсора. В зависимости от этого положения будет вызываться или удаляться подсказка. В функции таймера должно предусмотреть:
  • Проверку положения курсора. Если курсор оказался на данном элементе, то вызывать подсказку. При этом желательно, чтобы подсказка появлялась бы с некоторой задержкой. Последнее можно обеспечить введением счетчика - вызывать подсказку, если счетчик превысил некоторое значение.
  • Необходимо обеспечить удаление подсказки, если курсор покидает данный элемент.
  • Свойства окон:
  • DS_CENTER - Выравнивает по центру диалоговое окно в рабочей области видеомонитора, который содержит окно владельца. Если окно владельца не определено, диалоговое окно центрируется в рабочей области видеомонитора, определенного системой. Рабочая область - область, не затененная панелью задач или какой-либо панелью приложения.
  • WS_POPUP - Создается временное (pop-up) окно.
  • WS_VISIBLE - Создание окна, видимого сразу после создания. Используется для перекрывающихся и временных окон.
  • WS_BORDER - Создание окна с рамкой из тонких линий.
  • Функции:
  • CreateDialogIndirect - Создает блок безpежимного диалога. возвращает дескриптор окна диалогового окна.
  • Функция SetFocus устанавливает фокус клавиатуры в заданном окне. Окно должно быть связано с очередью сообщений вызывающего потока.
  • Окно должно быть присоединено к очереди сообщений вызывающего поток. hWnd [in] Дескриптор окна, которое примет ввод информации с клавиатуры. Если этот параметр - ПУСТО (NULL), нажатия клавиши игнорируются. Если функция завершается успешно, величина возвращаемого значения - дескриптор окна, которое до этого имело фокус клавиатуры. Если параметр hWnd недопустимый или окно не связано с очередью сообщений вызывающего потока, величина возвращаемого значения - ПУСТО (NULL)
  • Сообщения:
  • Сообщение WM_INITDIALOG отправляется процедуре диалогового окна непосредственно перед показом на экране диалогового окна.
  • Процедуры диалогового окна обычно используют это сообщение, чтобы инициализировать органы управления и выполнить какие-либо другие задачи инициализации, которые влияют на внешний вид блока диалога.
  • Возвращаемые значения Процедура диалогового окна должна возвратить значение ИСТИНА (TRUE), чтобы заставить систему установить фокус клавиатуры в орган управления, заданный параметром wParam.
  • Или же, она должна возвратить значение ЛОЖЬ(FALSE), чтобы не допустить систему к установке заданного по умолчанию фокуса клавиатуры.
  • Сообщение WM_PAINT отправляется тогда, когда система или другое приложение делают запрос, чтобы окрасить часть окна приложения. Возвращаемые значения Приложение возвращает нуль, если оно обрабатывает это сообщение.
  • Сообщение WM_TIMER помещается в очереди сообщений установленного потока, когда у таймера истекает время. Возвращаемое значение Приложение должно возвратить нуль, если оно обрабатывает это сообщение.
  • 1. В данной программе используем условные конструкции времени выполнения. Данный шаг вполне закономерен и обусловлен только необходимостью несколько сократить объем, а также упростить читаемость программы.
  • Вложенность условных конструкций, а также расстановка скобок вызваны желанием сократить длину строки и одновременно необходимостью транслировать программу с помощью MASM32.
  • 2. Трансляция программы.
  • Пакет MASM32.
  • ML /c /coff /DMASM hint.asm
  • RC hint.rc
  • LINK /SUBSYSTEM:WINDOWS hint.obj hint.res
  • pause
  • start hint.exe
  • 3. Процедура таймера проверяет каждые 0.5 секунды положение курсора. Если курсор находится на элементе (окне редактирования или кнопке) и подсказка еще не вызвана (H1 или Н2 отлична от нуля), то вызывается подсказка. При этом учитывается еще величина счетчика (P1), чтобы подсказка появлялась с некоторой задержкой. Если при очередном вызове процедуры окажется, что курсор находится уже вне элемента, а подсказка еще на экране, то она удаляется. Данный механизм не учитывает тот случай, когда курсор быстро перейдет от одного элемента к другому. В этом случае вероятна ситуация, когда на экране окажется две подсказки. Впрочем, первая подсказка должна тут же исчезнуть.
  • 4. В данной программе на диалоговом окне расположено всего два элемента: окно редактирования и кнопка.
  • 5. Функция GetCursorPos получает положение курсора в абсолютных координатах относительно экрана. Функция GetWindowRect также получает положение элемента окна в абсолютных координатах. Предварительно приходится определять дескриптор окна при помощи функции GetDlgItem.
  • 2. Листинг
  • 2.1 Файл HINT.RC
  • // файл HINT.RC
  • // определение констант
  • #define WS_SYSMENU 0x00080000L
  • // элементы на окне должны быть изначально видимы
  • #define WS_VISIBLE 0x10000000L
  • // бордюр вокруг элемента
  • #define WS_BORDER 0x00800000L
  • // при помощи TAB можно по очереди активизировать элементы
  • #define WS_TABSTOP 0x00010000L
  • // текст в окне редактирования прижат к левому краю
  • #define ES_LEFT 0x0000L
  • // стиль всех элементов на окне
  • #define WS_CHILD 0x40000000L
  • // стиль - кнопка
  • #define BS_PUSHBUTTON 0x00000000L
  • // центрировать текст на кнопке
  • #define BS_CENTER 0x00000300L
  • // тип окна - "поплавок"
  • #define WS_POPUP 0x80000000L
  • // стиль - диалоговое окно
  • #define DS_CENTER 0x0800L
  • // определение диалогового окна
  • DIAL1 DIALOG 0, 0, 200, 50
  • STYLE WS_SYSMENU | DS_CENTER
  • CAPTION "Вариант 18 - всплывающие подсказки"
  • FONT 10, "Courier new"
  • {
  • // окно редактирования, идентификатор 1
  • CONTROL "", 1, "edit", ES_LEFT | WS_CHILD
  • | WS_VISIBLE | WS_BORDER
  • | WS_TABSTOP , 5, 5, 130, 12
  • // кнопка, идентификатор 2
  • CONTROL "Выход", 2, "button", BS_PUSHBUTTON
  • | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
  • 150, 5, 40, 12
  • }
  • // диалоговое окно подсказки
  • HINTW DIALOG 0, 0, 200, 8
  • STYLE DS_CENTER| WS_POPUP | WS_VISIBLE | WS_BORDER
  • FONT 8, "MS Sans Serif"
  • {
  • }
  • 2.2 Файл HINT.INC
  • ; файл HINT.INC
  • ;константы
  • ;цвет фона окна подсказки
  • RED = 127
  • GREEN = 255
  • BLUE = 212
  • RGBB equ (RED or (GREEN shl 8)) or (BLUE shl 16)
  • ;цвет текста окна подсказки
  • RED = 20
  • GREEN = 20
  • BLUE = 20
  • RGBT equ (RED or (GREEN shl 8)) or (BLUE shl 16)
  • ;сообщение приходит при закрытии окна
  • WM_CLOSE equ 10h
  • WM_INITDIALOG equ 110h
  • WM_COMMAND equ 111h
  • WM_TIMER equ 113h
  • WM_SETTEXT equ 0Ch
  • WM_COMMAND equ 111h
  • WM_PAINT equ 0Fh
  • ;прототипы внешних процедур
  • IFDEF MASM
  • EXTERN CreateDialogParamA@20:NEAR
  • EXTERN SetFocus@4:NEAR
  • EXTERN lstrcpyA@8:NEAR
  • EXTERN DestroyWindow@4:NEAR
  • EXTERN lstrlenA@4:NEAR
  • EXTERN GetDlgItem@8:NEAR
  • EXTERN GetCursorPos@4:NEAR
  • EXTERN TextOutA@20:NEAR
  • EXTERN SetBkColor@8:NEAR
  • EXTERN SetTextColor@8:NEAR
  • EXTERN BeginPaint@8:NEAR
  • EXTERN EndPaint@8:NEAR
  • EXTERN GetTextExtentPoint32A@16:NEAR
  • EXTERN MoveWindow@24:NEAR
  • EXTERN GetWindowRect@8:NEAR
  • EXTERN ReleaseDC@8:NEAR
  • EXTERN GetDC@4:NEAR
  • EXTERN SendDlgItemMessageA@20:NEAR
  • EXTERN ExitProcess@4:NEAR
  • EXTERN GetModuleHandleA@4:NEAR
  • EXTERN DialogBoxParamA@20:NEAR
  • EXTERN EndDialog@8:NEAR
  • EXTERN SetTimer@16:NEAR
  • EXTERN KillTimer@8:NEAR
  • ELSE
  • EXTERN CreateDialogParamA:NEAR
  • EXTERN SetFocus:NEAR
  • EXTERN lstrcpyA:NEAR
  • EXTERN DestroyWindow:NEAR
  • EXTERN lstrlenA:NEAR
  • EXTERN GetDlgItem:NEAR
  • EXTERN GetCursorPos:NEAR
  • EXTERN TextOutA:NEAR
  • EXTERN SetBkColor:NEAR
  • EXTERN SetTextColor:NEAR
  • EXTERN BeginPaint:NEAR
  • EXTERN EndPaint:NEAR
  • EXTERN GetTextExtentPoint32A:NEAR
  • EXTERN MoveWindow:NEAR
  • EXTERN GetWindowRect:NEAR
  • EXTERN ReleaseDC:NEAR
  • EXTERN GetDC:NEAR
  • EXTERN SendDlgItemMessageA:NEAR
  • EXTERN ExitProcess:NEAR
  • EXTERN GetModuleHandleA:NEAR
  • EXTERN DialogBoxParamA:NEAR
  • EXTERN EndDialog:NEAR
  • EXTERN SetTimer:NEAR
  • EXTERN KillTimer:NEAR
  • CreateDialogParamA@20 = CreateDialogParamA
  • SetFocus@4 = SetFocus
  • lstrcpyA@8 = IstrcpyA
  • DestroyWindow@4 = DestroyWindow
  • lstrlenA@4 = IstrlenA
  • GetDlgItem@8 = GetDlgItem
  • GetCursorPos@4 = GetCursorPos
  • TextOutA@20 = TextOutA
  • SetBkColor@8 = SetBkColor
  • SetTextColor@8 = SetTextColor
  • BeginPaint@8 = BeginPaint
  • EndPaint@8 = EndPaint
  • GetTextExtentPoint32A@16 = GetTextExtentPoint32A
  • MoveWindow@24 = MoveWindow
  • GetWindowRect@8 = GetWindowRect
  • ReleaseDC@8 = ReleaseDC
  • GetDC@4 = GetDC
  • SendDlgItemMessageA@20=SendDlgItemMessageA
  • ExitProcess@4 = ExitProcess
  • GetModuleHandleA@4 = GetModuleHandleA
  • DialogBoxParamA@20 = DialogBoxParamA
  • EndDialog@8 = EndDialog
  • SetTimer@16 = SetTimer
  • KillTimer@8 = KillTimer
  • ENDIF
  • ; структуры
  • ; структура сообщения
  • MSGSTRUCT STRUC
  • MSHWND DD ?
  • MSMESSAGE DD ?
  • MSWPARAM DD ?
  • MSLPARAM DD ?
  • MSTIME DD ?
  • MSPT DD ?
  • MSGSTRUCT ENDS
  • ; структура размера окна
  • RECT STRUC
  • L DD ?
  • T DD ?
  • R DD ?
  • B DD ?
  • RECT ENDS
  • ;структура размер
  • SIZ STRUC
  • X DD ?
  • Y DD ?
  • SIZ ENDS
  • ; структура для BeginPaint
  • PAINTSTR STRUC
  • hdc DWORD 0
  • fErase DWORD 0
  • left DWORD 0
  • top DWORD 0
  • right DWORD 0
  • bottom DWORD 0
  • fRes DWORD 0
  • fIncUp DWORD 0
  • Reserv DB 32 dup (0)
  • PAINTSTR ENDS
  • ; структура для получения позиции курсора
  • POINT STRUC
  • X DD ?
  • Y DD ?
  • POINT ENDS
  • 2.3 Файл HINT.ASM
  • ; файл HINT.ASM
  • .386P
  • ; плоская модель
  • .MODEL FLAT, stdcall
  • include hint.inc
  • ; директивы компоновщику для подключения библиотек
  • IFDEF MASM
  • ; для компоновщика LINK.EXE
  • includelib c:\masm32\lib\user32.lib
  • includelib c:\masm32\lib\kernel32.lib
  • includelib c:\masm32\lib\gdi32.lib
  • ELSE
  • ; для компоновщика TLINK32.EXE
  • includelib c:\tasm32\lib\import32.lib
  • ENDIF
  • ;-------------------------------------------------
  • ; сегмент данных
  • _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
  • MSG MSGSTRUCT <?>
  • HINST DD 0 ; дескриптор приложения
  • PA DB "DIAL1",0
  • HIN DB "HINTW",0
  • XX DD ?
  • YY DD ?
  • ;-------------------------------
  • R1 RECT <?>
  • R2 RECT <?>
  • S SIZ <?>
  • PS PAINTSTR <?>
  • PT POINT <?>
  • ; дескрипторы окон-подсказок, для первого и второго элемента
  • H1 DD 0
  • H2 DD 0
  • ; строка-подсказка
  • HINTS DB 60 DUP (?)
  • ; перечень подсказок
  • HINT1 DB "Изменение строки",0
  • HINT2 DB "Кнопка выхода",0
  • ; для временного хранения контекста устройства
  • DC DD ?
  • ; счетчик
  • P1 DD ?
  • _DATA ENDS
  • ; сегмент кода
  • _TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
  • START:
  • ; получить дескриптор приложения
  • PUSH 0
  • CALL GetModuleHandleA@4
  • MOV [HINST], EAX
  • ;----------------------------
  • PUSH 0
  • PUSH OFFSET WNDPROC
  • PUSH 0
  • PUSH OFFSET PA
  • PUSH [HINST]
  • CALL DialogBoxParamA@20
  • CMP EAX,-1
  • JNE KOL
  • KOL:
  • ;-----------------------------
  • PUSH 0
  • CALL ExitProcess@4
  • ;-----------------------------
  • ; процедура окна
  • ; расположение параметров в стеке
  • ; [EBP+014Н] ; LPARAM
  • ; [EBP+10Н] ; WAPARAM
  • ; [EBP+0CH] ; MES
  • ; [EBP+8] ; HWND
  • WNDPROC PROC
  • PUSH EBP
  • MOV EBP,ESP
  • PUSH EBX
  • PUSH ESI
  • PUSH EDI
  • ;------------------------------
  • CMP DWORD PTR [EBP+0CH],WM_CLOSE
  • JNE L1
  • ; здесь реакция на закрытие окна
  • ; удалить таймер
  • L4:
  • PUSH 2 ; идентификатор таймера
  • PUSH DWORD PTR [EBP+08H]
  • CALL KillTimer@8
  • ; закрыть диалог
  • PUSH 0
  • PUSH DWORD PTR [EBP+08H]
  • CALL EndDialog@8
  • JMP FINISH
  • L1:
  • CMP DWORD PTR [EBP+0CH], WM_INITDIALOG
  • JNE L2
  • ; здесь начальная инициализация
  • ; установить таймер
  • PUSH OFFSET TIMPROC
  • PUSH 500 ; интервал 0.5 с.
  • PUSH 2 ; идентификатор таймера
  • PUSH DWORD PTR [EBP+08H]
  • CALL SetTimer@16
  • JMP FINISH
  • L2:
  • CMP DWORD PTR [EBP+0CH],WM_COMMAND
  • JNE L3
  • ; кнопка выхода?
  • CMP WORD PTR [EBP+10H],2
  • JNE L3
  • JMP L4
  • L3:
  • FINISH:
  • POP EDI
  • POP ESI
  • POP EBX
  • POP EBP
  • MOV EAX,0
  • RET 16
  • WNDPROC ENDP
  • ;---------------------------------------------
  • ; процедура таймера
  • ; расположение параметров в стеке
  • ; [EBP+014Н] ; LPARAM - промежуток запуска Windows
  • ; [EBP+10Н] ; WAPARAM - идентификатор таймера
  • ; [EBP+0CH] ; WM_TIMER
  • ; [EBP+8] ; HWND
  • TIMPROC PROC
  • PUSH EBP
  • MOV EBP,ESP
  • ; получить положение курсора
  • PUSH OFFSET PT
  • CALL GetCursorPos@4
  • ; запомнить координаты
  • MOV EAX,PT.X
  • MOV XX,EAX
  • MOV EAX,PT.Y
  • MOV YY,EAX
  • ; получить положение элементов
  • ; окно редактирования
  • PUSH 1
  • PUSH DWORD PTR [EBP+08H]
  • CALL GetDlgItem@8
  • PUSH OFFSET R1
  • PUSH EAX
  • CALL GetWindowRect@8
  • ; кнопка выхода
  • PUSH 2
  • PUSH DWORD PTR [EBP+08H]
  • CALL GetDlgItem@8
  • PUSH OFFSET R2
  • PUSH EAX
  • CALL GetWindowRect@8
  • ; увеличить счетчик
  • INC P1
  • MOV ECX,XX
  • MOV EDX,YY
  • ; проверка условий
  • .IF H1==0 && P1>5
  • .IF EDX<=R1.B && EDX>=R1.T && ECX>=R1.L && ECX<=R1.R
  • ; подготовить строку
  • PUSH OFFSET HINT1
  • PUSH OFFSET HINTS
  • CALL lstrcpyA@8
  • ; создать диалоговое окно - подсказку
  • PUSH 0
  • PUSH OFFSET HINT
  • PUSH DWORD PTR [EBP+08H]
  • PUSH OFFSET HIN
  • PUSH [HINST]
  • CALL CreateDialogParamA@20
  • MOV H1,EAX
  • ; установить фокус
  • PUSH DWORD PTR [EBP+08H]
  • CALL SetFocus@4
  • ; обнулить счетчик
  • MOV P1,0
  • JMP _END
  • .ENDIF
  • .ENDIF
  • .IF H1!=0
  • .IF (EDX>R1.B || EDX<R1.T) || (ECX<R1.L || ECX>R1.R)
  • ; удаление подсказки в связи с перемещением курсора
  • PUSH H1
  • CALL DestroyWindow@4
  • MOV H1,0
  • JMP _END
  • .ENDIF
  • .ENDIF
  • .IF H2==0 && P1>5
  • .IF EDX<=R2.B && EDX>=R2.T && ECX>=R2.L && ECX<=R2.R
  • ; подготовить строку
  • PUSH OFFSET HINT2
  • PUSH OFFSET HINTS
  • CALL lstrcpyA@8
  • ; создать диалоговое окно - подсказку
  • PUSH 0
  • PUSH OFFSET HINT
  • PUSH DWORD PTR [EBP+08H]
  • PUSH OFFSET HIN
  • PUSH [HINST]
  • CALL CreateDialogParamA@20
  • MOV H2,EAX
  • ; установить фокус
  • PUSH DWORD PTR [EBP+08H]
  • CALL SetFocus@4
  • ; обнулить счетчик
  • MOV P1,0
  • JMP _END
  • .ENDIF
  • .ENDIF
  • .IF H2!=0
  • .IF (EDX>R2.B || EDX<R2.T) || (ECX<R2.L || ECX>R2.R)
  • ;удаление подсказки в связи с перемещением курсора
  • PUSH H2
  • CALL DestroyWindow@4
  • MOV H2,0
  • JMP _END
  • .ENDIF
  • .ENDIF
  • ; восстановить стек
  • _END:
  • POP EBP
  • RET 16
  • TIMPROC ENDP
  • ; процедура окна всплывающей подсказки
  • HINT PROC
  • PUSH EBP
  • MOV EBP,ESP
  • CMP DWORD PTR [EBP+0CH],WM_INITDIALOG
  • JNE NO_INIT
  • ; инициализация
  • ; получить контекст
  • PUSH DWORD PTR [EBP+08H]
  • CALL GetDC@4
  • MOV DC,EAX
  • ; получить длину строки
  • PUSH OFFSET HINTS
  • CALL lstrlenA@4
  • ; получить длину и ширину строки
  • PUSH OFFSET S
  • PUSH EAX
  • PUSH OFFSET HINTS
  • PUSH DC
  • CALL GetTextExtentPoint32A@16
  • ; установить положение и размер окна-подсказки
  • PUSH 0
  • PUSH S.Y
  • ADD S.X,2
  • PUSH S.X
  • SUB YY,20
  • PUSH YY
  • ADD XX,10
  • PUSH XX
  • PUSH DWORD PTR [EBP+08H]
  • CALL MoveWindow@24
  • ; закрыть контекст
  • PUSH DC
  • PUSH DWORD PTR [EBP+08H]
  • CALL ReleaseDC@8
  • ; установить таймер
  • PUSH 0
  • PUSH 6000 ; интервал 6 с.
  • PUSH 3 ; идентификатор таймера
  • PUSH DWORD PTR [EBP+08H]
  • CALL SetTimer@16
  • JMP FIN
  • NO_INIT:
  • CMP DWORD PTR [EBP+0CH],WM_PAINT
  • JNE NO_PAINT
  • ; перерисовка окна
  • ; получить контекст
  • PUSH OFFSET PS
  • PUSH DWORD PTR [EBP+08H]
  • CALL BeginPaint@8
  • MOV DC,EAX
  • ; установить цвета фона и текста подсказки
  • PUSH RGBB
  • PUSH EAX
  • CALL SetBkColor@8
  • PUSH RGBT
  • PUSH DC
  • CALL SetTextColor@8
  • ; вывести текст
  • PUSH OFFSET HINTS
  • CALL lstrlenA@4
  • PUSH EAX
  • PUSH OFFSET HINTS
  • PUSH 0
  • PUSH 0
  • PUSH DC
  • CALL TextOutA@20
  • ; закрыть контекст
  • PUSH OFFSET PS
  • PUSH DWORD PTR [EBP+08H]
  • CALL EndPaint@8
  • JMP FIN
  • NO_PAINT:
  • CMP DWORD PTR [EBP+0CH],WM_TIMER
  • JNE FIN
  • ; обработка события таймера
  • ; удалить таймер и удалить диалоговое окно
  • ; подсказка удаляется в связи с истечением срока 6 с.
  • PUSH 3
  • PUSH DWORD PTR [EBP+08H]
  • CALL KillTimer@8
  • PUSH DWORD PTR [EBP+08H]
  • CALL DestroyWindow@4
  • FIN:
  • POP EBP
  • RET 16
  • HINT ENDP
  • _TEXT ENDS
  • END START
  • программа ассемблер всплывающий подсказка
  • 3. Результат работы программы
  • Вывод
  • В результате выполнения курсовой работы был изучен один из разделов ОС WINDOWS - всплывающие подсказки. Была написана программа на 32-битном ассемблере с применением API-функций.

Список литературы

1. http://msdn.microsoft.com/library/ms123401http://www.codenet.ru/progr/delphi/WinAPI/

2. http://vsokovikov.narod.ru/index.htm

3. В.Ю. Пирогов: Ассемблер для Windows, изд. Молгачева С. В., 2002 г., 552 с.

4. Вахрушева Е.А. "Методическое пособие для выполнения курсовой работы "Изучение операционной системы Windows" - Ижевск: ИжГТУ, 2012. - 56 с.

Размещено на Allbest.ru


Подобные документы

  • Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.

    курсовая работа [164,5 K], добавлен 18.05.2014

  • Введение в API-программирование. Транслирование клавиатурных сообщений в ASCII-коды. Текст программы на 32-битном ассемблере с применением API-функций. Функция для создания диалогового окна. Определение открываемого диска, каталога и имени файла.

    курсовая работа [40,6 K], добавлен 18.05.2014

  • Основы программирования в операционной системе Windows. Создание процессов в 32-битных операционных системах. Основное отличие дескриптора от идентификатора. Понятие критической секции. Основы вызова API-функций. Методы многозадачного программирования.

    курсовая работа [501,1 K], добавлен 18.05.2014

  • Описание использованного набора макросредств. Список использованных констант и структур. Основы вызова API-функций. Основы программирования на 32-битном ассемблере. Формирование объектного кода, содержащего текст исходной программы в машинном виде.

    курсовая работа [150,4 K], добавлен 18.05.2014

  • Основные характеристики графики в операционной системе Windows, реализация объектно-ориентированной идеологии. Специфика и этапы разработки программного продукта, описывающего графический объект, на 32-битном ассемблере с использованием API-функции.

    курсовая работа [82,3 K], добавлен 18.05.2014

  • Программирование оконных Windows-приложений, средства TASM для их разработки. Углубленное программирование на ассемблере для Win32, минимальная программа. Организация высокоуровневого консольного ввода-вывода. Наборы символов и функции Wlndows APL.

    курсовая работа [51,6 K], добавлен 23.06.2015

  • Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.

    курсовая работа [165,6 K], добавлен 18.05.2014

  • Microsoft Windows – одно из величайших изобретений человечества. Ознакомление с базовыми программами и навыками работы с Windows XP Professional: форматирование диска, архивация данных, файловые менеджеры, антивирусные программы, настройка Windows.

    отчет по практике [24,4 K], добавлен 22.12.2009

  • Задача и цели практики: модернизация сайта, разработка базы данных, отображающей время прихода и ухода сотрудников. Разработка формы представления данных на экране. Формирование данных, пригодных для вывода. Реализация технологии всплывающих подсказок.

    отчет по практике [1,3 M], добавлен 16.09.2012

  • Постановка задачи и алгоритм решения. Листинг программы, иллюстрирующей работу с символами, строками и блоками. Описание возможностей языка С, используемых для реализации алгоритма. Тестирование итоговой программы, анализ полученных результатов расчета.

    курсовая работа [63,0 K], добавлен 27.12.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.