Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2016, 07:52   #1
Flour
 
Регистрация: 24.04.2016
Сообщений: 4
Вопрос Рисовалка на tasm

Всем доброго времени суток!

Проблема такая: есть программа, которая при нажатии лкм рисует; вверху есть (пока один) прямоугольник с цветом, нужно сделать так, чтобы при нажатии на него и дальнейшем рисовании цвет становился цветом прямоугольника

Код:
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
DSEG segment
 
DSEG ends
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:DSEG,SS:STACKSG
BEGIN PROC FAR
 
 
      mov ax,13h     ;переход в графический режим (320/200)
      int 10h
 
;рисование прямоугольника
pr:   mov cx,0       ;cx - x верхнего левого
      mov dx,0       ;dx - y верхнего левого
      mov si,35      ;si - x правого нижнего
      mov di,20      ;di - y правого нижнего
      mov al,1h      ;al - цвет
      mov ah,0ch
l10:  push dx     ;сохраняем вертикальную координату
l11:  int 10h     ;внутренний цикл вывода вертикального отрезка
      inc dx      ;увеличиваем координату
      cmp dx,di   ;пока не достигнем конца
      jng l11
      pop dx      ;восстанавливаем координату
      inc cx      ;приращиваем горизонтальную координату
      cmp cx,si   ;выводим все верт отрезки пока не достигнем конечно горизонтальной координаты
      jng l10
 
 
mov ax,0a000h
mov es,ax
mov ax,00004h
mov cx,160
mov dx,100
int 33h             ;установка положения курсора
mov ax,00001h
int 33h             ;включение курсора мыши
 
 
  
 
l1:
mov ax,00003h
int 33h
cmp bx,2
jz l2
cmp bx,1
jnz l1
mov ax,320
mul dx
shr cx,1            
add ax,cx
xchg ax,di
mov al,15
mov byte ptr es:[di],al
jmp short l1
 
 
l2:
mov ah,10h
int 16h
cmp ah,01h          ;проверка ESC
jz q1
jnz l1              ;если нажать любую клавишу - возврат в основной цикл
q1:
mov ah,00h
mov al,03h
int 10h            ;возврат в текстовый режим
 
MOV AH,4CH          ;выход в ДОС
INT 21H
Знаю, что считывание происходит через 0dh, но как это прописать сообразить не могу

Хоть на мысль натолкните, пожалуйста.

Вот функция, куда ее вписать нужно? Пробовала в обработчик, но ничего путного не выходит. Может я не так это делаю.

Код:
mov ah,0000Dh
mov cx,0
mov dx,0
mov si,35
mov di,20
int 10h
mov al,1h
Flour вне форума Ответить с цитированием
Старый 02.06.2016, 11:22   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Flour, нужно разделить рабочее поле на 2: область палитры и рабочая область. Дальше, нужно контролировать щёлчок мышью, т.е. в какой области юзер щёлкнул - палитра или облатсь рисования. В зависимости от этого переходить к обработчику событий мыши. Программа твоя должна знать, что ты хочешь сделать: выбрать цвет или нарисовать линию. Как-то так...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.06.2016, 20:11   #3
Flour
 
Регистрация: 24.04.2016
Сообщений: 4
По умолчанию

R71MT, хорошо. У меня получается для палитры отведена область от 0 до 20 по y и по всему х. То есть ниже координаты 20 рисуется линия, а все, что выше идет под определение цвета.

Цитата:
Дальше, нужно контролировать щёлчок мышью, т.е. в какой области юзер щёлкнул - палитра или облатсь рисования. В зависимости от этого переходить к обработчику событий мыши.
Как это реализовать, не подскажете? Допустим переход к обработчику осуществить через циклы, мне не понятен сам "контроль" и что прописывать в обработчике, отвечающем за область палитры, чтобы считывалась не точка (пиксель), а именно область, заданная мной (прямоугольник). И если множество прямоугольников для каждого прописывать функцию считывания?

Преподаватель сказал, что цвет можно записывать в переменную. но обязательно ли? И про координаты тоже говорил, что можно как переменные их задать.
Flour вне форума Ответить с цитированием
Старый 02.06.2016, 20:54   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Flour, ещё (чтоб не парится с вычислением координат щелчка) можно обработать нажатие кнопок. Так-как их на мышке три, то как-раз: правая для выбора цвета, левая для рисования, средняя для выхода из приложения.
Попробуй такой код.. Он рисует сверху экрана палитру в 7 цветов, и обрабатывает нажатие кнопок мыши. Остаётся только обработать эти нажатия..
Код:
org 100h
jmp start

start:  mov   ax,13h               ; ставим режим 320х200/256
        int   10h                  ;
        push  es 0A000h            ; настроимся на видео/буфер
        pop   es                   ;
        call  CreatePalette       ; рисуем палитру

        xor   ax,ax                ; сброс мыши
        int   33h                  ;
        mov   ax,1                 ; покажем курсор
        int   33h                  ;
waitSnub:                          ;
        mov   ax,3                 ; ждём мышиный щелчок
        int   33h                  ;
        test  bx,001b              ; левая?
        jnz   writeLine            ; да - рисуем линию
        test  bx,010b              ; правая?
        jnz   getColor             ; да - выбираем цвет
        test  bx,100b              ; средняя?
        jnz   exit                 ; да - выход из программы
        jmp   waitSnub             ; мотаем, если нет щелчка


writeLine:
        ;.............
        jmp   waitSnub

getColor:
        ;.............
        jmp   waitSnub

exit:   pop   es
        mov   ax,3
        int   10h
        int   20h

;=================== П Р О Ц Е Д У Р Ы ==================================
;------------------------------------------------------------------------
CreatePalette:                    ; Создаём палитру цветов
        mov   dx,10                ; заполнять будем 10 строк
        mov   di,80                ; стартовая позиция в окне
palet:  push  di                   ;    ...запомним для следующей строки
        mov   bx,070fh             ; 7 цветов, начиная с белого (0fh)
        mov   cx,20                ; каждый цвет 20 pix в ширину
cycle:  push  cx                   ;    ..запомним
        mov   al,bl                ; AL - цвет точки
        rep   stosb                ; рисуем 20 пикселей в строке(1)
        pop   cx                   ; восстановим счётчик
        dec   bl                   ; меняем цвет,
        dec   bh                   ;    ..и счётчик цветов
        jnz   cycle                ; все цвета вывели? нет - мотаем..
        pop   di                   ;
        add   di,320               ; сл.строка!
        dec   dx                   ; 10 строк вывели?
        jnz   palet                ;
        ret                        ;
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 02.06.2016 в 21:46.
R71MT вне форума Ответить с цитированием
Старый 02.06.2016, 22:00   #5
Flour
 
Регистрация: 24.04.2016
Сообщений: 4
Хорошо

R71MT, отличная программа,а самое главное компактная) Спасибо вам огромное.
Единственное, все та же проблема с определением цвета в палитре. Как прописать координаты для считывания, если это не одна точка, а множество?

Метку для рисования линии оформила так
Код:
writeLine:
	mov bh,0 ; номер видеостраницы
	mov ah,0ch ; вывести точку на экран
	mov al,15 ; цвет точки
	int 10h
        jmp   waitSnub
Правда, если будет происходить считывание цвета, то он же, получается, все равно будет белым, так как после нажатия на левую кнопку происходит переход на рисование линии

А еще начало рисование у меня происходит не под курсором, а в стороне от него, как это можно исправить?

Последний раз редактировалось Flour; 02.06.2016 в 22:17.
Flour вне форума Ответить с цитированием
Старый 03.06.2016, 07:29   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Вот тебе готовый вариант..
Значение цвета обработчик сохраняет в переменной, а функция рисования считывает этот цвет с переменной "COLOR". Чтобы вычислить точную позицию начала линии, нужно координату(Х) разделить на 2. От координаты(Y) нужно отнять 1, чтоб сам курсор не затирал выводимую линию. Короче, разбирайся..
Код:
; fasm code..............
org 100h
jmp start

color   db    0          ;<--------; переменная с цветом

start:  mov   ax,13h               ; ставим режим 320х200/256
        int   10h                  ;
        push  es 0A000h            ; настроимся на видео/буфер
        pop   es                   ;
        call  CreatePalette        ; рисуем палитру

        xor   ax,ax                ; сброс мыши
        int   33h                  ;
        mov   ax,1                 ; покажем курсор
        int   33h                  ;
waitSnub:
        mov   ax,3                 ; ждём мышиный щелчок
        int   33h                  ;
        test  bx,001b              ; левая?
        jnz   writeLine            ; да - рисуем линию
        test  bx,010b              ; правая?
        jnz   getColor             ; да - выбираем цвет
        test  bx,100b              ; средняя?
        jnz   exit                 ; да - выход из программы
        jmp   waitSnub             ; мотаем, если нет щелчка

;------ Функция рисования линии! (щелчок возвращает координаты X/Y)
writeLine:                         ;
        shr   cx,1                 ; нужно разделить координату(Х) на 2
        dec   dx                   ; (Y)-1, чтоб курсор не затёр линию
        mov   bp,100               ; длина линии
        mov   ah,0ch               ;
        mov   al,[color]           ; передаём цвет линии
write:  int   10h                  ; выводим точку!
        inc   cx                   ; сл.позиция(Х)
        dec   bp                   ; мотаем BP-раз..
        jnz   write                ;
        push  0  0  0              ;
        pop   cx dx bx             ; сбрасываем регистры в нуль
        jmp   waitSnub             ;

;------ Функция читает/сохраняет цвет точки!
getColor:                          ;
        shr   cx,1                 ; принимаем координаты щелчка
        dec   dx                   ;
        xor   bx,bx                ; страница нуль
        mov   ah,0dh               ;
        int   10h                  ; читать точку!
        mov   [color],al           ; сохраняем значение цвета в переменной
        push  0  0  0              ;
        pop   cx dx bx             ; сбрасываем регистры в нуль
        jmp   waitSnub             ;

exit:   pop   es                   ;
        mov   ax,3                 ; возвращаем в/режим
        int   10h                  ;
        int   20h                  ; на выход!

;=================== П Р О Ц Е Д У Р Ы ==================================
;------------------------------------------------------------------------
CreatePalette:                     ; Создаём палитру цветов
        mov   dx,10                ; заполнять будем 10 строк
        mov   di,80                ; стартовая позиция в окне
palet:  push  di                   ;    ...запомним для следующей строки
        mov   bx,070fh             ; 7 цветов, начиная с белого (0fh)
        mov   cx,20                ; каждый цвет 20 pix в ширину
cycle:  push  cx                   ;    ..запомним
        mov   al,bl                ; AL - цвет точки
        rep   stosb                ; рисуем 20 пикселей в строке(1)
        pop   cx                   ; восстановим счётчик
        dec   bl                   ; меняем цвет,
        dec   bh                   ;    ..и счётчик цветов
        jnz   cycle                ; все цвета вывели? нет - мотаем..
        pop   di                   ;
        add   di,320               ; сл.строка!
        dec   dx                   ; 10 строк вывели?
        jnz   palet                ;
        ret                        ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.06.2016, 08:26   #7
Flour
 
Регистрация: 24.04.2016
Сообщений: 4
Хорошо

R71MT, спасибо вам огромное) Очень помогли, выручили, спасибо) Пойду разбираться, спасибо еще раз)
Flour вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисовалка в pictureBox Gennadiusisus Общие вопросы C/C++ 2 02.03.2015 19:52
Простая рисовалка Name1ess C# (си шарп) 7 19.11.2012 00:48
Интересная рисовалка rpy3uH Свободное общение 7 15.11.2012 08:56
TASM дело тонкое!:) (Где в TASM IDE?) 3.14oner Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 15.11.2011 16:20
Рисовалка на сайте П@вел HTML и CSS 2 03.04.2009 11:55