Re: Помогите новичку
Posted: Sat Aug 11, 2012 10:08 am
исходный код с подсветкой http://pastie.org/4454257
Суть в том, что при нажатии любой клавиши переменной codes dd 0 присваивается значение равное 1, а в цикле отрисовки, если это значение равно 1, то следует выводить message. Но message становится видно, только если нажать клавишу, а потом что либо сделать с окном, то есть вызвать перерисовку. В принципе понятно, зачем что либо перерисовывать, если ничего не изменилось. Вопрос в том, как принудительно вызвать перерисовку. будет ли логичным вставить call draw_window или jmp red после mov [codes],1 (строка из обработки нажатия клавиш - метка key)????
Code: Select all
use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x1000
dd 0x1000
dd 0x0
dd 0x0
include 'lang.inc'
include 'macros.inc'
START:
red:
call draw_window
still:
mcall 10 ; функция 10 - ждать события
cmp eax,1 ; перерисовать окно ?
je red ; если да - на метку red
cmp eax,2 ; нажата клавиша ?
je key ; если да - на key
cmp eax,3 ; нажата кнопка ?
je button ; если да - на button
jmp still ; если другое событие - в начало цикла
;end_still
key: ; нажата клавиша на клавиатуре
mcall 2 ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
mov [codes],1 ; Если нажали любую клавишу то меняем значение на 1
jmp still ; вернуться к началу цикла
;end_key
button:
mcall 17 ; 17 - получить идентификатор нажатой кнопки
cmp ah, 1 ; если НЕ нажата кнопка с номером 1,
jnz still ; вернуться
mcall -1 ; иначе конец программы
;end_button
draw_window:
mcall 12, 1 ; функция 12: отрисовка окна; 1 - начинаем рисовать
mcall 0, <200,200>, <200,50>, 0x33AABBCC,,title
cmp [codes],1 ; сравниваем
jne exit ; если не равно то на выход, иначе ... выводим месадж
mcall 4, <3, 8>, 0, message, message.size
exit:
mcall 12, 2 ; функция 12: отрисовка окна; 2, закончили рисовать
ret ; выходим из процедуры на мессто откуда вызвали
;---------------------------------------------------------------------
;--- ДАННЫЕ ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
codes dd 0
lsz message,\
ru,'Нажмите любую клавишу...',\
en,'Press any key...',\
fr,'Pressez une touche...'
lsz title,\
ru,'ПРИМЕР ПРОГРАММЫ',\
en,'EXAMPLE APPLICATION',\
fr,"L'exemplaire programme"
;---------------------------------------------------------------------
I_END: ; метка конца программы