RT,我想改变控制台应用程序的文字颜色,能否实现?
解决方案 »
- MFC list control 控件 删除Item会莫名其妙的多一行
- 如何在CRichEditCtrl中使用CFindReplaceDialog实现查找替换?
- 如何实现数据中心(套接字,TCP)和GPRS在永久在线?
- 能否用调光度的办法解决在WIN32下實現文字的淡入淡出效果???(背景颜色很复杂)
- 急救!VC6+XP专业版,SDI界面,主窗口中,点击按钮可打开一新窗口,如果不点击该按钮,关闭主窗口,程序正常退出。
- 视频叠加的问题,望高手鼎立帮助,对解决问题者可奉送该视频采集系统!决不失言!谢谢!
- 关于动态改变菜单状态栏提示的小问题!
- 关于聊天软件线程的问题
- 请教各位:这里的分数是干吗用的?怎样改?
- CWnd中的声明空成员函数OnSize究竟有何作用?
- 乘法由于数据太大了,怎么处理?有没有256的浮点型
- vc/mfc中 游戏中图片处理的问题
__in HANDLE hConsoleOutput,
__in WORD wAttributes
);参考这个代码
#include <windows.h>
void NewLine(void);
void ScrollScreenBuffer(HANDLE, INT);
HANDLE hStdout, hStdin;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
void main(void)
{
LPSTR lpszPrompt1 = "Type a line and press Enter, or q to quit: ";
LPSTR lpszPrompt2 = "Type any key, or q to quit: ";
CHAR chBuffer[256];
DWORD cRead, cWritten, fdwMode, fdwOldMode;
WORD wOldColorAttrs; // Get handles to STDIN and STDOUT. hStdin = GetStdHandle(STD_INPUT_HANDLE);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE ||
hStdout == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, TEXT("GetStdHandle"),
TEXT("Console Error"), MB_OK);
return;
} // Save the current text colors. if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"),
TEXT("Console Error"), MB_OK);
return;
} wOldColorAttrs = csbiInfo.wAttributes; // Set the text attributes to draw red text on black background. if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
FOREGROUND_INTENSITY))
{
MessageBox(NULL, TEXT("SetConsoleTextAttribute"),
TEXT("Console Error"), MB_OK);
return;
} // Write to STDOUT and read from STDIN by using the default
// modes. Input is echoed automatically, and ReadFile
// does not return until a carriage return is typed.
//
// The default input modes are line, processed, and echo.
// The default output modes are processed and wrap at EOL. while (1)
{
if (! WriteFile(
hStdout, // output handle
lpszPrompt1, // prompt string
lstrlenA(lpszPrompt1), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, TEXT("WriteFile"),
TEXT("Console Error"), MB_OK);
return;
} if (! ReadFile(
hStdin, // input handle
chBuffer, // buffer to read into
255, // size of buffer
&cRead, // actual bytes read
NULL) ) // not overlapped
break;
if (chBuffer[0] == 'q') break;
} // Turn off the line input and echo input modes if (! GetConsoleMode(hStdin, &fdwOldMode))
{
MessageBox(NULL, TEXT("GetConsoleMode"),
TEXT("Console Error"), MB_OK);
return;
} fdwMode = fdwOldMode &
~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if (! SetConsoleMode(hStdin, fdwMode))
{
MessageBox(NULL, TEXT("SetConsoleMode"),
TEXT("Console Error"), MB_OK);
return;
} // ReadFile returns when any input is available.
// WriteFile is used to echo input. NewLine(); while (1)
{
if (! WriteFile(
hStdout, // output handle
lpszPrompt2, // prompt string
lstrlenA(lpszPrompt2), // string length
&cWritten, // bytes written
NULL) ) // not overlapped
{
MessageBox(NULL, TEXT("WriteFile"),
TEXT("Console Error"), MB_OK);
return;
} if (! ReadFile(hStdin, chBuffer, 1, &cRead, NULL))
break;
if (chBuffer[0] == '\r')
NewLine();
else if (! WriteFile(hStdout, chBuffer, cRead,
&cWritten, NULL)) break;
else
NewLine();
if (chBuffer[0] == 'q') break;
} // Restore the original console mode. SetConsoleMode(hStdin, fdwOldMode); // Restore the original text colors. SetConsoleTextAttribute(hStdout, wOldColorAttrs);
}// The NewLine function handles carriage returns when the processed
// input mode is disabled. It gets the current cursor position
// and resets it to the first cell of the next row.
void NewLine(void)
{
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"),
TEXT("Console Error"), MB_OK);
return;
} csbiInfo.dwCursorPosition.X = 0; // If it is the last line in the screen buffer, scroll
// the buffer up. if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y)
{
ScrollScreenBuffer(hStdout, 1);
} // Otherwise, advance the cursor to the next line. else csbiInfo.dwCursorPosition.Y += 1;
if (! SetConsoleCursorPosition(hStdout,
csbiInfo.dwCursorPosition))
{
MessageBox(NULL, TEXT("SetConsoleCursorPosition"),
TEXT("Console Error"), MB_OK);
return;
}
} void ScrollScreenBuffer(HANDLE h, INT x)
{
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest; srctScrollRect.Left = 0;
srctScrollRect.Top = 1;
srctScrollRect.Right = csbiInfo.dwSize.X - x;
srctScrollRect.Bottom = csbiInfo.dwSize.Y - x;
// The destination for the scroll rectangle is one row up.
coordDest.X = 0;
coordDest.Y = 0;
// The clipping rectangle is the same as the scrolling rectangle.
// The destination row is left unchanged.
srctClipRect = srctScrollRect;
// Set the fill character and attributes.
chiFill.Attributes = FOREGROUND_RED|FOREGROUND_INTENSITY;
chiFill.Char.AsciiChar = (char)' ';
// Scroll up one line.
ScrollConsoleScreenBuffer(
h, // screen buffer handle
&srctScrollRect, // scrolling rectangle
&srctClipRect, // clipping rectangle
coordDest, // top left destination cell
&chiFill); // fill character and color
}