青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

wish  
日歷
<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789
統(tǒng)計(jì)
  • 隨筆 - 4
  • 文章 - 1
  • 評(píng)論 - 34
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 

很多時(shí)候,調(diào)試GUI程序是很不方便的,通常的做法是使用MessageBox,但是作為一個(gè)模態(tài)窗口,它經(jīng)常產(chǎn)生不必要的消息,比如killfocus, setfocus或者paint,從而影響調(diào)試的執(zhí)行過(guò)程。當(dāng)然,使用vc的調(diào)試器也不錯(cuò),但是這樣也很容易造成窗口切換從而產(chǎn)生干擾消息。
因此,如果能像在控制臺(tái)程序里那樣使用cin/cout對(duì)象或printf族函數(shù),會(huì)使得調(diào)試過(guò)程方便得多。而通常,windows是不會(huì)為GUI程序產(chǎn)生單獨(dú)的命令行窗口的。所以我們是看不到使用標(biāo)準(zhǔn)輸入輸出流輸出的東西的。既然系統(tǒng)不提供,那就自己動(dòng)手“造”出一個(gè)來(lái)吧!


下面是一個(gè)簡(jiǎn)單的控制臺(tái)窗口對(duì)象,它可以為你的程序創(chuàng)建一個(gè)命令行窗口,并將stdout,stdin和stderr重定向到這個(gè)命令行窗口。在程序中建立一個(gè)這樣的對(duì)象之后,就可以直接使用cin/cout/*printf來(lái)操縱這個(gè)新的命令行窗口了!

.h文件
#ifndef _CUSTOM_CONSOLE_
#define _CUSTOM_CONSOLE_

#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <windows.h>

class Console
{
public:
 Console();
 Console(LPCTSTR lpszTitle, SHORT ConsoleHeight = 300, SHORT ConsoleWidth = 80);
 ~Console();

private:
 void Attach(SHORT ConsoleHeight, SHORT ConsoleWidth);
 static BOOL IsExistent;
};

#endif

.cpp文件

#include "***.h"

 BOOL Console::IsExistent = FALSE;

 Console::Console()
 {
  if (IsExistent)
   return;

  AllocConsole();
  Attach(300, 80);

  IsExistent = TRUE;
 }

 Console::Console(LPCTSTR lpszTitle, SHORT ConsoleHeight, SHORT ConsoleWidth)
 {
  if (IsExistent)
   return;

  AllocConsole();
  SetConsoleTitle(lpszTitle);
  Attach(ConsoleHeight, ConsoleWidth);

  IsExistent = TRUE;
 }

 void Console::Attach(SHORT ConsoleHeight, SHORT ConsoleWidth)
 {
  HANDLE  hStd;
  int     fd;
  FILE    *file;

// 重定向標(biāo)準(zhǔn)輸入流句柄到新的控制臺(tái)窗口

  hStd = GetStdHandle(STD_INPUT_HANDLE);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
  file = _fdopen(fd, "r");
  setvbuf(file, NULL, _IONBF, 0); // 無(wú)緩沖
  *stdin = *file;

// 重定向標(biāo)準(zhǔn)輸出流句柄到新的控制臺(tái)窗口

  hStd = GetStdHandle(STD_OUTPUT_HANDLE);
  COORD size;
  size.X = ConsoleWidth;
  size.Y = ConsoleHeight;
  SetConsoleScreenBufferSize(hStd, size);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); //文本模式
  file = _fdopen(fd, "w");
  setvbuf(file, NULL, _IONBF, 0); // 無(wú)緩沖
  *stdout = *file;

// 重定向標(biāo)準(zhǔn)錯(cuò)誤流句柄到新的控制臺(tái)窗口

  hStd = GetStdHandle(STD_ERROR_HANDLE);
  fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
  file = _fdopen(fd, "w");
  setvbuf(file, NULL, _IONBF, 0); // 無(wú)緩沖
  *stderr = *file;

 }

 Console::~Console()
 {
  if (IsExistent)
  {
   FreeConsole();
   IsExistent = FALSE;
  }
 }


可以在WinMain里建立這個(gè)對(duì)象,若在main里建立這個(gè)對(duì)象,則同樣會(huì)出現(xiàn)一個(gè)新的控制臺(tái)窗口。
#ifdef _DEBUG // 當(dāng)然,在release版里同樣可以使用
Console notused;
#endif
posted on 2007-05-08 19:57 閱讀(3500) 評(píng)論(12)  編輯 收藏 引用
評(píng)論:
  • # re: GUI程序也能使用控制臺(tái)窗口  eXile Posted @ 2007-05-08 23:31
    利用editbin不用修改代碼, 就可添加控制臺(tái)  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口  eXile Posted @ 2007-05-08 23:31
    editbin /SUBSYSTEM:CONSOLE $(TargetPath)  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口[未登錄](méi)  thinkry Posted @ 2007-05-09 12:58
    你的方法復(fù)雜了,最簡(jiǎn)單方式是用OutputDebugString,用dbgview查看。  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口   Posted @ 2007-05-09 16:05
    謝謝eXile提醒,就是說(shuō)只要把exe文件的可選頭部中的subsystem(子系統(tǒng))位,從2(Windows)改成3(Console)就可以了。  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口  pass86 Posted @ 2007-05-09 17:06
    VC6.0編譯錯(cuò)誤:
    console.cpp(72) : fatal error C1010: unexpected end of file while looking for precompiled header directive
    但是用其它IDE能編譯成功,為什么呢?
    這個(gè)東西真的挺有用的,DEBUG時(shí)用,不用MessageBox那么麻煩了。
      回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口   Posted @ 2007-05-09 17:51
    to pass86:
    你把project屬性里console.cpp設(shè)置為“不使用預(yù)編譯頭文件”就可以了;
    或者在console.cpp前面加上一行#include "stdafx.h"(如果你沒(méi)有改變預(yù)編譯頭的名稱(chēng)的話(huà))也一樣。
      回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口  FlyingBear Posted @ 2007-05-10 12:57
    GUI程序附帶的控制臺(tái)很方便,我以前也用過(guò),但是它跟主窗口分離,而且太前面的內(nèi)容會(huì)丟失,不小心點(diǎn)了控制臺(tái)的關(guān)閉系統(tǒng)還會(huì)當(dāng)?shù)?后來(lái)我就用日志系統(tǒng)的log listener,把消息導(dǎo)入到一個(gè)editbox里,但是卷屏效率很低,如果不開(kāi)多線(xiàn)程跑的話(huà),還常常卡死,不知道像vc的output條是怎么實(shí)現(xiàn)的  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口   Posted @ 2007-05-10 20:11
    SetConsoleScreenBufferSize可以設(shè)置Console的緩沖。如果還不夠用,那就只有DIY了。  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口  luck Posted @ 2007-05-11 01:15
    CRT有一個(gè)現(xiàn)成的函數(shù)實(shí)現(xiàn)樓主的Attach函數(shù)的功能:
    freopen("CONOUT$", "a", stdout); // Redirect stdout to console
    freopen("CONOUT$", "a", stderr); // Redirect stderr to console
      回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口[未登錄](méi)  123 Posted @ 2011-11-18 10:47
    fcntl.h--我草,這TMD是linux的頭文件!
    這說(shuō)明兩個(gè)問(wèn)題:1 根本就不是自己寫(xiě)的程序;2 樓豬根本就沒(méi)運(yùn)行就轉(zhuǎn)載了!!!!!  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口[未登錄](méi)  123 Posted @ 2011-11-18 10:55
    轉(zhuǎn)載請(qǐng)注明出處,謝謝!!  回復(fù)  更多評(píng)論   

  • # re: GUI程序也能使用控制臺(tái)窗口[未登錄](méi)  xxx Posted @ 2012-03-23 11:20
    @123
    這位噴子大人。fcntl是posix定義的頭文件,但在windows上一樣有實(shí)現(xiàn)。玩linux玩傻了吧?  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


 
Copyright © 淼 Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩一级黄| 欧美亚洲日本国产| 欧美日本在线播放| 欧美激情偷拍| 欧美丝袜一区二区三区| 国产精品久久夜| 国产日韩欧美三级| 麻豆精品视频| 免费观看在线综合| 麻豆国产va免费精品高清在线| 久久精品91久久久久久再现| 久久久av网站| 欧美国产一区视频在线观看 | 亚洲欧美一区二区激情| 午夜综合激情| 欧美.com| 国产欧美日韩高清| 亚洲成色www久久网站| 亚洲精选中文字幕| 性欧美xxxx视频在线观看| 久久综合色婷婷| 亚洲精品一区二区三区不| 午夜电影亚洲| 欧美日韩视频| 尤物九九久久国产精品的分类| 洋洋av久久久久久久一区| 久久www免费人成看片高清| 亚洲成人在线视频播放 | 一区二区欧美国产| 久久久久久婷| 国产精品久久久久久久久 | 性一交一乱一区二区洋洋av| 久久午夜色播影院免费高清| 亚洲卡通欧美制服中文| 久久精品一区四区| 欧美色欧美亚洲另类二区| 在线观看精品视频| 欧美一区2区三区4区公司二百| 亚洲国产精选| 久久久久中文| 国产亚洲毛片在线| 亚洲欧美在线免费| 亚洲精品色婷婷福利天堂| 久久人人97超碰国产公开结果| 国产精品视频免费观看www| 99re成人精品视频| 欧美11—12娇小xxxx| 欧美一级专区免费大片| 欧美午夜免费影院| 99国产精品一区| 欧美激情乱人伦| 久久久免费精品| 国内成人自拍视频| 欧美一区二区视频在线观看| 亚洲视频自拍偷拍| 欧美日韩中字| 亚洲性视频网址| 在线观看日韩av| 欧美视频免费在线| 亚洲最黄网站| 亚洲精品视频在线观看免费| 美女精品视频一区| 亚洲国产精品va在看黑人| 蜜臀av在线播放一区二区三区| 欧美亚洲视频一区二区| 久久亚洲欧洲| 欧美一区亚洲一区| 国产亚洲午夜| 牛牛精品成人免费视频| 久久综合给合久久狠狠色| 亚洲国产一区二区在线| 亚洲成人在线视频播放| 欧美精品黄色| 亚洲欧美国产日韩天堂区| 亚洲欧美国产高清va在线播| 国产亚洲一区二区三区| 免费成人性网站| 欧美精选一区| 欧美亚洲免费在线| 久久综合狠狠综合久久综青草| 亚洲精品综合在线| 中文日韩电影网站| 狠狠色噜噜狠狠色综合久| 亚洲国产你懂的| 国产精品chinese| 久久综合图片| 欧美日韩国产综合新一区| 欧美一区二区三区男人的天堂| 羞羞漫画18久久大片| 在线不卡视频| 夜夜嗨av一区二区三区四区| 国产专区综合网| 亚洲国产综合在线| 国产精品美女黄网| 欧美成人性生活| 国产精品老牛| 亚洲国产福利在线| 国产欧美精品| 亚洲欧洲日本国产| 国产在线观看91精品一区| 亚洲激情av| 激情欧美一区| 亚洲午夜在线| 在线视频欧美精品| 久久久噜噜噜久久人人看| 一区二区三区成人| 久久久久一区二区三区| 亚洲欧美制服另类日韩| 欧美精品成人在线| 久久在线播放| 国产欧美视频在线观看| 亚洲精品国精品久久99热| 国语自产在线不卡| 亚洲一品av免费观看| 一本色道**综合亚洲精品蜜桃冫 | 麻豆乱码国产一区二区三区| 午夜欧美电影在线观看| 欧美激情精品| 欧美成熟视频| 国产精品一区二区你懂的| 狠狠干综合网| 欧美大片免费| 国产专区精品视频| 亚洲欧美日韩成人| 亚洲男女自偷自拍| 欧美日韩精品免费观看视频完整| 麻豆成人在线播放| 国产精品一区二区欧美| 中文亚洲视频在线| 一区二区三区黄色| 欧美精品粉嫩高潮一区二区 | 亚洲乱码国产乱码精品精可以看| 欧美在线日韩在线| 久久成人综合网| 国产视频精品免费播放| 亚洲自啪免费| 香蕉久久一区二区不卡无毒影院| 欧美体内she精视频在线观看| 亚洲精品视频一区| 国产精品99久久久久久www| 欧美色道久久88综合亚洲精品| 一二三区精品| 久久成人综合视频| 韩国av一区二区三区在线观看| 久久精品女人| 亚洲第一色在线| 99国产麻豆精品| 国产精品久久久一区二区| 午夜欧美精品| 免费国产一区二区| 亚洲精品国产精品国产自| 欧美久久久久免费| 一本色道久久99精品综合| 午夜国产一区| 激情六月婷婷综合| 欧美精品三区| 午夜欧美大尺度福利影院在线看| 久久综合色影院| 妖精视频成人观看www| 国产精品素人视频| 久久久久国产精品人| 亚洲欧洲日本在线| 午夜精品网站| 亚洲经典在线| 国产精品五月天| 美女网站在线免费欧美精品| 亚洲最新在线| 久久一区二区三区四区| 在线视频你懂得一区| 黄色成人精品网站| 欧美日韩dvd在线观看| 久久精品99无色码中文字幕| 91久久国产综合久久| 久久国产精品高清| 日韩视频一区二区在线观看 | 国产一区二区三区无遮挡| 欧美~级网站不卡| 亚洲女与黑人做爰| 亚洲国产视频直播| 久久激情婷婷| 在线性视频日韩欧美| 精品91视频| 国产欧美日本| 欧美久久99| 免费观看30秒视频久久| 午夜精品久久久久久久| 日韩一区二区精品葵司在线| 免费在线成人| 免费成人av| 99pao成人国产永久免费视频| 中文av字幕一区| 国产精品视频免费观看www| 久久伊人精品天天| 亚洲欧美综合一区| 99视频+国产日韩欧美| 欧美国产第一页| 久久夜色撩人精品| 久久经典综合| 欧美一区二区三区视频| 亚洲午夜影视影院在线观看|