在图形界面程序里使用控制台窗口




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);
}
//---------------------------------------------------------------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个强大的图形用户界面工具包,用于创建应用程序的用户界面。通常情况下,PyQt5创建的界面不会显示控制台输出。 然而,可以通过一些技巧将控制台输出显示在PyQt5的图形用户界面中。最简单的方法是使用QPlainTextEdit小部件来显示控制台输出。下面是一个示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QVBoxLayout, QWidget from PyQt5.QtCore import Qt class ConsoleWidget(QWidget): def __init__(self): super().__init__() self.console_output = QTextEdit() self.console_output.setReadOnly(True) layout = QVBoxLayout() layout.addWidget(self.console_output) self.setLayout(layout) def write_to_console(self, text): self.console_output.moveCursor(QTextEdit.End) self.console_output.insertPlainText(text) self.console_output.moveCursor(QTextEdit.End) QApplication.processEvents() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.console_widget = ConsoleWidget() self.setCentralWidget(self.console_widget) sys.stdout = self.console_widget # 创建一个应用程序 app = QApplication(sys.argv) # 创建主窗口 window = MainWindow() window.show() # 在控制台输出一些文本 print('这是一些控制台输出') # 运行应用程序的主循环 sys.exit(app.exec_()) ``` 上述代码创建了一个自定义的控制台小部件(ConsoleWidget),与一个主窗口(MainWindow)一起使用。通过重定向sys.stdout到自定义控制台小部件,可以将所有print语句的输出重定向到该控制台小部件,并在PyQt5的图形用户界面中显示出来。 使用上述代码,控制台输出将显示在主窗口(QMainWindow)中的QPlainTextEdit小部件中。在图形用户界面程序的其他地方,可以使用类似的方法来显示控制台输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值