
你调用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
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)下如何直接 *** 作显存在屏幕上显示我想要的图像(如一个点,或一个汉字)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)