控制台窗口中的文本颜色有两种控制方法。
函数 SetConsoleTextAttribute 可以设置控制台窗口所有后续输出文本的前景色和背景色。原型如下:
颜色值保存在 wAttributes 参数的低字节中。
函数 WriteConsoleOutputAttribute 从指定位置开始,向控制台屏幕缓冲区的连续单元格复制一组属性值。原型如下:
其中:
为了演示颜色和属性的用法,程序 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 号显示为图形字符。虽然印刷页面为灰度显示,但每个字符都是不同的颜色。