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

Государственное образовательное учреждение высшего профессионального образования

«Ижевский государственный технический университет» им. М.Т.Калашникова

Факультет «Информатика и вычислительная техника»

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

Курсовая работа

по предмету «Операционные системы»

на тему «Всплывающие подсказки».

Выполнил: Логинов Я.В.

студент гр.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