Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / 18 Логинов 6-781-2.doc
Скачиваний:
40
Добавлен:
12.03.2015
Размер:
121.86 Кб
Скачать

Листинг . (компиляторFasmw 1.68)

  1. format PE GUI 4.0

  2. entry start

  3. include 'win32a.inc'

  4. ID_EDIT1 = 100

  5. ID_EDIT2 = 101

  6. ID_STATIC = 102

  7. ; Сегмент данных

  8. section '.data' data readable writeable

  9. hwndTip dd ? ; Хэндл окна подсказки

  10. TTipFlag dd ? ; Флаг активности подсказки

  11. ; Структура TRACKMOUSEEVENT не определена, сделаем это сами

  12. struct TRACKMOUSEEVENT

  13. cbSize dd ?

  14. dwFlags dd ?

  15. hwndTrack dd ?

  16. dwHoverTime dd ?

  17. ends

  18. ; Определяем нужные структуры

  19. tme TRACKMOUSEEVENT

  20. pt POINT

  21. ttip TOOLINFO

  22. trect RECT

  23. oldX dd ? ; Сохраненные координаты мыши

  24. oldY dd ?

  25. ; Определяем нужные константы

  26. TTM_TRACKACTIVATE = WM_USER + 17

  27. TTM_TRACKPOSITION = WM_USER + 18

  28. TTM_SETMAXTIPWIDTH = WM_USER + 24

  29. ; Сообщения окну подсказки

  30. TTF_SUBCLASS = 0x0010

  31. TTF_TRACK = 0x0020

  32. TTF_ABSOLUTE = 0x0080

  33. TTF_TRANSPARENT = 0x0100

  34. ; Сообщение обработчика мыши

  35. TME_LEAVE = 0x00000002

  36. ; Максимальная ширина всплывающей подсказки

  37. TOOLTIP_WIDTH = 200

  38. ; Предустановленное количество элементов в массиве подсказок

  39. TOOLTIPS_COUNT = 5

  40. ; Массив данных для всплывающих подсказок

  41. ; Формат массива:

  42. ; 1 DWORD - сохраненный адрес обработчика

  43. ; 2 DWORD - адрес подсказки

  44. tt_data rd (TOOLTIPS_COUNT*2)

  45. ;----------------------------------------------------------------------

  46. section '.code' code readable executable

  47. start:

  48. invoke GetModuleHandle,0

  49. invoke DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0

  50. invoke ExitProcess,0

  51. ;----------------------------------------------------------------------

  52. proc DialogProc hwnddlg,msg,wparam,lparam

  53. push ebx esi edi

  54. cmp [msg],WM_INITDIALOG

  55. je .wminitdialog

  56. cmp [msg],WM_COMMAND

  57. je .wmcommand

  58. cmp [msg],WM_CLOSE

  59. je .wmclose

  60. xor eax,eax

  61. jmp .finish

  62. .wminitdialog:

  63. ; Установить подсказки для всех элементов

  64. invoke GetDlgItem,[hwnddlg],ID_EDIT1

  65. stdcall AddTooltip,eax,szTip1,tt_data+(0*8)

  66. invoke GetDlgItem,[hwnddlg],ID_EDIT2

  67. stdcall AddTooltip,eax,szTip2,tt_data+(1*8)

  68. invoke GetDlgItem,[hwnddlg],IDCANCEL

  69. stdcall AddTooltip,eax,szTip3,tt_data+(2*8)

  70. ; Установить подсказку для главного окна

  71. stdcall AddTooltip,[hwnddlg],szText,tt_data+(3*8)

  72. invoke GetDlgItem,[hwnddlg],ID_STATIC

  73. stdcall AddTooltip,eax,szTip4,tt_data+(4*8)

  74. jmp .processed

  75. .wmcommand:

  76. cmp [wparam],BN_CLICKED shl 16 + IDCANCEL

  77. je .wmclose

  78. cmp [wparam],BN_CLICKED shl 16 + IDOK

  79. jne .processed

  80. .wmclose:

  81. invoke EndDialog,[hwnddlg],0

  82. .processed:

  83. mov eax,1

  84. .finish:

  85. pop edi esi ebx

  86. ret

  87. endp

  88. szTip1 db 'Enter your login',0

  89. szTip2 db 'Enter your password',0

  90. szTip3 db 'Hello! Click me and your Universe will be annihilated ;)',0

  91. szTip4 db 'STATIC is not so static',0

  92. szText db 'Window',0

  93. ;----------------------------------------------------------------------

  94. ; Процедура добавления подсказки к окну

  95. ; Входные параметры:

  96. ; hwnd - хэндл окна, к которому добавляется подсказка

  97. ; lpText - указатель на строку подсказки

  98. ; lpData - указатель на данные (2 DWORD)

  99. ;----------------------------------------------------------------------

  100. proc AddTooltip hwnd:DWORD, lpText:DWORD, lpData:DWORD

  101. pusha

  102. ; Оно подсказки уже инициализировано?

  103. cmp [hwndTip],0

  104. jne @f

  105. invoke GetModuleHandle,0

  106. ; Создать окно подсказки

  107. invoke CreateWindowEx,NULL, ttclass, NULL,\

  108. TTS_ALWAYSTIP,\

  109. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\

  110. NULL, NULL, eax, NULL

  111. ; Сохранить хэндл окна подсказки

  112. mov [hwndTip],eax

  113. ; Определить константу CS_DROPSHADOW

  114. CS_DROPSHADOW = 00020000h

  115. ; Получить текущее значение стиля окна

  116. invoke GetWindowLong,[hwndTip],GCL_STYLE

  117. ; Добавить к нему атрибут тень

  118. or eax,CS_DROPSHADOW

  119. ; Установить новый стиль окна

  120. invoke SetClassLong,[hwndTip],GCL_STYLE,eax

  121. ; Заполнение структуры для подсказки

  122. mov [ttip.cbSize],sizeof.TOOLINFO

  123. mov [ttip.hwnd],NULL

  124. mov [ttip.uFlags],TTF_IDISHWND+TTF_TRACK+TTF_ABSOLUTE+TTF_SUBCLASS

  125. mov [ttip.uId],NULL

  126. mov [ttip.lpszText],szNull

  127. ; Создать подсказку

  128. invoke SendMessage,[hwndTip],TTM_ADDTOOL,0,ttip

  129. ; Установить максимальную ширину. При этом длинный текст будет

  130. ; переноситься на следующую строку

  131. invoke SendMessage,[hwndTip],TTM_SETMAXTIPWIDTH,0,TOOLTIP_WIDTH

  132. ; Установить подсказку поверх всех окон

  133. invoke SetWindowPos,[hwndTip],HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE+SWP_NOACTIVATE

  134. @@:

  135. ; Субклассировать окно для вывода подсказки

  136. invoke SetWindowLong,[hwnd],GWL_WNDPROC,ToolTipProc

  137. mov edi,[lpData]

  138. stosd

  139. mov eax,[lpText]

  140. stosd

  141. ; Сохранить в пользовательских данных окна указатель на массив

  142. invoke SetWindowLong,[hwnd],GWL_USERDATA,[lpData]

  143. popa

  144. ret

  145. ttclass db 'tooltips_class32',0

  146. szNull db ' ',0

  147. endp

  148. ;----------------------------------------------------------------------

  149. ; Субклассированная процедура обработки всплывающей подсказки

  150. ;----------------------------------------------------------------------

  151. proc ToolTipProc hwnddlg:DWORD,msg:DWORD,wparam:DWORD,lparam:DWORD

  152. cmp [msg],WM_MOUSELEAVE

  153. je .wmleave

  154. cmp [msg],WM_MOUSEMOVE

  155. je .wmmouse

  156. ; Получить адрес предыдущего обработчика

  157. invoke GetWindowLong,[hwnddlg],GWL_USERDATA

  158. mov eax,[eax]

  159. ; Передать управление предыдущему обработчику

  160. invoke CallWindowProc,eax,[hwnddlg],[msg],[wparam],[lparam]

  161. ret

  162. .wmleave:

  163. ; Скрыть подсказку

  164. invoke SendMessage,[hwndTip], TTM_TRACKACTIVATE, FALSE, ttip

  165. mov [TTipFlag],FALSE

  166. jmp .finish

  167. .wmmouse:

  168. ; Подсказка уже показывается?

  169. cmp [TTipFlag],TRUE

  170. je @f

  171. ; Установить перехватчик мыши на событие

  172. mov [tme.cbSize],sizeof.TRACKMOUSEEVENT

  173. mov eax,[hwnddlg]

  174. mov [tme.hwndTrack],eax

  175. mov [tme.dwFlags],TME_LEAVE

  176. invoke TrackMouseEvent,tme

  177. ; Получить адрес строки подсказки

  178. invoke GetWindowLong,[hwnddlg],GWL_USERDATA

  179. mov eax,[eax+4]

  180. ; Установить новый текст подсказки

  181. mov [ttip.lpszText],eax

  182. ; Обновить подсказку

  183. invoke SendMessage,[hwndTip], TTM_SETTOOLINFO, TRUE, ttip

  184. ; Включить отображение подсказки

  185. invoke SendMessage,[hwndTip], TTM_TRACKACTIVATE, TRUE, ttip

  186. ; Установить флаг, что подсказка уже отображается

  187. mov [TTipFlag],TRUE

  188. @@:

  189. ; Получить координаты мыши

  190. mov eax,[lparam]

  191. and eax,0FFFFh

  192. mov esi,eax ; X

  193. mov eax,[lparam]

  194. shr eax,16

  195. mov edi,eax ; Y

  196. ; Фактическое движение мыши было?

  197. mov eax,[oldX]

  198. cmp eax,esi

  199. jne @f

  200. mov eax,[oldY]

  201. cmp eax,edi

  202. je .finish

  203. @@:

  204. ; Сохранить новые координаты

  205. mov eax,esi

  206. mov [pt.x],eax

  207. mov [oldX],eax

  208. mov eax,edi

  209. mov [pt.y],eax

  210. mov [oldY],eax

  211. ; Вычислить абсолютные координаты на экране

  212. invoke ClientToScreen,[hwnddlg],pt

  213. mov ebx,[pt.y]

  214. ; Получить высоту окна подсказки

  215. invoke GetWindowRect,[hwndTip],trect

  216. mov eax,[trect.top]

  217. sub eax,[trect.bottom]

  218. add ebx,eax

  219. shl ebx,16

  220. add ebx,[pt.x]

  221. add ebx,5

  222. ; Установить подсказку на новые координаты

  223. invoke SendMessage,[hwndTip], TTM_TRACKPOSITION, 0, ebx

  224. .finish:

  225. xor eax,eax

  226. ret

  227. endp

  228. ;----------------------------------------------------------------------

  229. section '.idata' import data readable writeable

  230. library kernel32,'KERNEL32.DLL',\

  231. user32,'USER32.DLL'

  232. include 'api\kernel32.inc'

  233. include 'api\user32.inc'

  234. ;----------------------------------------------------------------------

  235. section '.rsrc' resource data readable

  236. directory RT_DIALOG,dialogs

  237. resource dialogs,\

  238. 37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration

  239. dialog demonstration,'Tooltips Demo',0,0,190,58,WS_CAPTION+WS_SYSMENU+DS_CENTER

  240. dialogitem 'BUTTON','',-1, 2, -1, 185, 37,WS_VISIBLE+BS_GROUPBOX

  241. dialogitem 'STATIC','EDIT1:',ID_STATIC,5,8,45,12,WS_VISIBLE+SS_RIGHT+SS_NOTIFY

  242. dialogitem 'EDIT','',ID_EDIT1,55,6,110,12,WS_VISIBLE+ES_CENTER+WS_BORDER+ES_NUMBER

  243. dialogitem 'STATIC','EDIT2:',-1,5,22,45,12,WS_VISIBLE+SS_RIGHT

  244. dialogitem 'EDIT','',ID_EDIT2,55,20,110,12,WS_VISIBLE+ES_CENTER+WS_BORDER

  245. dialogitem 'BUTTON','Exit',IDCANCEL,135,40,50,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON

  246. enddialog

Результат

Вывод

В ходе курсовой работы была написана программа позволяющая выводить подсказки при наведении на объекты курсора мыши. Всплывающие подсказки позволяют облегчить пользователь общение с приложением, что позволяет избежать множества разнообразных ошибок. Всплывающие подсказки являются неотъемлемой частью большинства приложений.

Использование готовых API функций позволяет существенно ускорить разработку программ, уменьшает количество кода и возможных ошибок, и делает программы более удобными для понимания.

Используемая литература.

  1. http://msdn.microsoft.com/library/ms123401(дата обращения 25.05.2013)

  2. http://www.codenet.ru/progr/delphi/WinAPI/(дата обращения 27.05.2013)

  3. http://vsokovikov.narod.ru/index.htm(дата обращения 16.05.2013)

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