
Государственное образовательное учреждение высшего профессионального образования
«Ижевский государственный технический университет» им. М.Т.Калашникова
Факультет «Информатика и вычислительная техника»
Кафедра «Вычислительная техника»
Курсовая работа
по предмету «Операционные системы»
на тему «Всплывающие подсказки».
Выполнил: Логинов Я.В.
студент гр.6-781-2
Проверил: Вахрушева Е.А.
к.т.н., доцент.
Ижевск 2014
Содержание
Содержание 2
Цель работы 8
Краткая теория 8
Всплывающие подсказки в Windows, не являющиеся производными CFrameWnd. 9
Всплывающие подсказки автоматически отображаются для кнопок и других элементов управления, содержащихся в родительском окне, производном от CFrameWnd.Это происходит потому, что CFrameWnd имеет используемый по умолчанию обработчик для уведомления TTN_GETDISPINFO, который обрабатывает уведомление TTN_NEEDTEXT из элементов управления всплывающей подсказки, связанных с элементами управления. 9
Однако этот обработчик по умолчанию не вызывается после уведомления о TTN_NEEDTEXT отправляется из элемента управления всплывающей подсказки, связанного с элементом управления в окне, не CFrameWnd, как элемент управления в диалоговом окне или представлении формы. Следовательно, необходимо предоставить функцию для обработчика для сообщения уведомлений TTN_NEEDTEXT для отображения советы по средства для дочерних элементов управления. 9
Чтобы получить текст подсказки для отображения, отправляется уведомление TTN_NEEDTEXT родительского окна элемента управления всплывающей подсказки непосредственно перед окно всплывающей подсказки. Если обработчик для данного сообщения для присвоения некоторое значение к члену pszText структуры TOOLTIPTEXT, то будет никаких текст, отображаемый для всплывающей подсказки. 10
Включить всплывающие подсказки для дочерних элементов управления окнами. Вызовите EnableToolTips для окна, для которого требуется обеспечить всплывающие подсказки. 10
Описание используемых API-функций 11
CreateWindow 11
GetModuleHandle 11
Листинг . (компилятор Fasmw 1.68) 14
1.format PE GUI 4.0 14
2.entry start 14
4.include 'win32a.inc' 14
6.ID_EDIT1 = 100 14
7.ID_EDIT2 = 101 14
8.ID_STATIC = 102 14
10.; Сегмент данных 14
11.section '.data' data readable writeable 14
13.hwndTip dd ? ; Хэндл окна подсказки 14
14.TTipFlag dd ? ; Флаг активности подсказки 14
16.; Структура TRACKMOUSEEVENT не определена, сделаем это сами 14
17.struct TRACKMOUSEEVENT 14
18. cbSize dd ? 14
19. dwFlags dd ? 14
20. hwndTrack dd ? 14
21. dwHoverTime dd ? 14
22.ends 14
24.; Определяем нужные структуры 14
25.tme TRACKMOUSEEVENT 14
26.pt POINT 15
27.ttip TOOLINFO 15
28.trect RECT 15
30.oldX dd ? ; Сохраненные координаты мыши 15
31.oldY dd ? 15
33.; Определяем нужные константы 15
34.TTM_TRACKACTIVATE = WM_USER + 17 15
35.TTM_TRACKPOSITION = WM_USER + 18 15
36.TTM_SETMAXTIPWIDTH = WM_USER + 24 15
38.; Сообщения окну подсказки 15
39.TTF_SUBCLASS = 0x0010 15
40.TTF_TRACK = 0x0020 15
41.TTF_ABSOLUTE = 0x0080 15
42.TTF_TRANSPARENT = 0x0100 15
44.; Сообщение обработчика мыши 15
45.TME_LEAVE = 0x00000002 15
47.; Максимальная ширина всплывающей подсказки 15
48.TOOLTIP_WIDTH = 200 15
50.; Предустановленное количество элементов в массиве подсказок 15
51.TOOLTIPS_COUNT = 5 15
53.; Массив данных для всплывающих подсказок 16
54.; Формат массива: 16
55.; 1 DWORD - сохраненный адрес обработчика 16
56.; 2 DWORD - адрес подсказки 16
57.tt_data rd (TOOLTIPS_COUNT*2) 16
59.;---------------------------------------------------------------------- 16
61.section '.code' code readable executable 16
63. start: 16
64. invoke GetModuleHandle,0 16
65. invoke DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0 16
66. invoke ExitProcess,0 16
68.;---------------------------------------------------------------------- 16
70.proc DialogProc hwnddlg,msg,wparam,lparam 16
71. push ebx esi edi 16
72. cmp [msg],WM_INITDIALOG 16
73. je .wminitdialog 16
74. cmp [msg],WM_COMMAND 16
75. je .wmcommand 16
76. cmp [msg],WM_CLOSE 16
77. je .wmclose 16
78. xor eax,eax 17
79. jmp .finish 17
81..wminitdialog: 17
82. ; Установить подсказки для всех элементов 17
83. invoke GetDlgItem,[hwnddlg],ID_EDIT1 17
84. stdcall AddTooltip,eax,szTip1,tt_data+(0*8) 17
86. invoke GetDlgItem,[hwnddlg],ID_EDIT2 17
87. stdcall AddTooltip,eax,szTip2,tt_data+(1*8) 17
89. invoke GetDlgItem,[hwnddlg],IDCANCEL 17
90. stdcall AddTooltip,eax,szTip3,tt_data+(2*8) 17
92. ; Установить подсказку для главного окна 17
93. stdcall AddTooltip,[hwnddlg],szText,tt_data+(3*8) 17
95. invoke GetDlgItem,[hwnddlg],ID_STATIC 17
96. stdcall AddTooltip,eax,szTip4,tt_data+(4*8) 17
98. jmp .processed 17
99..wmcommand: 17
100. cmp [wparam],BN_CLICKED shl 16 + IDCANCEL 17
101. je .wmclose 17
102. cmp [wparam],BN_CLICKED shl 16 + IDOK 17
103. jne .processed 17
105..wmclose: 18
106. invoke EndDialog,[hwnddlg],0 18
107..processed: 18
108. mov eax,1 18
109..finish: 18
110. pop edi esi ebx 18
111. ret 18
112.endp 18
114.szTip1 db 'Enter your login',0 18
115.szTip2 db 'Enter your password',0 18
116.szTip3 db 'Hello! Click me and your Universe will be annihilated ;)',0 18
117.szTip4 db 'STATIC is not so static',0 18
118. szText db 'Window',0 18
119.;---------------------------------------------------------------------- 18
120.; Процедура добавления подсказки к окну 18
121.; Входные параметры: 18
122.; hwnd - хэндл окна, к которому добавляется подсказка 18
123.; lpText - указатель на строку подсказки 18
124.; lpData - указатель на данные (2 DWORD) 18
125.;---------------------------------------------------------------------- 18
126.proc AddTooltip hwnd:DWORD, lpText:DWORD, lpData:DWORD 18
127. pusha 18
129. ; Оно подсказки уже инициализировано? 18
130. cmp [hwndTip],0 19
131. jne @f 19
133. invoke GetModuleHandle,0 19
134. ; Создать окно подсказки 19
135. invoke CreateWindowEx,NULL, ttclass, NULL,\ 19
136. TTS_ALWAYSTIP,\ 19
137. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\ 19
138. NULL, NULL, eax, NULL 19
139. ; Сохранить хэндл окна подсказки 19
140. mov [hwndTip],eax 19
142. ; Определить константу CS_DROPSHADOW 19
143. CS_DROPSHADOW = 00020000h 19
144. ; Получить текущее значение стиля окна 19
145. invoke GetWindowLong,[hwndTip],GCL_STYLE 19
146. ; Добавить к нему атрибут тень 19
147. or eax,CS_DROPSHADOW 19
148. ; Установить новый стиль окна 19
149. invoke SetClassLong,[hwndTip],GCL_STYLE,eax 19
151. ; Заполнение структуры для подсказки 19
152. mov [ttip.cbSize],sizeof.TOOLINFO 19
153. mov [ttip.hwnd],NULL 19
154. mov [ttip.uFlags],TTF_IDISHWND+TTF_TRACK+TTF_ABSOLUTE+TTF_SUBCLASS 19
155. mov [ttip.uId],NULL 20
156. mov [ttip.lpszText],szNull 20
158. ; Создать подсказку 20
159. invoke SendMessage,[hwndTip],TTM_ADDTOOL,0,ttip 20
160. ; Установить максимальную ширину. При этом длинный текст будет 20
161. ; переноситься на следующую строку 20
162. invoke SendMessage,[hwndTip],TTM_SETMAXTIPWIDTH,0,TOOLTIP_WIDTH 20
163. ; Установить подсказку поверх всех окон 20
164. invoke SetWindowPos,[hwndTip],HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE+SWP_NOACTIVATE 20
165.@@: 20
166. ; Субклассировать окно для вывода подсказки 20
167. invoke SetWindowLong,[hwnd],GWL_WNDPROC,ToolTipProc 20
168. mov edi,[lpData] 20
169. stosd 20
170. mov eax,[lpText] 20
171. stosd 20
172. ; Сохранить в пользовательских данных окна указатель на массив 20
173. invoke SetWindowLong,[hwnd],GWL_USERDATA,[lpData] 20
175. popa 20
176. ret 20
178.ttclass db 'tooltips_class32',0 20
179.szNull db ' ',0 20
181.endp 21
183.;---------------------------------------------------------------------- 21
184.; Субклассированная процедура обработки всплывающей подсказки 21
185.;---------------------------------------------------------------------- 21
186.proc ToolTipProc hwnddlg:DWORD,msg:DWORD,wparam:DWORD,lparam:DWORD 21
187. cmp [msg],WM_MOUSELEAVE 21
188. je .wmleave 21
189. cmp [msg],WM_MOUSEMOVE 21
190. je .wmmouse 21
192. ; Получить адрес предыдущего обработчика 21
193. invoke GetWindowLong,[hwnddlg],GWL_USERDATA 21
194. mov eax,[eax] 21
195. ; Передать управление предыдущему обработчику 21
196. invoke CallWindowProc,eax,[hwnddlg],[msg],[wparam],[lparam] 21
197. ret 21
199..wmleave: 21
200. ; Скрыть подсказку 21
201. invoke SendMessage,[hwndTip], TTM_TRACKACTIVATE, FALSE, ttip 21
202. mov [TTipFlag],FALSE 21
203. jmp .finish 21
205..wmmouse: 21
206. ; Подсказка уже показывается? 22
207. cmp [TTipFlag],TRUE 22
208. je @f 22
210. ; Установить перехватчик мыши на событие 22
211. mov [tme.cbSize],sizeof.TRACKMOUSEEVENT 22
212. mov eax,[hwnddlg] 22
213. mov [tme.hwndTrack],eax 22
214. mov [tme.dwFlags],TME_LEAVE 22
215. invoke TrackMouseEvent,tme 22
217. ; Получить адрес строки подсказки 22
218. invoke GetWindowLong,[hwnddlg],GWL_USERDATA 22
219. mov eax,[eax+4] 22
221. ; Установить новый текст подсказки 22
222. mov [ttip.lpszText],eax 22
223. ; Обновить подсказку 22
224. invoke SendMessage,[hwndTip], TTM_SETTOOLINFO, TRUE, ttip 22
225. ; Включить отображение подсказки 22
226. invoke SendMessage,[hwndTip], TTM_TRACKACTIVATE, TRUE, ttip 22
227. ; Установить флаг, что подсказка уже отображается 22
228. mov [TTipFlag],TRUE 22
229.@@: 22
230. ; Получить координаты мыши 22
231. mov eax,[lparam] 22
232. and eax,0FFFFh 23
233. mov esi,eax ; X 23
234. mov eax,[lparam] 23
235. shr eax,16 23
236. mov edi,eax ; Y 23
238. ; Фактическое движение мыши было? 23
239. mov eax,[oldX] 23
240. cmp eax,esi 23
241. jne @f 23
242. mov eax,[oldY] 23
243. cmp eax,edi 23
244. je .finish 23
245.@@: 23
246. ; Сохранить новые координаты 23
247. mov eax,esi 23
248. mov [pt.x],eax 23
249. mov [oldX],eax 23
250. mov eax,edi 23
251. mov [pt.y],eax 23
252. mov [oldY],eax 23
254. ; Вычислить абсолютные координаты на экране 23
255. invoke ClientToScreen,[hwnddlg],pt 23
256. mov ebx,[pt.y] 23
258. ; Получить высоту окна подсказки 24
259. invoke GetWindowRect,[hwndTip],trect 24
260. mov eax,[trect.top] 24
261. sub eax,[trect.bottom] 24
262. add ebx,eax 24
264. shl ebx,16 24
265. add ebx,[pt.x] 24
266. add ebx,5 24
268. ; Установить подсказку на новые координаты 24
269. invoke SendMessage,[hwndTip], TTM_TRACKPOSITION, 0, ebx 24
270..finish: 24
271. xor eax,eax 24
272. ret 24
273.endp 24
275.;---------------------------------------------------------------------- 24
277.section '.idata' import data readable writeable 24
279. library kernel32,'KERNEL32.DLL',\ 24
280. user32,'USER32.DLL' 24
282. include 'api\kernel32.inc' 24
283. include 'api\user32.inc' 24
285.;---------------------------------------------------------------------- 25
287.section '.rsrc' resource data readable 25
289. directory RT_DIALOG,dialogs 25
291. resource dialogs,\ 25
292. 37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration 25
294. dialog demonstration,'Tooltips Demo',0,0,190,58,WS_CAPTION+WS_SYSMENU+DS_CENTER 25
295. dialogitem 'BUTTON','',-1, 2, -1, 185, 37,WS_VISIBLE+BS_GROUPBOX 25
297. dialogitem 'STATIC','EDIT1:',ID_STATIC,5,8,45,12,WS_VISIBLE+SS_RIGHT+SS_NOTIFY 25
298. dialogitem 'EDIT','',ID_EDIT1,55,6,110,12,WS_VISIBLE+ES_CENTER+WS_BORDER+ES_NUMBER 25
300. dialogitem 'STATIC','EDIT2:',-1,5,22,45,12,WS_VISIBLE+SS_RIGHT 25
301. dialogitem 'EDIT','',ID_EDIT2,55,20,110,12,WS_VISIBLE+ES_CENTER+WS_BORDER 25
303. dialogitem 'BUTTON','Exit',IDCANCEL,135,40,50,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON 25
304. enddialog 25
Результат 25
26
Вывод 26
В ходе курсовой работы была написана программа позволяющая выводить подсказки при наведении на объекты курсора мыши. Всплывающие подсказки позволяют облегчить пользователь общение с приложением, что позволяет избежать множества разнообразных ошибок. Всплывающие подсказки являются неотъемлемой частью большинства приложений. 26
Использование готовых API функций позволяет существенно ускорить разработку программ, уменьшает количество кода и возможных ошибок, и делает программы более удобными для понимания. 26
Используемая литература. 27