我的C++DDA算法的程序出了错,望各位解决之。

我的C++DDA算法的程序出了错,望各位解决之。,第1张

你调用SetPixel是你自己的函数还是打算调用Windows API?

如果调用Windows API,要包含windowsh

另外Windows API SetPixel有四个参数,第一个参数是DC的句柄。后面三个如你这样子。

而且控制台程序也没有DC句柄,要选Win32工程,不过Win32工程的入口不是main而是WinMain。

我认为问题出在这里:

a = GetPixel(Picture1hdc, X, Y)

b = SetPixel(Mehdc, X, Y, a)

当你用一次循环,将这些点重设以后,再次来设置,就不会有什么变化了,我感觉应该加上一个恢复状态的语句。改变后,再恢复,然后再点才会有效果。

写一下简单的算法吧,

先提供一个简单的画点子程序:

;在屏幕显示一点或一像素子程序

;输入参数:

; BX = 行地址(0-479)

; SI = 列地址(0-639)

; DL = 颜色 (0-15)

; 640480显示模式

DOT proc near

push cx ;保存颜色

push dx

mov ax, 80 ;行地址

mul bx

mov di, ax ;保存行地址

mov ax, si ;计算列地址

mov dh, 8

div dh

mov cl, ah ;得到移位数值

mov ah, 0

add di, ax ;构成像素地址

mov al, 80h

shr al, cl ;计算相应位屏蔽寄存器中的位

push ax ;保存位屏蔽字

mov dx, 3ceh ;图形地址寄存器

mov al, 8 ;选择位屏蔽寄存器

out dx, al

mov dx, 3cfh ;位屏蔽寄存器

pop ax ;得到位屏蔽寄存器

out dx, al

mov dx, 3c4h ;顺序地址寄存器

mov al, 2 ;选择映象屏蔽寄存器

out dx, al

mov dx, 3c5h ;映象屏蔽寄存器

mov al, 0fh ;使所有位平面均有效

out dx, al

mov al, es:[di] ;先读

mov byte ptr es:[di], 0 ;清除原有颜色

pop ax ;从栈中恢复颜色

push ax

out dx, al

mov byte ptr es:[di], 0ffh ;写内存

pop dx ;返回

pop cx

ret

DOT endp

到时可以用MACRO来调用,比如:

SetPixel MACRO x, y, color

mov bx, x

mov si, y

mov dl, color

call DOT

ENDM

调用时用 SetPixel x, y, color就可以了,color值为0-15

当然如果你用API的话,就更简单了, 直接invoke SetPixel x, y, color就可以了

这里提供的是对显存和内存 *** 作的SetPixel

在主程序中要先做下列初始化:

mov ax, 0a000h ;显存地址

mov es, ax

cld ;递增

mov ax, 12h ;设置显示模式为12h

int 10h ;清屏

以上就是关于我的C++DDA算法的程序出了错,望各位解决之。全部的内容,包括:我的C++DDA算法的程序出了错,望各位解决之。、vb中用getpixel和setpixel(作业要求)编百叶窗时,点第一次有效果,再点第二次或其他都没变化,求改正!、汇编图像模式(如12h)下如何直接 *** 作显存在屏幕上显示我想要的图像(如一个点,或一个汉字)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10078765.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存