【C語言】控制台窗口圖形界面編程(四):文本輸出


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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM