簡體   English   中英

在主win32窗口中創建窗口控制台

[英]Create window console inside main win32 window

我有一個win32應用程序,需要在按下波浪號時打開像游戲一樣的控制台。 我認為最好的解決方案是使用CreateWindow函數。 這是正確的嗎? 我怎么能讓它重疊主窗口並在再次按下波浪線時隱藏它? 謝謝你們

此處的解決方案無效,因為較新版本的Windows SDK通過以下方式定義FILE結構:

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

嘗試使用=運算符覆蓋stdin / out FILE結構時,只會復制一個指針。 要復制整個FILE結構,必須在windows.h包含之前定義FILE結構:

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

#include <Windows.h>

如果這對您來說不可能,您仍然可以將自己的FILE結構定義為FILE_COMPLETE並使用此codesnippet:

#include <Windows.h>
#include <io.h>
#include <fcntl.h>

AllocConsole();
SetConsoleTitleA("ConsoleTitle");
typedef struct { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE_COMPLETE;
*(FILE_COMPLETE*)stdout = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT), "w");
*(FILE_COMPLETE*)stderr = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w");
*(FILE_COMPLETE*)stdin = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r");
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);

這是一些相當古老的代碼,甚至沒有真正看過它。 希望這是你需要的。 如果你只需要一個非常簡單的,你也可以只調用AllocConsole();

void DevConsole::Create(){

  CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
  int consoleHandleR, consoleHandleW ;
  long stdioHandle;
  FILE *fptr;

  AllocConsole();
  std::wstring strW = L"Dev Console";
  SetConsoleTitle( strW.c_str() );

  EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);
  DrawMenuBar(GetConsoleWindow());

  GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE), &consoleInfo );

  stdioHandle = (long)GetStdHandle( STD_INPUT_HANDLE );
  consoleHandleR = _open_osfhandle( stdioHandle, _O_TEXT );
  fptr = _fdopen( consoleHandleR, "r" );
  *stdin = *fptr;
  setvbuf( stdin, NULL, _IONBF, 0 );

  stdioHandle = (long) GetStdHandle( STD_OUTPUT_HANDLE );
  consoleHandleW = _open_osfhandle( stdioHandle, _O_TEXT );
  fptr = _fdopen( consoleHandleW, "w" );
  *stdout = *fptr;
  setvbuf( stdout, NULL, _IONBF, 0 );

  stdioHandle = (long)GetStdHandle( STD_ERROR_HANDLE );
  *stderr = *fptr;
  setvbuf( stderr, NULL, _IONBF, 0 );

}

在您的應用程序中使用控制台窗口(使用AllocConsole )通常很誘人,但它絕對不是標准的可重用Windows控件。 它具有許多特殊的行為和功能,使其在典型的窗口中獨一無二。

出於這個原因,我同意你的直覺,反對使用真正的“控制台”窗口。 使用文本編輯器創建自己的窗口,就像開發任何其他UI組件(如HUD)一樣。

你是否應該使用CreateWindow很難說:你如何做其余的GUI? 的DirectX? GDI? 一些工具包? 你在使用其他標准的Windows控件嗎?

我發現這個小教程/代碼示例很有用。 http://www.halcyon.com/~ast/dload/guicon.htm

它創建一個控制台並將STD_IN和STD_OUT重定向到控制台。 因此,您可以輕松使用std :: cin和std :: cout等流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM