DirectX/Terminale di debug

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search

Quando saremo immersi nel mondo 3D, avremo a disposizione solo una finestra e non ci sarà modo di scrivere messaggi di testo su di un terminale. Un'alternativa potrebbero essere le MessageBox, ossia quelle finestrelle piccole con il solo tasto Ok ed un breve messaggio. Questa soluzione però oltre ad essere poco flessibile (non avreste tutti i formattatori di printf ad esempio), risulterebbe fastidiosa, in quanto per ogni messaggio dovreste premere su OK. Vediamo quindi come aprire un terminale che accompagni la finestra dove andremo a lavorare. Quando il programma sarà terminato potrete rimuovere il terminale.

Mostrare il terminale[modifica]

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

void OpenConsole()
{
    int hConHandle;
    long lStdHandle;
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    FILE *fp;

    AllocConsole();

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = 500;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    lStdHandle = (long) GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);
	
    lStdHandle = (long) GetStdHandle(STD_INPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "r");
    *stdin = *fp;
    setvbuf(stdin, NULL, _IONBF, 0);

    lStdHandle = (long) GetStdHandle(STD_ERROR_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stderr = *fp;
    setvbuf(stderr, NULL, _IONBF, 0);

    ios::sync_with_stdio();
}

A questo punto per aprire la console vi basterà chiamare OpenConsole quanto prima possibile nel vostro programma.