让Win32窗口程序拥有控制台窗口
讓W(xué)in32窗口程序擁有控制臺(tái)窗口
? ? 首先,為什么我們有了普通窗口后還要控制臺(tái)窗口呢?因?yàn)槲覀兛梢杂盟奖愕妮敵稣{(diào)試信息,而且普通玩家看到了也會(huì)覺得很高端。如果他會(huì)輸幾條命令,可能他會(huì)以為自己就是黑客了。
示例效果:
? ? WinMain作為入口函數(shù)后,手動(dòng)創(chuàng)建了控制臺(tái)窗口,然后創(chuàng)建了普通窗口,輸出了一些信息到控制臺(tái)窗口。
具體實(shí)現(xiàn):
? ? 要?jiǎng)?chuàng)建一個(gè)控制臺(tái)窗口,首先調(diào)用AllocConsole創(chuàng)建一個(gè)。但此時(shí)調(diào)用cout或者printf都不能正常輸出文字到窗口(包括輸入流cin和scanf)。所以需要如下重定向輸入輸出流:
AllocConsole();
FILE* stream;
freopen_s(&stream, "CON", "r", stdin);//重定向輸入流
freopen_s(&stream, "CON", "w", stdout);//重定向輸入流
如果我們需要用到控制臺(tái)窗口句柄,可以調(diào)用FindWindow取得:
HWND _consoleHwnd;
SetConsoleTitle(DEFAULT_CONSOLE_TITLE);//設(shè)置窗口名
for (int i = 0; i < 100; i++)
{
? ? ? ? _consoleHwnd = FindWindow(NULL, DEFAULT_CONSOLE_TITLE);
? ? ? ? if (_consoleHwnd)
? ? ? ? ? ? ? ? break;
? ? ? ? Sleep(100);
}
然后還需要輸出流句柄:
HANDLE _handleOutput;
_handleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
在不需要的時(shí)候請(qǐng)調(diào)用FreeConsole釋放控制臺(tái)窗口:
FreeConsole();
完成以上工作后,就能夠創(chuàng)建一個(gè)控制臺(tái)窗口,并能夠使用cout標(biāo)準(zhǔn)輸出流輸出文字到其上。這里我們用wcout為例,并給文字添加上顏色:
void DebuggerConsole::Write(const String& str, int level)
{
? ? ? ? switch(level)
? ? ? ? {
? ? ? ? case DebugLevel::BLANK://空白
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_INTENSITY |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? case DebugLevel::TIME://時(shí)間(白色)
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? case DebugLevel::INFO://信息(白色藍(lán)底)
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE |
? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_BLUE |
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? case DebugLevel::NOTICE://提示(綠色)
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_GREEN |
? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_GREEN |
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? case DebugLevel::WARN://警告(黃色)
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_GREEN | FOREGROUND_RED |
? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_GREEN | BACKGROUND_RED |
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? case DebugLevel::ERR://錯(cuò)誤(紅色)
? ? ? ? ? ? ? ? SetConsoleTextAttribute(_handleOutput,
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_RED |
? ? ? ? ? ? ? ? ? ? ? ? BACKGROUND_RED |
? ? ? ? ? ? ? ? ? ? ? ? FOREGROUND_INTENSITY);
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? std::wcout << str.GetWcs();//獲取字符串WCHAR數(shù)組版本
}
其中SetConsoleTextAttribute設(shè)置了輸出文本的顏色,第一個(gè)參數(shù)是前面取得的輸出句柄,第二個(gè)參數(shù)是宏的值組合。FOREGROUND前綴代表前景色,BACKGROUND代表背景色。RED、GREEN、BLUE是三原色分量,INTENSITY代表顏色加強(qiáng)(變得更亮)。
? ? 最后再提一句,wcout不能直接輸出中文,需要提前調(diào)用一句(至于為什么我也不知道^_^):
locale::global((locale("")));
作者:略游
日期:17-07-31
QQ:1339484752
總結(jié)
以上是生活随笔為你收集整理的让Win32窗口程序拥有控制台窗口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++简单实现GC和内存池
- 下一篇: DND是如何封装WinSock的?