文本颜色设置c语言,汇编语言SetConsoleTextAttribute和WriteConsoleOutputAttribute函数:控制文本颜色...

控制台窗口中的文本颜色有两种控制方法。

通过调用 SetConsoleTextAttribute 来改变当前文本颜色,这种方法会影响控制台中所有后续输出文本。

调用 WriteConsoleOutputAttribute 来设置指定单元格的属性。函数 GetConsoleScreenBufferlnfo 返回当前屏幕的颜色以及其他控制台信息。

1) SetConsoleTextAttribute 函数

函数 SetConsoleTextAttribute 可以设置控制台窗口所有后续输出文本的前景色和背景色。原型如下:

SetConsoleTextAttribute PROTO,

hConsoleOutput:HANDLE,           ;控制台输出句柄

wAttributes : WORD                     ;颜色属性

颜色值保存在 wAttributes 参数的低字节中。

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 号显示为图形字符。虽然印刷页面为灰度显示,但每个字符都是不同的颜色。

8abfad409b8c7332a7db98a29014902a.gif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值