本人知道改变控制台颜色的是SetConsoleTextAttribute函数,但是这个是改变从这个代码开始之后的全部颜色。
那么本人该怎么样做才能使两个不断改变位置的点的颜色不一样呢?
下面是本人本人写的代码,本人不知道该怎么样添加SetConsoleTextAttribute函数,使一个点显示红色另一个点显示其他颜色(例如绿色)
那么本人该怎么样做才能使两个不断改变位置的点的颜色不一样呢?
下面是本人本人写的代码,本人不知道该怎么样添加SetConsoleTextAttribute函数,使一个点显示红色另一个点显示其他颜色(例如绿色)
#include<stdio.h> #include<windows.h> #include<process.h> #define T 10 void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };//后面为0,则表示看不见光标 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void gotoxy(int x, int y) { COORD c; c.X = x; c.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); } void createaball() { int a = 2, b = 0, x = 0, y = 0; printf("%s\n", "X");//貌似不能输入黑色方块,所以用X代替了,黑色方块是ALT+41462 Sleep(T); system("cls");//清屏函数指令 loop: for (b = 1; b <= 56; b++) { if (b <28) { y = b; } else //相当于Y方向的折回 y = 56 - b; if (a == 236) //清零计数器a { a = 0; } if (a < 118) { x = a; } else //相当于X方向的折回 x = 236 - a; gotoxy(x, y); printf("%s\n", "X");//貌似不能输入黑色方块,所以用X代替了,黑色方块是ALT+41462 Sleep(T); system("cls");//清屏函数指令 a = a + 2; } goto loop; } void f1(void* p) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); // 获取控制台句柄 SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED); createaball(); } void f2(void* p) { Sleep(5000); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); // 获取控制台句柄 SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); createaball(); } int main() { SetConsoleTitle(L"printf()动画"); HideCursor(); _beginthread(f1, 0, 0); _beginthread(f2, 0, 0); HANDLE hEvent; hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); WaitForSingleObject(hEvent, INFINITE); }
解决方案
30
#include "stdafx.h" #include "colorConsole.h" /* HANDLE initiate() { HANDLE hOutput; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); return hOutput; } */ BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString) { DWORD cWritten; BOOL fSuccess; COORD coord; coord.X = x; // 输出第一个字符所在的列即X坐标 coord.Y = y; // 所在的行即Y坐标 fSuccess = WriteConsoleOutputCharacter( //输出字符串 hOutput, // 屏幕缓冲区的句柄 lpszString, // 指向字符串的指针 lstrlen(lpszString), // 字符串长度 coord, // 输出第一个字符的坐标 &cWritten); // 实际输出字符的个数 if (! fSuccess) cout<<"error:WriteConsoleOutputCharacter"<<endl; for (;fSuccess && coord.X < lstrlenA((LPCSTR)lpszString)+x; coord.X += nColors) { fSuccess = WriteConsoleOutputAttribute( //为已输出的字符串上色 hOutput, // 屏幕缓冲区的句柄 wColors, // 颜色数组 nColors, // 颜色数目 coord, // 输出第一个字符的坐标 &cWritten); // 实际输出字符的个数 } if (! fSuccess) cout<<"error:WriteConsoleOutputAttribute"<<endl; return 0; }
10
仅供参考:
// processor: x86 #include <windows.h> #include <process.h> /* _beginthread, _endthread */ #include <stddef.h> #include <stdlib.h> #include <conio.h> void Bounce( void *ch ); void CheckKey( void *dummy ); /* GetRandom returns a random integer between min and max. */ #define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min)) BOOL repeat = TRUE; /* Global repeat flag and video variable */ HANDLE hStdOut; /* Handle for console window */ CONSOLE_SCREEN_BUFFER_INFO csbi; /* Console information structure */ int main() { CHAR ch = "A"; hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); /* Get display screen"s text row and column information. */ GetConsoleScreenBufferInfo( hStdOut, &csbi ); /* Launch CheckKey thread to check for terminating keystroke. */ _beginthread( CheckKey, 0, NULL ); /* Loop until CheckKey terminates program. */ while( repeat ) { /* On first loops, launch character threads. */ _beginthread( Bounce, 0, (void *) (ch++) ); /* Wait one second between loops. */ Sleep( 1000L ); } return 0; } /* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */ void CheckKey( void *dummy ) { _getch(); repeat = 0; /* _endthread implied */ } /* Bounce - Thread to create and and control a colored letter that moves * around on the screen. * * Params: ch - the letter to be moved */ void Bounce( void *ch ) { /* Generate letter and color attribute from thread argument. */ char blankcell = 0x20; char blockcell = (char) ch; BOOL first = TRUE; COORD oldcoord, newcoord; DWORD result; /* Seed random number generator and get initial location. */ srand( _threadid ); newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 ); newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 ); while( repeat ) { /* Pause between loops. */ Sleep( 100L ); /* Blank out our old position on the screen, and draw new letter. */ if( first ) first = FALSE; else WriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result ); WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result ); /* Increment the coordinate for next placement of the block. */ oldcoord.X = newcoord.X; oldcoord.Y = newcoord.Y; newcoord.X += GetRandom( -1, 1 ); newcoord.Y += GetRandom( -1, 1 ); /* Correct placement (and beep) if about to go off the screen. */ if( newcoord.X < 0 ) newcoord.X = 1; else if( newcoord.X == csbi.dwSize.X ) newcoord.X = csbi.dwSize.X - 2; else if( newcoord.Y < 0 ) newcoord.Y = 1; else if( newcoord.Y == csbi.dwSize.Y ) newcoord.Y = csbi.dwSize.Y - 2; /* If not at a screen border, continue, otherwise beep. */ else continue; Beep( ((char) ch - "A") * 1000, 500 ); } /* _endthread given to terminate */ _endthread(); }