Tasm, задание случайного цвета шрифта - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! создаю простейшее оконное приложение для виндовс
Листинг программы
  1. .386
  2. locals
  3. jumps
  4. .model flat,STDCALL
  5. include win32.inc
  6. L equ <LARGE>
  7. Extrn BeginPaint:PROC ;начало блока перерисовки окна
  8. Extrn CreateWindowExA:PROC ;создать окно
  9. Extrn DefWindowProcA:PROC ;процедура обработки сообщений ;по-умолчанию
  10. Extrn DispatchMessageA:PROC ;процедура передачи сообщения оконному обработчику сооб-щений
  11. Extrn EndPaint:PROC ;завершение блока перерисовки ок-на
  12. Extrn ExitProcess:PROC ;завершение программы
  13. extrn FindWindowA:PROC ;поиск окна в ОС
  14. extrn GetMessageA:PROC ;принять сообщение из системной ;очереди
  15. extrn GetModuleHandleA:PROC ;получить описатель модуля
  16. extrn GetStockObject:PROC ;получить описатель основного пера,
  17. extrn InvalidateRect:PROC ;объявление недостоверности области
  18. extrn LoadCursorA:PROC ;загузить иконку курсора
  19. extrn LoadIconA:PROC ;загрузить пиктограмму
  20. extrn MessageBeep:PROC ;издать звуковой сигнал
  21. extrn MessageBoxA:PROC ;выдать системное окно с сообщением
  22. extrn PostQuitMessage:PROC ;послать сообщение о выходе из
  23. extrn RegisterClassA:PROC ;регистрация класса окна
  24. extrn ShowWindow:PROC ;показать окно на экране
  25. extrn SetWindowPos:PROC ;изменяет размер, положение и поря-док
  26. extrn TextOutA:PROC ;вывод текста в окно
  27. extrn TranslateMessage:PROC ;обработка сообщений от клавиатуры
  28. extrn UpdateWindow:PROC ;обновить окно
  29. CreateWindowEx equ <CreateWindowExA>
  30. DefWindowProc equ <DefWindowProcA>
  31. DispatchMessage equ <DispatchMessageA>
  32. FindWindow equ <FindWindowA>
  33. GetMessage equ <GetMessageA>
  34. GetModuleHandle equ <GetModuleHandleA>
  35. LoadCursor equ <LoadCursorA>
  36. LoadIcon equ <LoadIconA>
  37. MessageBox equ <MessageBoxA>
  38. RegisterClass equ <RegisterClassA>
  39. TextOut equ <TextOutA>
  40. .data
  41. newhwnd dd 0 ;ячейку для хранения описателя (хэндела) нового окна.
  42. lppaint PAINTSTRUCT <?> ;структура для перерисовки изображе-ния.
  43. msg MSGSTRUCT <?> ;структура системного сообщения.
  44. wc WNDCLASS <?> ;структура для регистрации окна.
  45. mbx_count dd 0 ;ячейка - счетчик нажатий левой клавиши мыши.
  46. hInst dd 0 ;ячейка для хранения системного указателя (хэндела)
  47. ;нашей программы.
  48. szTitleName db 'Win32 Assembly Program' ;текст заголовка окна ;программы.
  49. zero db 0 его замыкающий ноль.
  50. szAlternate db '(Secondary)',0 ;текст для изменения заголовка окна, ес-ли ;приложение запущено повторно.
  51. szClassName db 'ASMCLASS32',0 ;придуманное нами имя класса окна,
  52. ;под которым будем регистрировать-ся.
  53. szPaint db 'Левая кнопка нажата:' ;текст сообщения
  54. s_num db '00000000h --раз.',0 окне программы.
  55. MSG_L EQU ($-offset szPaint)-1
  56. .code
  57. start:
  58. push L 0 ;подготовим стэк к запуску процедуры
  59. call GetModuleHandle ;выполним процедуру (результат в EAX)
  60. mov [hInst], eax ;поместим полученный хэндел на ;подготовленное для него место
  61. push L 0
  62. push offset szClassName
  63. call FindWindow
  64. or eax,eax
  65. jz reg_class
  66. mov [zero], ' '
  67. reg_class:
  68. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
  69. mov [wc.clsLpfnWndProc], offset WndProc
  70. mov [wc.clsCbClsExtra], 0
  71. mov [wc.clsCbWndExtra], 0
  72. mov eax, [hInst]
  73. mov [wc.clsHInstance], eax
  74. push L IDI_APPLICATION
  75. push L 0
  76. call LoadIcon
  77. mov [wc.clsHIcon], eax
  78. push L IDC_ARROW
  79. push L 0
  80. call LoadCursor
  81. mov [wc.clsHCursor], eax
  82. mov [wc.clsHbrBackground], COLOR_WINDOW + 1
  83. mov dword ptr [wc.clsLpszMenuName], 0
  84. mov dword ptr [wc.clsLpszClassName], offset szClassName
  85. push offset wc
  86. call RegisterClass
  87. push L 0 ; параметры создания окна
  88. push [hInst] ; описатель (хэндел) нашего приложения
  89. push L 0 ; описатель оконного меню
  90. push L 0 ; описатель родительского окна
  91. push L CW_USEDEFAULT ; высота окна
  92. push L CW_USEDEFAULT ; ширина окна
  93. push L CW_USEDEFAULT ; координата y окна
  94. push L CW_USEDEFAULT ; координата x окна
  95. push L WS_OVERLAPPEDWINDOW ; стиль окна
  96. push offset szTitleName ; строка заголовка окна
  97. push offset szClassName ; имя класса окна
  98. push L 0 ; расширенный стиль окна
  99. call CreateWindowEx
  100. mov [newhwnd], eax
  101. push L SW_SHOWNORMAL ;режим показа окна на экране -
  102. push [newhwnd] ;описатель окна, подлежащего показу на экране
  103. call ShowWindow
  104. push [newhwnd]
  105. call UpdateWindow
  106. msg_loop:
  107. push L 0
  108. push L 0
  109. push L 0
  110. push offset msg
  111. call GetMessage
  112. cmp ax, 0
  113. je end_loop
  114. push offset msg
  115. call TranslateMessage
  116. push offset msg
  117. call DispatchMessage
  118. jmp msg_loop
  119. end_loop:
  120. push [msg.msWPARAM]
  121. call ExitProcess
  122. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
  123. LOCAL theDC:DWORD
  124. cmp [wmsg], WM_DESTROY ;если - уничтожить окно?
  125. je wmdestroy ;то перейти на уничтожение
  126. cmp [wmsg], WM_RBUTTONDOWN ;нажата правая клавиша мы-ши?
  127. je wmrbuttondown ;то перейти на обработку этого нажатия
  128. cmp [wmsg], WM_SIZE ;изменен размер окна?
  129. je wmsize
  130. cmp [wmsg], WM_CREATE ;команда создать окно?
  131. je wmcreate
  132. cmp [wmsg], WM_LBUTTONDOWN ;нажата левая клавиша мыши?
  133. je wmlbuttondown
  134. cmp [wmsg], WM_PAINT ;это команда на перерисовку окна?
  135. je wmpaint
  136. cmp [wmsg], WM_GETMINMAXINFO ;минимизировать/
  137. je wmgetminmaxinfo
  138. jmp defwndproc ;иначе перейти на обработчик сообщений
  139. wmpaint:
  140. push offset lppaint
  141. push [hwnd]
  142. call BeginPaint
  143. mov [theDC], eax
  144. mov eax, [mbx_count]
  145. mov edi, offset s_num
  146. call HexWrite32
  147. push L MSG_L ;длина строки
  148. push offset szPaint ;адрес строки для вывода
  149. push L 5 ;координата Y где выводится строка
  150. push L 5 ;координата X где выводится строка
  151. push [theDC] ;контекст устройства, через которое идет вывод
  152. call TextOut
  153. push offset lppaint
  154. push [hwnd]
  155. call EndPaint
  156. wmcreate:
  157. mov eax, 0
  158. jmp finish
  159. defwndproc:
  160. push [lparam]
  161. push [wparam]
  162. push [wmsg]
  163. push [hwnd]
  164. call DefWindowProc
  165. jmp finish
  166. wmdestroy:
  167. push L 0
  168. call PostQuitMessage
  169. mov eax, 0
  170. jmp finish
  171. wmlbuttondown:
  172. inc [mbx_count]
  173. push L 0
  174. push L 0
  175. push [hwnd]
  176. call InvalidateRect
  177. mov eax, 0
  178. jmp finish
  179. wmrbuttondown:
  180. push L 0
  181. call MessageBeep
  182. wmsize:
  183. mov eax, 0
  184. jmp finish
  185. wmgetminmaxinfo:
  186. mov ebx, [lparam] ; указатель на структуру minmaxinfo
  187. mov [(MINMAXINFO ptr ebx).mintrackposition_x] , 350
  188. mov [(MINMAXINFO ptr ebx).mintrackposition_y] , 60
  189. mov eax, 0
  190. finish:
  191. ret
  192. WndProc endp
  193. HexWrite8 proc
  194. mov ah, al ;это число дублируется в ah
  195. and al, 0fh ;затем в al оставляют младшую тетраду числа
  196. shr ah, 4 в ah - старшую
  197. or ax, 3030h ;кадый нибл дополняется единицами (преобразуется в
  198. ;символ)
  199. xchg al, ah ;байты меняются местами (так отображается на экране)
  200. cmp ah, 39h ;идет сравнение старшего байта с символом '9'
  201. ja @@4 ;переход, если символ оказался выше 9
  202. @@1:
  203. cmp al, 39h ;идет сравнение младшего байта с символом '9'
  204. ja @@3 ;переход, если символ оказался выше 9
  205. @@2:
  206. stosw ;слово из AX заносится по адресу ES:EDI
  207. ret
  208. @@3:
  209. sub al, 30h числа убираются биты, переводящие его в символ
  210. add al, 'A' - 10 ;затем снова добавляются, переводя число в букву
  211. jmp @@2
  212. @@4:
  213. sub ah, 30h числа убираются биты, переводящие его в символ
  214. add ah, 'A'-10 ;затем снова добавляются, переводя число в букву
  215. jmp @@1
  216. HexWrite8 endp
  217. HexWrite16 proc
  218. push ax
  219. xchg al,ah
  220. call HexWrite8
  221. pop ax
  222. call HexWrite8
  223. ret
  224. HexWrite16 endp
  225. HexWrite32 proc
  226. push eax
  227. shr eax, 16
  228. call HexWrite16
  229. pop eax
  230. call HexWrite16
  231. ret
  232. HexWrite32 endp
  233. public WndProc
  234. ends
  235. end start
подскажите пожалуйста в каком месте задается цвет шрифта? как задать его рендомно при запуске программы? в моем понимании это происходит вот здесь
Листинг программы
  1. push L MSG_L ;длина строки
  2. push offset szPaint ;адрес строки для вывода
  3. push L 5 ;координата Y где выводится строка
  4. push L 5 ;координата X где выводится строка
  5. push [theDC] ;контекст устройства, через которое идет вывод
  6. call TextOut
но вот как задать случайный цвет?.. помогите пожалуйста! заранее спасибо всем участвующим

Решение задачи: «Tasm, задание случайного цвета шрифта»

textual
Листинг программы
  1. extrn   UpdateWindow:PROC   ;обновить окно
  2. extrn SetTextColor;

Объяснение кода листинга программы

  1. Обновить окно - вызывает процедуру обновления окна, чтобы изменения, сделанные в коде, отображались на экране.
  2. SetTextColor - устанавливает цвет текста для выбранного окна.
  3. BM_GETCH - получает текущий цвет шрифта из выбранного окна.
  4. BM_SETCH - устанавливает новый цвет шрифта для выбранного окна.
  5. BM_GETBUF - получает текущий буфер обмена из выбранного окна.
  6. BM_SETBUF - устанавливает новый буфер обмена для выбранного окна.
  7. BM_GETMODE - получает текущий режим отображения выбранного окна.
  8. BM_SETMODE - устанавливает новый режим отображения для выбранного окна.
  9. BM_GETMAP - получает текущую карту выбранного окна.
  10. BM_SETMAP - устанавливает новую карту для выбранного окна.
  11. BM_GETPIX - получает текущий пиксель выбранного окна.
  12. BM_SETPIX - устанавливает новый пиксель для выбранного окна.
  13. BM_GETSIZE - получает текущий размер выбранного окна.
  14. BM_SETSIZE - устанавливает новый размер для выбранного окна.
  15. BM_GETZOOM - получает текущий уровень масштабирования выбранного окна.
  16. BM_SETZOOM - устанавливает новый уровень масштабирования для выбранного окна.
  17. BM_GETSEL - получает текущий выделенный текст в выбранном окне.
  18. BM_SETSEL - устанавливает новый выделенный текст для выбранного окна.
  19. BM_GETVIEW - получает текущий вид выбранного окна.
  20. BM_SETVIEW - устанавливает новый вид для выбранного окна.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы