رسم پیکسل با ماوس در اسمبلی؟

hamed.rafiee

New Member
با سلام من نمی دونستم که کجا و از کی و چطوری این مشکلم سوال کنم.اگه اینجا نباید مینوشتم خرده نگیرین لطفا.
می خوام با ماوس تو اسمبلی وقتی کلیک سمت چپ پایینه نطقه(پیکسل) چاپ کنم یه مشکل دارم : وقتی کلیک و می گیرم و ماوس سزیع می برم خط پیوسته رسم نمی کنه و چندتا نقطه جدا میذاره.باید خیلی خیلی آروم ماوس حرکت بدم لطفا کمک کنید.با تشکر
 

the_king

مدیرکل انجمن
با سلام من نمی دونستم که کجا و از کی و چطوری این مشکلم سوال کنم.اگه اینجا نباید مینوشتم خرده نگیرین لطفا.
می خوام با ماوس تو اسمبلی وقتی کلیک سمت چپ پایینه نطقه(پیکسل) چاپ کنم یه مشکل دارم : وقتی کلیک و می گیرم و ماوس سزیع می برم خط پیوسته رسم نمی کنه و چندتا نقطه جدا میذاره.باید خیلی خیلی آروم ماوس حرکت بدم لطفا کمک کنید.با تشکر

باید بجای اینکه نقطه رسم کنید خط رسم کنید، مختصات موقعیت قبلی ماوس رو جایی ذخیره کنید و وقتی ماوس
روی نقطه جدیدی رفت یک خط بین موقعیت قبلی و جدید رسم کنید و مجددا موقعیت جدید ماوس رو برای تکرار بعدی
ذخیره کنید.
 

hamed.rafiee

New Member
سلام خب ممکنه بخواهیم با ماوس منحنی یا خط شکسته بکشه مشکل سر خط نیست مشکل اینکه وقی کلیک پایین باید ماوس هر جا میبری نطق بکشه ولی وقتی ماوس تند حرکت میده علی رغم پایین بودن دکمه نطه همه جا رسم نمیشه اگه میشه کمکم کنید با تشکر
 

the_king

مدیرکل انجمن
سلام خب ممکنه بخواهیم با ماوس منحنی یا خط شکسته بکشه مشکل سر خط نیست مشکل اینکه وقی کلیک پایین باید ماوس هر جا میبری نطق بکشه ولی وقتی ماوس تند حرکت میده علی رغم پایین بودن دکمه نطه همه جا رسم نمیشه اگه میشه کمکم کنید با تشکر

منظورم رو درست متوجه نشدید، این کاری که می گم در برنامه های گرافیکی انجام میشه چون هر چقدر هم که
سرعت پردازش برنامه تون بالا باشه باز هم کاربر می تونه در فاصله بین پردازش های شما ماوس رو بیش از یک
پیکسل جابجا کنه.

attachment.php


با کلید ESC از برنامه خارج می شوید :
کد:
.MODEL	SMALL
.DATA
	prevx	DW 320
	prevy	DW 240
	prevbt	DW 0
	newx	DW 320
	newy	DW 240
	posx	DW 0
	posy	DW 0
	newbt	DW 0
	stepx	DW 0
	stepy	DW 0
	diffx	DW 0
	diffy	DW 0
	errv	DW 0

.CODE
	.STARTUP
	MOV	AH, 00h
	MOV	AL, 12h
	INT	10h
	MOV	AX, 00h
	INT	33h
	CMP	AX, 00h
	JE	go_exit
	MOV	AX, 01h
	INT	33h
	MOV	AX, 04h
	MOV	CX, prevx
	MOV	DX, prevy
	INT	33h
loop_1:
	IN	AL, 60h
	CMP	AL, 1
	JE	go_exit
	MOV	AX, 03h
	INT	33h
	MOV	newbt, BX
	MOV	newx, CX
	MOV	newy, DX
	CMP	BX, 0
	JE	go_save
	CMP	prevbt, 0
	JE	go_point
	CMP	prevx, CX
	JNE	go_draw
	CMP	prevy, DX
	JE	go_save
	JMP	go_draw
go_point:
	MOV	AX, 02h
	INT	33h
	MOV	AH, 0Ch
	MOV	AL, 0Fh
	MOV	BH, 00h
	MOV	CX, newx
	MOV	DX, newy
	INT	10h
	MOV	AX, 01h
	INT	33h
	JMP	go_save	
go_draw:
	MOV	AX, prevbt
	CMP	AX, 0
	JE	go_save
	MOV	AX, 02h
	INT	33h
	CALL	drawline
	MOV	AX, 01h
	INT	33h
go_save:
	MOV	BX, newbt
	MOV	prevbt, BX
	MOV	CX, newx
	MOV	prevx, CX
	MOV	DX, newy
	MOV	prevy, DX
	JMP	loop_1
go_exit:
	MOV	AH, 00h
	MOV	AL, 03h
	INT	10h
	.EXIT
drawline:
	MOV	AX, newx
	SUB	AX, prevx
	MOV	stepx, 1
	CMP	AX, 0
	JGE	next_1
	MOV	stepx, -1
	NEG	AX
next_1:
	MOV	diffx, AX
	MOV	AX, newy
	SUB	AX, prevy
	MOV	stepy, 1
	CMP	AX, 0
	JGE	next_2
	MOV	stepy, -1
	NEG	AX
next_2:
	MOV	diffy, AX
	MOV	AX, diffx
	SUB	AX, diffy
	MOV	errv, AX
	MOV	AX, prevx
	MOV	posx, AX
	MOV	AX, prevy
	MOV	posy, AX
loop_2:
	MOV	AH, 0Ch
	MOV	AL, 0Fh
	MOV	BH, 00h
	MOV	CX, posx
	MOV	DX, posy
	PUSH	CX
	PUSH	DX	
	INT	10h
	POP	DX
	POP	CX
	CMP	CX, newx
	JNE	next_3
	CMP	DX, newy
	JE	go_return
next_3:
	MOV	DX, errv
	ADD	DX, DX
	MOV	BX, diffy
	NEG	BX
	CMP	DX, BX
	JLE	next_4
	MOV	AX, diffy
	SUB	errv, AX
	MOV	AX, stepx
	ADD	posx, AX
next_4:
	MOV	BX, diffx
	CMP	DX, BX
	JGE	loop_2
	MOV	AX, diffx
	ADD	errv, AX
	MOV	AX, stepy
	ADD	posy, AX
	JMP	loop_2	
go_return:
	RET
.STACK
END
کد برنامه به همراه فایل اجرایی exe ضمیمه این پست می باشد، برای اجرا کردنش به محیط DOS یا ابزار DOSBox
نیازمند هستید :
DRAW.zip
 

پیوست ها

  • DRAW.zip
    1.1 کیلوبایت · بازدیدها: 22
  • Draw.gif
    Draw.gif
    2.9 کیلوبایت · بازدیدها: 31

hamed.rafiee

New Member
بازم سلام و معذرت که بازم میپرسم من خودم برنامه رو نوشتم برنامه ای که بهم دادین توی emu اجرا نشد سورس برنامم میزارم اگر زحمتی نیست یه نگاه بهش بندازین و مشکل : وقتی ماوس تند حرکت میدم و کلیک چپم پایینه به جای خط نقاط منفصل میکشه. اگه امکانش هست برام توضیح بدین ممنون

; multi-segment executable file template.

data segment
; add your data here!
pkey db "press any key...$"
vasatkey db "press any key vasatkey ...$"
chapkey db "press any chapkey ...$"
rastkey db "press any rastkey...$"

ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;/// go to graphic mode
mov ah,0
mov al,12h
mov bh,0
int 10h
;//set mouse
mov bx,0
mov ax, 0
int 33h
cmp ax, 0
;//display mouse cursor:
mov ax,1
int 33h
a:
;; get the mouse possition
mov ax,3
int 33h
cmp bx,1 ;;/// check if left mouse click is down ?
jne k2
;;;
shr cx,1 ;;/// for puting pixle in exact possition of mouse cursor
;/// put pixle
mov ah,0ch
mov al,3
mov bh,0
int 10h
jmp a

k2:
cmp bx,2
jne k4
lea dx, rastkey
mov ah, 9
int 21h
jmp a
k4:
cmp bx,4
jne a
lea dx, vasatkey
mov ah, 9
int 21h
jmp a
jmp a



; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.
 

the_king

مدیرکل انجمن
بازم سلام و معذرت که بازم میپرسم من خودم برنامه رو نوشتم برنامه ای که بهم دادین توی emu اجرا نشد سورس برنامم میزارم اگر زحمتی نیست یه نگاه بهش بندازین و مشکل : وقتی ماوس تند حرکت میدم و کلیک چپم پایینه به جای خط نقاط منفصل میکشه. اگه امکانش هست برام توضیح بدین ممنون
دو اشکال عمده در کد تون وجود داره، اول اینکه اصلا خط رسم نمی کنین، نقطه رسم می کنین. همانطور که قبلا
اشاره کردم هر چقدر هم که کدتون سریع باشه کاربر همیشه می تونه ماوس رو بیش از یک پیکسل جابجا کنه،
اگر شما فقط یک نقطه رسم کنین ترسیم روی یک خط پیوسته نمیشه.

اشکال دوم مربوط به تداخل با شیوه ترسیم ماوسه.
موقعی که ماوس رو جابجا می کنین، وقفه ماوس اول رنگ نقاطی که ماوس رویشان را خواهد پوشاند
رو جایی در حافظه ثبت می کنه و بعد ماوس رو رسم می کنه، موقعی که ماوس جابجا شد قبل از ترسیم مجدد ماوس
رنگ قبلی اون نقاط که جای قبلی ماوس بوده رو مجددا از حافظه بازیابی می کنه. اگر وقفه اینکار رو انجام نمی داد
جای ماوس روی صفحه می موند.

حالا شما در فاصله بین ترسیم ماوس دارید نقطه رسم می کنید، از اون جایی که وقفه ماوس از این ترسیم شما
اطلاعی نداره با جابجا کردن ماوس رنگ قبلی اون نقطه رو روی ترسیم شما قرار میده، یعنی نقطه ای که شما
رسم کردید رو پاک می کنه. برای همین همیشه قبل از رسم کردن نقطه یا خط ماوس رو موقتا پنهان کنید و وقتی
ترسیم تون تموم شد مجددا ماوس رو آشکار کنید.
 

جدیدترین ارسال ها

بالا