实现功能: 打开控制台窗口、关闭控制台窗口、在控制台窗口里执行DOS命令、清除控制台窗口、光标定位、输出文本、设置文本颜色等。
适用平台: Windows 9x/Me/NT/2000/XP/2003
程序需要自己创建一个 TConsoleWindow 类, 先看看如何使用这个类。
新建工程, 在 Form1 上放 5 个按钮, 分别为: 打开控制台窗口、执行DOS命令、输出文本、在指定位置输出彩色文本、关闭控制台窗口。
首先看看如何使用这个 TConsoleWindow 类:
#include “Unit2.h” //包含控制台窗口类的头文件 class TForm1 : public TForm { private: // User declarations TConsoleWindow ConWin; //自定义的控制台窗口类 public: // User declarations __fastcall TForm1(TComponent* Owner); }; |
在 From 的 .cpp 文件里 (例如 Unit1.cpp), 需要增加的内容(蓝色部分是新增内容):
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //———————————————————- —————– void __fastcall TForm1::BitBtn1Click(TObject *Sender) { ConWin.Open(); //打开控制台窗口 ConWin.Caption = “控制台视窗测试程序”; } //———————————————————- —————– void __fastcall TForm1::BitBtn2Click(TObject *Sender) { ConWin.Execute(“dir”); //在控制台视窗里面执行 DOS 命令 } //———————————————————- —————– void __fastcall TForm1::BitBtn3Click(TObject *Sender) { ConWin.printf(“在控制台视窗里面显示文字\n”); } //———————————————————- —————– void __fastcall TForm1::BitBtn4Click(TObject *Sender) { ConWin.ClrScr(); //清屏 SMALL_RECT r; ConWin.GetRect(r); ConWin.MoveTo((r.Right+r.Left-30)/2, (r.Bottom+r.Top)/2); ConWin.SetColor(FOREGROUND_GREEN|FOR EGROUND_INTENSITY|BACKGROUND_BLUE); ConWin.printf(“屏幕中央显示蓝色背景的绿色文字”); ConWin.MoveTo(r.Left,r.Bottom); //光标移动到左下角 ConWin.SetColor(FOREGROUND_RED|FOREG ROUND_GREEN|FOREGROUND_BLUE); } //———————————————————- —————– void __fastcall TForm1::BitBtn5Click(TObject *Sender) { ConWin.Close(); //关闭控制台窗口 } //———————————————————- —————– |
TConsoleWindow 类的实现:
//———————————————————- —————– #ifndef Unit2H #define Unit2H //———————————————————- —————– #include <vcl.h> //———————————————————- —————– class TConsoleWindow { public: TConsoleWindow() { hCon=NULL; } ~TConsoleWindow() { Close(); } void Open(void); void Close(void); int Execute(AnsiString s); DWORD printf(const char *f,…); void MoveTo(short x, short y); void SetColor(WORD c); void GetRect(SMALL_RECT &r); void ClrScr(WORD c=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); __property HANDLE Handle = { read = hCon }; __property AnsiString Caption = { read = fGetCaption, write = fSetCaption }; private: HANDLE hCon; AnsiString fGetCaption(void); void fSetCaption(AnsiString); }; //———————————————————- —————– #endif |
Unit2.cpp 的内容:
//———————————————————- —————– #pragma hdrstop #include “Unit2.h” //———————————————————- —————– #pragma package(smart_init) //———————————————————- —————– void TConsoleWindow::Open(void) { if(!hCon) { AllocConsole (); hCon = GetStdHandle(STD_OUTPUT_HANDLE); } } //———————————————————- —————– void TConsoleWindow::Close(void) { if(hCon) { FreeConsole( ); hCon = NULL; } } //———————————————————- —————– AnsiString TConsoleWindow::fGetCaption(void) { char s[260]; GetConsoleTitle(s,260); return AnsiString(s); } //———————————————————- —————– void TConsoleWindow::fSetCaption(AnsiString s) { SetConsoleTitle(s.c_str()); } //———————————————————- —————– DWORD TConsoleWindow::printf(const char *f,…) { AnsiString s; va_list argptr; va_start(argptr, f); s.vprintf(f, argptr); va_end(argptr); DWORD dwWritten=0; if(WriteConsole(hCon,s.c_str(),s.Len gth(),&dwWritten,NULL)) return dwWritten; return 0; } //———————————————————- —————– void TConsoleWindow::MoveTo(short x, short y) { COORD CurPos = {x,y}; SetConsoleCursorPosition(hCon, CurPos); } //———————————————————- —————– void TConsoleWindow::SetColor(WORD c) { SetConsoleTextAttribute(hCon, c); } //———————————————————- —————– void TConsoleWindow::GetRect(SMALL_RECT &r) { CONSOLE_SCREEN_BUFFER_INFO ConInfo; GetConsoleScreenBufferInfo(hCon, &ConInfo); r = ConInfo.srWindow; } //———————————————————- —————– int TConsoleWindow::Execute(AnsiString s) { return system(s.c_str()); } //———————————————————- —————– void TConsoleWindow::ClrScr(WORD c) { DWORD nBytesWrite; CONSOLE_SCREEN_BUFFER_INFO ConInfo; GetConsoleScreenBufferInfo(hCon, &ConInfo); COORD CurPos = { CurPos.X = ConInfo.srWindow.Left, CurPos.Y = ConInfo.srWindow.Top }; FillConsoleOutputAttribute(hCon, c, ConInfo.dwSize.X*ConInfo.dwSize.Y, CurPos, &nBytesWrite); FillConsoleOutputCharacter(hCon, 0, ConInfo.dwSize.X*ConInfo.dwSize.Y, CurPos, &nBytesWrite); } //———————————————————- —————– |
>> 本文固定链接: http://www.vcgood.com/archives/822