Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
1
TASM

Работа с мышью: вывести квадрат нажатием левой кнопки мыши и спрятать его нажатием правой кнопки мыши

04.11.2009, 15:39. Просмотров 2471. Ответов 11
Метки нет (Все метки)

Ребят обьясните как вывести квадрат левым нажатием кнопки мыши и спрятав его правым нажатием кнопки мыши.

Вот набросок кода

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
.model tiny
.code
org 100h
.186
start: 
mov ax,0012h ; включение видеорежима 640х480
int 10h
mov ax, 0 ; проверка наличия драйвера мыши в системе
int 33h
mov ax, 1 ; вывод курсора
int 33h
 
mov ax, 000ch ; создание первого обработчика события
mov cx, 0002h ; при нажатии на левую кнопку мыши
mov dx, offset gold
int 33h
 
mov ah, 0 ; ожидаем нажатия любой клавиши    
int 16h
 
mov ax,3
int 10h
ret
 
gold: ; первое событие
 
push cx
push dx
 
mov x,cx ; запоминаем верхнюю координату x
mov y,dx ; запоминаем верхнюю координату y
 
add cx,1
add dx,1
 
pop dx
pop cx
 
mov ax, 000ch ; удаляем первый
mov cx, 0000h ; обработчик
int 33h       ; событий 
 
 
 
 
mov ax,0002h ; убираем курсор мыши с экрана
int 33h
 
xor ah,ah
xor al,al
xor dx,dx
xor cx,cx
xor si,si
xor di,di
 
mov di,h
mov si,w
mov ah, 0ch
mov dx, y
mov cx, x
mov al, 12
la: int 10h
inc cx
dec si
jnz la
inc dx
mov cx, x
mov si, w
dec di
jnz la
 
 
pop dx
pop cx
pop bx
pop ax
 
mov ax, 000ch ; удаляем второй
mov cx, 0000h ; обработчик событий
int 33h
retf
 
x dw 10
y dw 10
w dw 10
h dw 10
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2009, 15:39
Ответы с готовыми решениями:

Нажатием левой кнопки мыши выбирать и запоминать цвет, при нажатии правой кнопки мыши - устанавливать выбранный цвет
Люди добрые, киньте какой-нибудь рабочий .asm для masm, похожий на решение следующей задачи, а то...

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой...

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

Прервать цикл нажатием кнопки мыши
Есть мышь G700 которая поддерживает скрипты на Lua И в процессе написания скрипта я столкнулся с...

11
2529 / 825 / 10
Регистрация: 31.05.2009
Сообщений: 1,669
04.11.2009, 17:17 2
Да все правильно впринципе, только вы не учли, что после вызова обработчика сегментный регистр ds, который обычно используется для указания на сегмент данных, необязательно будет таким же. Но т.к. у вас переменные находятся в одном сегменте с кодом, то нужно к ним обращаться с указанием этого сегмента, т.е. например mov cx, cs:[x].
Я переделал ваш код и убрал лишнее из него.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    .model tiny
    .code
    org 100h
    .186
start:
    mov ax,0012h ; включение видеорежима 640х480
    int 10h
    mov ax, 0 ; проверка наличия драйвера мыши в системе
    int 33h
    mov ax, 1 ; вывод курсора
    int 33h
 
    mov ax, 000ch ; создание первого обработчика события
    mov cx, 0002h ; при нажатии на левую кнопку мыши
    mov dx, offset gold
    int 33h
 
    mov ah, 0 ; ожидаем нажатия любой клавиши    
    int 16h
 
    mov ax,3
    int 10h
    ret
 
gold:
    ; первое событие
 
    mov cs:[x],cx ; запоминаем верхнюю координату x
    mov cs:[y],dx ; запоминаем верхнюю координату y
 
    mov ax, 000ch ; удаляем первый
    mov cx, 0000h ; обработчик
    int 33h       ; событий 
 
    mov ax,0002h ; убираем курсор мыши с экрана
    int 33h
 
    mov di,cs:[h]
    mov si,cs:[w]
    mov ah, 0ch
    mov dx, cs:[y]
    mov cx, cs:[x]
    mov al, 12
    
la:
    int 10h
    
    inc cx
    dec si
    jnz la
    
    inc dx
    mov cx, cs:[x]
    mov si, cs:[w]
    dec di
    jnz la
 
    retf
 
    x dw 10
    y dw 10
    w dw 10
    h dw 10
end start
Ну а чтобы убирать квадрат, нужно сделать второй обработчик, в котором закрашивать этот же квадрат обратно в черный.
1
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
04.11.2009, 19:13  [ТС] 3
Не могу разобратся со вторым обработчиком который закрашивает квадрат

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
.model tiny
        .code
        org 100h
        .186
start:
        mov ax,0012h ; включение видеорежима 640х480
        int 10h
        mov ax, 0 ; проверка наличия драйвера мыши в системе
        int 33h
        mov ax, 1 ; вывод курсора
        int 33h
 
        mov ax, 000ch ; создание первого обработчика события
        mov cx, 0002h ; при нажатии на левую кнопку мыши
        mov dx, offset gold
        int 33h
 
        mov ax, 000ch
        mov cx, 0004h  ; Для правой клавиши
        mov dx, offset gold1
        int 33h
 
 
        mov ah, 0 ; ожидаем нажатия любой клавиши    
        int 16h
 
        mov ax,3
        int 10h
        ret
 
gold:
        ; первое событие
 
        mov cs:[x],cx ; запоминаем верхнюю координату x
        mov cs:[y],dx ; запоминаем верхнюю координату y
 
        mov ax, 000ch ; удаляем первый
        mov cx, 0000h ; обработчик
        int 33h       ; событий 
 
 
        mov di,cs:[h]
        mov si,cs:[w]
        mov ah, 0ch
        mov dx, cs:[y]
        mov cx, cs:[x]
        mov al, 12
        
la:
        int 10h
        
        inc cx
        dec si
        jnz la
        
        inc dx
        mov cx, cs:[x]
        mov si, cs:[w]
        dec di
        jnz la
 
        push cx
        push dx
 
        retf
 
 
gold1:
        pop dx
        pop cx
 
        mov ax, 000ch ; удаляем второй
        mov cx, 0000h ; обработчик
        int 33h       ; событий 
        
        mov di,cs:[h]
        mov si,cs:[w]
        mov ah, 0ch
        mov dx, cs:[y]
        mov cx, cs:[x]
        mov al, 0
        
lo:
        int 10h
        
        inc cx
        dec si
        jnz lo
        
        inc dx
        mov cx, cs:[x]
        mov si, cs:[w]
        dec di
        jnz lo
 
        retf
 
        x dw 10
        y dw 10
        w dw 10
        h dw 10
 
end start
Добавлено через 3 минуты
Пробовал добавить переменные. Появляется квадрат в правом верхнем углу и все.
0
2529 / 825 / 10
Регистрация: 31.05.2009
Сообщений: 1,669
04.11.2009, 20:00 4
Это что такое в строках 64 - 65, 71 - 72 ? Убрать в первую очередь !

Далее... Обработчик, устанавливаемый по функции 0ch int 33h может быть только один -> устанавливайте второй в конце обработки первого и не забывайте, что функция принимает аддрес в es:dx. Т.е. настройте регистр es.

Assembler
1
2
mov ax,cs
mov es,ax
И еще. Чтобы обработчик вызывался по нажатию правой кнопки мыши, в cx при вызове должен быть включен 3 бит.
0
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
04.11.2009, 20:43  [ТС] 5
А разве не 4 бит?

Добавлено через 7 минут
Понял после сороковой строки пойдет вот такой код

Assembler
1
2
3
4
5
6
mov ax, 000ch
mov cx 0004h ; или '0003h'
mov dx, offset gold1
 
mov ax, cx
mov es, ax
0
2529 / 825 / 10
Регистрация: 31.05.2009
Сообщений: 1,669
04.11.2009, 20:53 6
Цитата Сообщение от Dragon34 Посмотреть сообщение
А разве не 4 бит?
Четвертый бит для реакции на отпускание правой кнопки, а третий для реакции на нажатие на нее.

Цитата Сообщение от Dragon34 Посмотреть сообщение
mov cx 0004h ; или '0003h'
4 бит, а не число 4. 01000b или 8 по человечески.

Цитата Сообщение от Dragon34 Посмотреть сообщение
Понял после сороковой строки пойдет вот такой код
настраивайте es до вызова функции, после он уже не нужен никому...
1
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
04.11.2009, 21:02  [ТС] 7
Попробую завтра. Голова раскалывается. Пол дня просидел над прогой
0
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
05.11.2009, 11:12  [ТС] 8
Настроил es, создал нажатие на правую кнопку. Начинаю запускать после прорисовки квадрата выскакивает ошибка.

Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
.model tiny
        .code
        org 100h
        .186
start:
        mov ax,0012h ; включение видеорежима 640х480
        int 10h
        mov ax, 0 ; проверка наличия драйвера мыши в системе
        int 33h
        mov ax, 1 ; вывод курсора
        int 33h
 
        mov ax, 000ch ; создание первого обработчика события
        mov cx, 0002h ; при нажатии на левую кнопку мыши
        mov dx, offset gold
        int 33h
        
        mov ax, cx
        mov es, ax
 
        
 
 
        mov ah, 0 ; ожидаем нажатия любой клавиши    
        int 16h
 
        mov ax,3
        int 10h
        ret
 
gold:
        ; первое событие
 
        mov cs:[x],cx ; запоминаем верхнюю координату x
        mov cs:[y],dx ; запоминаем верхнюю координату y
 
        mov ax, 000ch ; удаляем первый
        mov cx, 0000h ; обработчик
        int 33h       ; событий
 
        
 
 
        mov ax, 000ch
        mov cx, 0004h
        mov dx, offset gold1
        int 33h
 
 
 
 
 
        mov di,cs:[h]
        mov si,cs:[w]
        mov ah, 0ch
        mov dx, cs:[y]
        mov cx, cs:[x]
        mov al, 12
        
la:
        int 10h
        
        inc cx
        dec si
        jnz la
        
        inc dx
        mov cx, cs:[x]
        mov si, cs:[w]
        dec di
        jnz la
 
        
 
        retf
 
 
gold1:
 
        mov ax, 000ch ; удаляем второй
        mov cx, 0000h ; обработчик
        int 33h       ; событий 
        
        
        mov di,cs:[h]
        mov si,cs:[w]
        mov ah, 0ch
        mov dx, cs:[y]
        mov cx, cs:[x]
        mov al, 15
        
lo:
        int 10h
        
        inc cx
        dec si
        jnz lo
        
        inc dx
        mov cx, cs:[x]
        mov si, cs:[w]
        dec di
        jnz lo
 
        retf
 
        x dw 10
        y dw 10
        w dw 10
        h dw 10
 
end start
0
2529 / 825 / 10
Регистрация: 31.05.2009
Сообщений: 1,669
05.11.2009, 12:35 9

Вставьте настройку es в первом обработчике, до вызова функции установки второго, т.е. в 38 строку.
0
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
05.11.2009, 13:19  [ТС] 10
Выводит ошибку.

Добавлено через 3 минуты
Зделал так же

Добавлено через 1 минуту
(программу пишу на TASM)
0
2529 / 825 / 10
Регистрация: 31.05.2009
Сообщений: 1,669
05.11.2009, 13:20 11
У вас там вместо cs написано cx.
1
2 / 2 / 1
Регистрация: 23.09.2009
Сообщений: 40
05.11.2009, 13:26  [ТС] 12
Работает чуть подругому ну и ладно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2009, 13:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Открыть форму windows нажатием кнопки мыши
Всем привет! Я пытаюсь сделать редактор html документа. для этого использую WebBrouser. Хочу...

Рисование по канве нажатием любой кнопки мыши
Получаетсья сделать только для правой кнопки. А как сделать чтобы можно было и правой и левой? ...

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

Тренажёр мыши, нажатие левой и правой кнопки поочерёдно
Вообщем проблема такая, мне нужно сделать тренажёр мыши. Я всё сделал вроде, но есть одна...

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

Подсчёт количества «кликов» левой, правой и средней кнопки мыши
Написать приложение, в котором ведётся подсчёт количества «кликов» левой, правой и средней кнопки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.