|
在图形界面程序里使用控制台窗口
(浏览
46378
次)
Victor Chen, (C++ 爱好者)
实现功能: 打开控制台窗口、关闭控制台窗口、在控制台窗口里执行DOS命令、清除控制台窗口、光标定位、输出文本、设置文本颜色等。
适用平台: Windows 9x/Me/NT/2000/XP/2003
程序需要自己创建一个 TConsoleWindow 类, 先看看如何使用这个类。
新建工程, 在 Form1 上放 5 个按钮, 分别为: 打开控制台窗口、执行DOS命令、输出文本、在指定位置输出彩色文本、关闭控制台窗口。
首先看看如何使用这个 TConsoleWindow 类:
在 Form 的头文件里 (例如 Unit1.h) 需要增加的内容(蓝色部分是新增内容,
没修改的部分省略):
#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|FOREGROUND_INTENSITY|BACKGROUND_BLUE);
ConWin.printf("屏幕中央显示蓝色背景的绿色文字");
ConWin.MoveTo(r.Left,r.Bottom); //光标移动到左下角
ConWin.SetColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{ ConWin.Close();
//关闭控制台窗口
}
//--------------------------------------------------------------------------- |
TConsoleWindow 类的实现:
头文件 Unit2.h 的内容:
//---------------------------------------------------------------------------
#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.Length(),&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);
}
//--------------------------------------------------------------------------- |
|
|
|