首页 > 汇编语言 > 汇编语言MS-Windows编程
阅读:1,437
汇编语言SetConsoleTextAttribute和WriteConsoleOutputAttribute函数:控制文本颜色
控制台窗口中的文本颜色有两种控制方法。
其中:
下图是程序输岀的快照,其中 1 到 20 号显示为图形字符。虽然印刷页面为灰度显示,但每个字符都是不同的颜色。
- 通过调用 SetConsoleTextAttribute 来改变当前文本颜色,这种方法会影响控制台中所有后续输出文本。
- 调用 WriteConsoleOutputAttribute 来设置指定单元格的属性。函数 GetConsoleScreenBufferlnfo 返回当前屏幕的颜色以及其他控制台信息。
1) SetConsoleTextAttribute 函数
函数 SetConsoleTextAttribute 可以设置控制台窗口所有后续输出文本的前景色和背景色。原型如下:
SetConsoleTextAttribute PROTO,
hConsoleOutput:HANDLE, ;控制台输出句柄
wAttributes : WORD ;颜色属性
2) WriteConsoleOutputAttribute 函数
函数 WriteConsoleOutputAttribute 从指定位置开始,向控制台屏幕缓冲区的连续单元格复制一组属性值。原型如下:
WriteConsoleOutputAttribute PROTO,
hConsoleOutput:DWORD, ;输出句柄
lpAttribute:PTR WORD, ;写属性
nLength:DWORD, ;单元格数
dwWriteCoord :COORD, ;第一个单元格坐标
lpNumberOfAttrsWritten:PTR DWORD ;输出计数
其中:
- lpAttribute 指向属性数组,其中每个字节的低字节都包含了颜色值;
- nLength 为数组长度;
- dwWriteCoord 为接收属性的开始屏幕单元格;
- lpNumberOfAttrsWritten 指向一个变量,其中保存的是已写单元格的数量。
3) 示例:写文本颜色
为了演示颜色和属性的用法,程序 WriteColors.asm 创建了一个字符数组和一个属性数组, 属性数组中的每个元素都对应一个字符。程序调用 WriteConsoleOutputAttribute 将属性复制到屏幕缓冲区,调用 WriteConsoleOutputCharacter 将字符复制到相同的屏幕缓冲区单元格:; 写文本颜色 (WriteColors.asm) INCLUDE Irvine32.inc .data outHandle HANDLE ? cellsWritten DWORD ? xyPos COORD <10,2> ; 字符编号数组 buffer BYTE 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 BYTE 16,17,18,19.20 BufSize DWORD ($ - buffer) ; 属性数组 attributes WORD 0Fh,0Eh,0Dh,0Ch,0Bh,0Ah,9,8,7,6 WORD 5,4,3,2,1,0F0h,0E0h,0D0h,0C0h,0B0h .code main PROC ; 获取控制台标准输出句柄 INVOKE GetStdHandle,STD_OUTPUT_HANDLE mov outHandle,eax ; 设置相邻单元格颜色 INVOKE WriteConsoleOutputAttribute, outHandle, ADDR attributes, BufSize, xyPos, ADDR cellsWritten ; 写 1 到 20 号字符 INVOKE WriteConsoleOutputCharacter, outHandle, ADDR buffer, BufSize, xyPos, ADDR cellsWritten INVOKE ExitProcess,0 main ENDP END main
下图是程序输岀的快照,其中 1 到 20 号显示为图形字符。虽然印刷页面为灰度显示,但每个字符都是不同的颜色。