回 帖 发 新 帖 刷新版面

主题:[原创]小程序,图画板

鼠标按住画线条,“T”是退出,左侧方块里选颜色,因为鼠标指针没弄出来,所以画了一横一竖两个红线就算是座标吧(但是不清楚,哎)
DECLARE SUB showpix ()
DECLARE SUB getclor ()
DECLARE SUB clorbox ()
DECLARE SUB getmouse ()
DIM SHARED asmprog(0 TO 27)
DEFINT A-Z
COMMON SHARED x, y, z, duanaddr, offset, clor
SCREEN 12
clor = 2
DATA &h55,&h89,&he5,&hb8
DATA &h03,&h00,&hcd,&h33,&h53,&h8b
DATA &h5e,&h06,&h89,&h0f,&h8b,&h5e,&h08
DATA &h89,&h17,&h8b
DATA &h5e,&h0a,&h5a,&h89,&H17
DATA &h5d,&hca,&h02
RESTORE
duanaddr = VARSEG(asmprog(0))
offset = VARPTR(asmprog(0))
DEF SEG = duanaddr
FOR i = 0 TO 27
READ j
POKE (offset + i), j
NEXT i
DEF SEG
CALL clorbox
DO
CALL getmouse
CALL showpix
CALL getclor
LOOP UNTIL INKEY$ = "t"
END

SUB clorbox
FOR B = 1 TO 2
FOR a = 1 TO 8
LINE (B * 30 + 10, a * 30 + 50)-(B * 30 + 30, a * 30 + 70), a * B - 1, BF
NEXT a
NEXT B
LINE (40, 80)-(90, 310), 2, B
END SUB

SUB getclor
IF y > 40 AND y < 60 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 0
ELSEIF y > 40 AND y < 60 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 1
ELSEIF y > 40 AND y < 60 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 2
ELSEIF y > 40 AND y < 60 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 3
ELSEIF y > 40 AND y < 60 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 4
ELSEIF y > 40 AND y < 60 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 5
ELSEIF y > 40 AND y < 60 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 6
ELSEIF y > 40 AND y < 60 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 7
ELSEIF y > 70 AND y < 90 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 8
ELSEIF y > 70 AND y < 90 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 9
ELSEIF y > 70 AND y < 90 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 10
ELSEIF y > 70 AND y < 90 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 11
ELSEIF y > 70 AND y < 90 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 12
ELSEIF y > 70 AND y < 90 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 13
ELSEIF y > 70 AND y < 90 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 14
ELSEIF y > 70 AND y < 90 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 15
END IF
END SUB

SUB getmouse
DEF SEG = duanaddr
LINE (y, 0)-(y, 35), 0
LINE (100, x)-(140, x), 0
CALL absolute(z, x, y, offset)
LOCATE 1, 1
PRINT z; x; y
END SUB

SUB showpix
IF z = 1 THEN
LINE (y, x)-(y + 3, x + 3), clor, BF
END IF
LINE (y, 0)-(y, 35), 12
LINE (100, x)-(140, x), 12
END SUB
有些地方还是不太明白,所以做的不好,大家千万不要笑话啊,权当是抛砖引玉吧

回复列表 (共6个回复)

沙发

DECLARE SUB showpix ()
DECLARE SUB getclor ()
DECLARE SUB clorbox ()
DECLARE SUB getmouse ()
DIM SHARED asmprog(0 TO 27)
DEFINT A-Z
COMMON SHARED x, y, z, duanaddr, offset, clor
SCREEN 12
clor = 2
DATA &h55,&h89,&he5,&hb8
DATA &h03,&h00,&hcd,&h33,&h53,&h8b
DATA &h5e,&h06,&h89,&h0f,&h8b,&h5e,&h08
DATA &h89,&h17,&h8b
DATA &h5e,&h0a,&h5a,&h89,&H17
DATA &h5d,&hca,&h02
RESTORE
duanaddr = VARSEG(asmprog(0))
offset = VARPTR(asmprog(0))
DEF SEG = duanaddr
FOR i = 0 TO 27
READ j
POKE (offset + i), j
NEXT i
DEF SEG
CALL clorbox
DO
CALL getmouse
CALL showpix
CALL getclor
LOOP UNTIL INKEY$ = "t"
END

SUB clorbox
FOR B = 1 TO 2
FOR a = 1 TO 8
LINE (B * 30 + 10, a * 30 + 50)-(B * 30 + 30, a * 30 + 70), a * B - 1, BF
NEXT a
NEXT B
LINE (40, 80)-(90, 310), 2, B
END SUB

SUB getclor
IF y > 40 AND y < 60 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 0
ELSEIF y > 40 AND y < 60 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 1
ELSEIF y > 40 AND y < 60 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 2
ELSEIF y > 40 AND y < 60 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 3
ELSEIF y > 40 AND y < 60 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 4
ELSEIF y > 40 AND y < 60 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 5
ELSEIF y > 40 AND y < 60 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 6
ELSEIF y > 40 AND y < 60 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 7
ELSEIF y > 70 AND y < 90 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 8
ELSEIF y > 70 AND y < 90 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 9
ELSEIF y > 70 AND y < 90 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 10
ELSEIF y > 70 AND y < 90 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 11
ELSEIF y > 70 AND y < 90 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 12
ELSEIF y > 70 AND y < 90 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 13
ELSEIF y > 70 AND y < 90 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 14
ELSEIF y > 70 AND y < 90 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 15
END IF
END SUB

SUB getmouse
DEF SEG = duanaddr
LINE (y, 0)-(y, 35), 0
LINE (100, x)-(140, x), 0
CALL absolute(z, x, y, offset)
LOCATE 1, 1
PRINT z; x; y
END SUB

SUB showpix
IF z = 1 THEN
LINE (y, x)-(y + 3, x + 3), clor, BF
END IF
LINE (y, 0)-(y, 35), 12
LINE (100, x)-(140, x), 12
FOR j = 1 TO 10000
NEXT j
END SUB
加了个延时,红线能更清楚点

板凳

加点注解吧
程序开始的一大堆data是啥作用的?

3 楼

DECLARE SUB showpix ()'画点
DECLARE SUB getclor ()'取颜色
DECLARE SUB clorbox ()'颜色框
DECLARE SUB getmouse ()'取鼠标坐标
DIM SHARED asmprog(0 TO 27)'定义一个数组来存放机器码
DEFINT A-Z'A-Z为整数
COMMON SHARED x, y, z, duanaddr, offset, clor'全局变量
SCREEN 12
clor = 2'初始化颜色
'DATA部分为机器码调用鼠标,汇编源代码在最后给出
DATA &h55,&h89,&he5,&hb8
DATA &h03,&h00,&hcd,&h33,&h53,&h8b
DATA &h5e,&h06,&h89,&h0f,&h8b,&h5e,&h08
DATA &h89,&h17,&h8b
DATA &h5e,&h0a,&h5a,&h89,&H17
DATA &h5d,&hca,&h02
RESTORE'计数指针指向第一个机器码
duanaddr = VARSEG(asmprog(0))'汇编段地址为存放机器码的数组的段地址,把它存入duanaddr这个变量中
offset = VARPTR(asmprog(0))'偏移地址为数组第一个元素,也就是机器码开始时的地址,CALL ABSOLUTE就是从这里执行机器码,即存放机器码的数组段地址:数组偏移地址,把偏移地址存入offset这个变量中
DEF SEG = duanaddr'数据段切换到机器码段
FOR i = 0 TO 27'这个FOR循环把用DATA定义的机器码用POKE指令放到,数组元素的地址中,CALL ABSOLUTE就执行这些地址中的机器码
READ j
POKE (offset + i), j
NEXT i
DEF SEG'恢复QB的数据段
CALL clorbox
DO
CALL getmouse
CALL showpix
CALL getclor
LOOP UNTIL INKEY$ = "t"
END

SUB clorbox
FOR B = 1 TO 2
FOR a = 1 TO 8
LINE (B * 30 + 10, a * 30 + 50)-(B * 30 + 30, a * 30 + 70), a * B - 1, BF
NEXT a
NEXT B
LINE (40, 80)-(90, 310), 2, B
END SUB

SUB getclor
IF y > 40 AND y < 60 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 0
ELSEIF y > 40 AND y < 60 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 1
ELSEIF y > 40 AND y < 60 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 2
ELSEIF y > 40 AND y < 60 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 3
ELSEIF y > 40 AND y < 60 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 4
ELSEIF y > 40 AND y < 60 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 5
ELSEIF y > 40 AND y < 60 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 6
ELSEIF y > 40 AND y < 60 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 7
ELSEIF y > 70 AND y < 90 AND x > 80 AND x < 100 AND z = 1 THEN
clor = 8
ELSEIF y > 70 AND y < 90 AND x > 110 AND x < 130 AND z = 1 THEN
clor = 9
ELSEIF y > 70 AND y < 90 AND x > 140 AND x < 160 AND z = 1 THEN
clor = 10
ELSEIF y > 70 AND y < 90 AND x > 170 AND x < 190 AND z = 1 THEN
clor = 11
ELSEIF y > 70 AND y < 90 AND x > 200 AND x < 220 AND z = 1 THEN
clor = 12
ELSEIF y > 70 AND y < 90 AND x > 230 AND x < 250 AND z = 1 THEN
clor = 13
ELSEIF y > 70 AND y < 90 AND x > 260 AND x < 280 AND z = 1 THEN
clor = 14
ELSEIF y > 70 AND y < 90 AND x > 290 AND x < 310 AND z = 1 THEN
clor = 15
END IF
END SUB

SUB getmouse
DEF SEG = duanaddr'刚才数据段恢复为QB的数据段,现在要执行机器码,所以把数据段指向机器码段
LINE (y, 0)-(y, 35), 0
LINE (100, x)-(140, x), 0'本句不应该出现在这里,它是抹去红线的作用
CALL absolute(z, x, y, offset)'z,x,y是我们定义存放返回值的变量,z判断鼠标是否按下,x返回鼠标纵坐标,y返回鼠标横坐标,当Z为1时鼠标是按下状态
LOCATE 1, 1
PRINT z; x; y
END SUB

SUB showpix
IF z = 1 THEN
LINE (y, x)-(y + 3, x + 3), clor, BF
END IF
LINE (y, 0)-(y, 35), 12
LINE (100, x)-(140, x), 12
FOR j = 1 TO 10000
NEXT j
END SUB
以下为机器码的源代码:
DATA &h55                    PUSH BP
DATA &h89,&he5               MOV BP,SP
DATA &hb8,&h03,&h00          MOV AX,0003
DATA &hcd,&h33               INT 33(鼠标调用中断)
DATA &h53                    PUSH BX(BX此时存放着中断返回的鼠标信息,一会还要用到BX寻址,所以现在把BX入栈保存起来
DATA &h8b,&h5e,&h06          MOV BX,[BP+6](在QB调用汇编的参数传递提到过)
DATA &h89,&h0f               MOV [BX],CX(调用完中断后CX里存放的是当时鼠标的纵坐标,把它放到我们定义的变量的地址中
DATA &h8b,&h5e,&h08          MOV BX,[BP+8]
DATA &h89,&h17               MOV [BX],DX
DATA &h8b,&h5e,&h0a          MOV BX,[BP+A]
DATA &h5a                    POP DX(刚才把BX入栈,现在用POP DX,刚才BX中的内容就保存到现在的DX里了,因为一会寻址要用到BX,所以只能把BX的内容放到DX里
DATA &h89,&H17               MOV [BX],DX
DATA &h5d                    POP BP(刚才把BP入栈,现在把BP出栈)
DATA &hca,&h02               RET 2(返回主程序)

4 楼

我写了个和你差不多的程序..功能有点相识

不过我不是画图..用的是鼠标...键盘太慢了.
我做的是个简单的地图编辑器..我些了个45角度的小游戏.需要个地图编辑器
呵..你说是不是差不多.

5 楼

大佬,我现不用汇编了,直接CALL INTERRUPT了,这个程序写的一点不好,没有鼠标,还麻烦,不稳定,不能生成EXE,有机会咱们写个小的即时战略游戏如何,我现在对QB对图片的操作也有点心得了,哈哈

6 楼

[quote]大佬,我现不用汇编了,直接CALL INTERRUPT了,这个程序写的一点不好,没有鼠标,还麻烦,不稳定,不能生成EXE,有机会咱们写个小的即时战略游戏如何,我现在对QB对图片的操作也有点心得了,哈哈[/quote]
冷石_jasv已经写出来了。你可以看看,《轰炸东京》
http://upload.programfan.com/upfile/200701151431633.rar[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册