00. 目錄
目錄
01. FillConsoleOutputAttribute函數
設置指定數量的字符單元格的字符屬性,從屏幕緩沖區中的指定坐標開始。
函數聲明:
設置指定數量的字符單元格的字符屬性BOOL WINAPI FillConsoleOutputAttribute(
_In_ HANDLE hConsoleOutput,
_In_ WORD wAttribute,
_In_ DWORD nLength,
_In_ COORD dwWriteCoord,
_Out_ LPDWORD lpNumberOfAttrsWritten
);
功能:
設置指定數量的字符單元格的字符屬性
參數:
hConsoleOutput 控制台屏幕緩沖區的句柄。句柄必須具有GENERIC_WRITE訪問權限。
wAttribute 寫入控制台屏幕緩沖區時要使用的屬性。
nLength 要設置為指定顏色屬性的字符單元格數。
dwWriteCoord 指定字符坐標的開始位置
lpNumberOfAttrsWritten 指向變量的指針,該變量接收實際設置了屬性的字符單元格數。
返回值:
如果函數成功,則返回值為非零值。
如果函數失敗,則返回值為零。要獲取擴展錯誤信息,請調用GetLastError。
參考程序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#define N 255
int main()
{
int i = 0;
int len = 0;
char *str = "黑馬程序員";
//定義句柄類型的變量
HANDLE hOut = NULL;
//窗口信息結構體
CONSOLE_SCREEN_BUFFER_INFO screenInfo;
//開始位置
COORD posShadow;
//獲取標准輸出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//獲取窗口信息結構體
GetConsoleScreenBufferInfo(hOut, &screenInfo);
//長度
len = strlen(str) + 1;
posShadow.X = 8;
posShadow.Y = 8;
//BACKGROUND_INTENSITY 灰色屬性
FillConsoleOutputAttribute(hOut, BACKGROUND_INTENSITY, len + 4, posShadow, NULL);
getchar();
//關閉句柄
CloseHandle(hOut);
system("pause");
return 0;
}
執行效果
第8行第8列開始顯示 長度為len + 4 屬性為灰色
官方參考手冊:https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputattribute
02. FillConsoleOutputCharacter函數
從指定的坐標開始,將一個字符按照指定的次數寫入控制台屏幕緩沖區。
函數聲明:
BOOL WINAPI FillConsoleOutputCharacter(
_In_ HANDLE hConsoleOutput,
_In_ TCHAR cCharacter,
_In_ DWORD nLength,
_In_ COORD dwWriteCoord,
_Out_ LPDWORD lpNumberOfCharsWritten
);
功能:
填充指定次數的字符
參數:
hConsoleOutput 控制台屏幕緩沖區的句柄。句柄必須具有GENERIC_WRITE訪問權限。
cCharacter 要寫入控制台屏幕緩沖區的字符。
nLength 應寫入字符的字符單元格數。
dwWriteCoord 指定字符坐標到的字符是要被寫入的開始位置。
lpNumberOfCharsWritten 指向變量的指針,該變量接收實際寫入控制台屏幕緩沖區的字符數。
返回值:
如果函數成功,則返回值為非零值。
如果函數失敗,則返回值為零。要獲取擴展錯誤信息,請調用GetLastError。
參考程序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#define N 255
int main()
{
int i = 0;
int len = 0;
char *str = "黑馬程序員";
//定義句柄類型的變量
HANDLE hOut = NULL;
//窗口信息結構體
CONSOLE_SCREEN_BUFFER_INFO screenInfo;
//開始位置
COORD posShadow;
//獲取標准輸出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//獲取窗口信息結構體
GetConsoleScreenBufferInfo(hOut, &screenInfo);
//開始位置
COORD pos = {0, 0};
//填充指定數字的字符
FillConsoleOutputCharacter(hOut, 'B', screenInfo.dwSize.X * 4, pos, NULL);
getchar();
//關閉句柄
CloseHandle(hOut);
system("pause");
return 0;
}
執行結果:
填充四行
官方參考手冊: https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputcharacter
03. WriteConsoleOutputCharacter函數
從指定位置開始,將多個字符復制到控制台屏幕緩沖區的連續單元格。
函數聲明:
BOOL WINAPI WriteConsoleOutputCharacter(
_In_ HANDLE hConsoleOutput,
_In_ LPCTSTR lpCharacter,
_In_ DWORD nLength,
_In_ COORD dwWriteCoord,
_Out_ LPDWORD lpNumberOfCharsWritten
);
功能:
從指定位置開始,將多個字符復制到控制台屏幕緩沖區的連續單元格。
參數:
hConsoleOutput 控制台屏幕緩沖區的句柄。句柄必須具有GENERIC_WRITE訪問權限。
lpCharacter 要寫入控制台屏幕緩沖區的字符串。
nLength 要寫入的字符數。
dwWriteCoord 起始位置
lpNumberOfCharsWritten 指向接收實際寫入的字符數的變量的指針。
返回值:
如果函數成功,則返回值為非零值。
如果函數失敗,則返回值為零。要獲取擴展錯誤信息,請調用GetLastError。
參考程序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#define N 255
int main()
{
int i = 0;
int len = 0;
char *str = "a";
//定義句柄類型的變量
HANDLE hOut = NULL;
//窗口信息結構體
CONSOLE_SCREEN_BUFFER_INFO screenInfo;
//開始位置
COORD posShadow;
//獲取標准輸出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//獲取窗口信息結構體
GetConsoleScreenBufferInfo(hOut, &screenInfo);
//開始位置
COORD pos = {0, 0};
//填充指定數字的字符
len = strlen(str);
WriteConsoleOutputCharacter(hOut, str, len, pos, NULL);
getchar();
//關閉句柄
CloseHandle(hOut);
system("pause");
return 0;
}
執行結果:
官方參考手冊:https://docs.microsoft.com/en-us/windows/console/writeconsoleoutputcharacter
04. 綜合實例
參考程序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#include <conio.h>
int main()
{
//定義輸出信息
char *str = "Hello World!";
int i;
int len = strlen(str);
//陰影屬性
WORD shadow = BACKGROUND_INTENSITY;
//文本屬性
WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY;
//獲得標准輸出設備句柄
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//定義窗口緩沖區信息結構體
CONSOLE_SCREEN_BUFFER_INFO screenInfo;
//獲得窗口緩沖區信息
GetConsoleScreenBufferInfo(hOut, &screenInfo);
//定義一個文本框輸出區域
SMALL_RECT rc;
//定義文本框的起始坐標
COORD posText;
//定義陰影框的起始坐標
COORD posShadow;
//確定區域的邊界
rc.Top = 8; //上邊界
rc.Bottom = rc.Top + 4; //下邊界
rc.Left = (screenInfo.dwSize.X - len) / 2 - 2; //左邊界,為了讓輸出的字符串居中
rc.Right = rc.Left + len + 4; //右邊界
//確定文本框起始坐標
posText.X = rc.Left;
posText.Y = rc.Top;
//確定陰影框的起始坐標
posShadow.X = posText.X + 1;
posShadow.Y = posText.Y + 1;
for (i = 0; i < 5; ++i) //先輸出陰影框
{
FillConsoleOutputAttribute(hOut, shadow, len + 4, posShadow, NULL);
posShadow.Y++;
}
for (i = 0; i < 5; ++i) //在輸出文本框,其中與陰影框重合的部分會被覆蓋掉
{
FillConsoleOutputAttribute(hOut, text, len + 4, posText, NULL);
posText.Y++;
}
//設置文本輸出處的坐標
posText.X = rc.Left + 2;
posText.Y = rc.Top + 2;
WriteConsoleOutputCharacter(hOut, str, len, posText, NULL); //輸出字符串
getchar();
SetConsoleTextAttribute(hOut, screenInfo.wAttributes); // 恢復原來的屬性
CloseHandle(hOut);
system("pause");
return 0;
}