Создать оконную консоль внутри главного окна win32 - PullRequest
10 голосов
/ 21 февраля 2011

У меня есть приложение win32, которое должно открывать консоль, как игры, когда нажата тильда. Я думал, что лучшее решение - использовать функцию CreateWindow. Это правильно? Как сделать так, чтобы оно перекрывало главное окно и скрывалось при повторном нажатии тильды? Спасибо всем

Ответы [ 4 ]

3 голосов
/ 09 мая 2017

Решения здесь не будут работать, потому что более новые версии Windows SDK определяют структуру FILE:

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

При попытке переписать структуры FILE stdin / out с помощью оператора =, будет скопирован только один указатель. Чтобы скопировать всю структуру FILE, вы должны определить структуру FILE перед тем, как ваш windows.h включает:

#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 и использовать этот codenippet:

#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);
3 голосов
/ 21 февраля 2011

Часто заманчиво использовать консольное окно в вашем приложении (используя AllocConsole), но это определенно НЕ стандартный многократно используемый элемент управления Windows.У него есть множество специальных функций и функций, которые делают его уникальным для типичного окна.

По этой причине я бы согласился с вашим инстинктом против использования настоящего «Консольного» окна.Создайте свое собственное окно с текстовым редактором, как если бы вы разрабатывали любой другой компонент пользовательского интерфейса, например, HUD.

Нужно ли использовать CreateWindow, трудно сказать: как у вас дела с остальным графическим интерфейсом?DirectX?GDI?Какой-то инструментарий?Используете ли вы другие стандартные элементы управления Windows?

3 голосов
/ 21 февраля 2011

Это довольно старый код, на самом деле даже не просматривал его. Надеюсь, это то, что вам нужно. Если вам просто нужен очень простой, вы также можете просто позвонить 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 );

}
0 голосов
/ 28 августа 2012

Я нашел этот небольшой учебник / примеры кода полезным.http://www.halcyon.com/~ast/dload/guicon.htm

Создает консоль и перенаправляет STD_IN и STD_OUT на консоль.Таким образом, вы можете легко использовать потоки std :: cin, std :: cout и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...