Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.02.2009, 23:18

[Erledigt] ConsoleScreenBuffer erzeugen u...

Guten Abend!

Ich experimentiere gerade mit den Console Functions aus dem MSDN http://msdn.microsoft.com/en-us/library/ms682073.aspx. Mein Ziel ist es einen ConsoleScreenBuffer zu erzeugen, etwas mit WriteConsole hineinzuschreiben und das dann anzeigen zu lassen. Dazu habe ich folgenden Code geschrieben:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <windows.h>

using namespace std;

int main ()
{
    /*
    SYNTAX:
    HANDLE WINAPI CreateConsoleScreenBuffer(
      __in        DWORD dwDesiredAccess,
      __in        DWORD dwShareMode,
      __in_opt    const SECURITY_ATTRIBUTES *lpSecurityAttributes,
      __in        DWORD dwFlags,
      __reserved  LPVOID lpScreenBufferData
    );
    */

    HANDLE ConScrBuf = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,CONSOLE_TEXTMODE_BUFFER, NULL);
    if( ConScrBuf == INVALID_HANDLE_VALUE)
        cout << "Fehler!" << GetLastError();

    /*
    BOOL WINAPI WriteConsole(
      __in        HANDLE hConsoleOutput,
      __in        const VOID *lpBuffer,
      __in        DWORD nNumberOfCharsToWrite,
      __out       LPDWORD lpNumberOfCharsWritten,
      __reserved  LPVOID lpReserved
    );
    */

    char Buffer[50]; // Beinhaltet die auszugebenden Zeichen

    LPDWORD CharsWritten = NULL; // Bekommt die geschriebenen Zeichen

    cout << "Bitte geben Sie ein paar Zeichen in den Buffer ein:" << endl;
    cin.get(Buffer,49);

    WriteConsole(ConScrBuf,&Buffer,50,CharsWritten,NULL);

    cout << "Es wurden " << CharsWritten << " Zeichen geschrieben " << endl;
    return 0;
}


Leider bekomme ich nach dem erfolgreichen Compilieren dieses Codes keine Ausgabe. Liegt das evtl. daran das man den erzeugten ScreenBuffer erst noch als active ScreenBuffer initialisieren muss oder liegt das Problem bei dem 2. Parameter der WriteConole Funktion - oder ganz woanders? Schon mal danke im Voraus falls mir jemand helfen kann.

Gruß Andreas2
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

17.02.2009, 00:01

Da hast ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
static const COORD bufferSize = { 80, 17 };
    static const char* data[] = 
    {
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XX     XXXXXXXXXXXXXXX              XXXXXXXXXXXX                             XXX",
        "XX     XXXXXXXXXXXXXXX      XXX     XXXXXXXXXXXX                             XXX",
        "XX           XXX            XXX     XXXXXXXXXXXX     XXXXXXXXXXXXXXXXXXXX    XXX",
        "XX           XXXXXXXXXXXXXXXXXX     XXXXXXXXXXXX     XXXXXXXXXXXXXXXXXXXX    XXX",
        "XX     XXX   X     XXXXXXXXXXXX     XXXXXXXX               XXX    XXX        XXX",
        "XX     XXX        XXX    XXXX                              XX      XX    XXXXXXX",
        "XXX  XXXXXXXXXXXXXXXX    XXXX                                      XX        XXX",  
        "XXX  XX  XXXXXXXXXXXX    XXXX    XXXXXXXXXXXX                      XX        XXX",   
        "XXX  XX  XX      XXXX  XXXXXX    XXXXXXXXXXXX              XXXXXXXXXX        XXX",   
        "X    XX  XX      XXXX  XXX           XXXXX      XXXX   XXXXXX     XXX    XXXXXXX",    
        "X    XX  XX    XXXXXX  XXX           XXXXX      XX     XXXXXX     XXX    XXXXXXX",
        "X    XXXXXX    XXXXXX                XXXXXXXX   XX      XX                  XXXX",
        "X    XXXXXX    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   XX      XX                  XXXX",
        "XX                                              XX     XXX                  XXXX",
        "XX                                              XXXXXXXXXXXXXXXXXXXX        XXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    };

    HANDLE hStdOut, hBuff;
    CHAR_INFO buffer[80*25];

    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
    hBuff = CreateConsoleScreenBuffer(
        GENERIC_READ | GENERIC_WRITE,
        0, 
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL );

    if ( hBuff == INVALID_HANDLE_VALUE )
    {
        printf( "Creating Buffer failed\n" );
        return -1;
    }

    if ( !SetConsoleActiveScreenBuffer( hBuff ) )
    {
        printf( "Setting active screen buffer failed\n" );
        return -1;
    }

    COORD pos = { 0, 0 };
    SMALL_RECT rect = { 0, 0, 79, 24 };
    int index;

    for ( int y = 0; y < bufferSize.Y; ++y )
    {
        for ( int x = 0; x < bufferSize.X; ++x )
        {
            index = y*bufferSize.X+x;
            buffer[index].Char.AsciiChar= data[y][x];
            buffer[index].Attributes = FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE;
        }
    }

    if ( !WriteConsoleOutput( hBuff,
        buffer, bufferSize, pos, &rect ) )
    {
        printf( "Writing buffer content failed\n" );
        return -1;
    }

    _getch();

    SetConsoleActiveScreenBuffer( hStdOut );

3

20.02.2009, 21:12

Nochmal vielen Dank für das Beispiel David_pb.

Allerdings habe ich jetzt ein anderes Problem. Immer wenn ich folgenden Code erstellen lasse bekomme ich an Stelle des X ein Fragezeichen ausgegeben. Ist das ein Unicode Ascii Problem oder mache ich irgendwas falsch? Danke für jede Antwort ;)


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>

int main()
{
    

    // Zuerst einmal erzeuge ich ein HANDLE auf den aktiven Konsole Screen Buffer

    // Damit habe ich also ein Handle mit dem ich auf den Konsolenscreen Buffer zugreifen kann

    HANDLE hConOut = GetStdHandle ( STD_OUTPUT_HANDLE );

    // Jetzt gehe ich an eine bestimmte Cursorposition im Console Screen Buffer

    COORD CursorPosition;
    CursorPosition.X = 5;
    CursorPosition.Y = 5;
    SetConsoleCursorPosition ( hConOut, CursorPosition );

    // Das was in den ConsoleScreenbuffer geschrieben werden soll

    const char chZeichen = 'X';

    // Jetzt schreibe ich an der aktuellen Cursorposition etwas in den CSB

    WriteConsole ( hConOut, &chZeichen, 1, NULL, NULL );

    return 0;
}
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

4

21.02.2009, 11:12

wahrscheinlich benutzt der Compiler ne andere Codepage als die Konsole. mit unicode hat das nix zu tun, char sollte afaik immer ascii sein.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.02.2009, 13:23

Zitat


Allerdings habe ich jetzt ein anderes Problem. Immer wenn ich folgenden Code erstellen lasse bekomme ich an Stelle des X ein Fragezeichen ausgegeben. Ist das ein Unicode Ascii Problem oder mache ich irgendwas falsch? Danke für jede Antwort Wink


Genau, das Poblem ist das du eigentlich WriteConsoleW verwendest. Nimm stattdessen WriteConsoleA, dann klappts auch mit dem char.

6

22.02.2009, 22:41

Ich versuche nun schon seit längerem einen Kasten mit Hilfe von WriteConsoleOutputA zu erzeugen aber irgendwie will es nicht funktionieren. Hier der Quellcode mit Fehlermeldung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <windows.h>

int main()
{
    // Zuerst einmal erzeuge ich ein HANDLE auf den aktiven Konsole Screen Buffer

    // Damit habe ich also ein Handle mit dem ich auf den Konsolenscreen Buffer zugreifen kann

    HANDLE hConOut = GetStdHandle ( STD_OUTPUT_HANDLE );

    // Jetzt erstelle ich mir ein Array vom Typ CHAR_INFO das 11 Zeichen Breit und 21 Zeichen

    // Hoch sein soll.

    CHAR_INFO buffer[11][21];

    // Für die Funktion WriteConsoleOutputA erzeuge ich diese Variable vom Typ COORD

    // die die Größe meines CHAR_INFO buffers angibt

    COORD bufferSize = {11,21};

    // Jetzt fülle ich den CHAR_INFO buffer mit lauter X Zeichen

    for(int i=0; i<bufferSize.Y; i++)
    {
        for(int j=0; j<bufferSize.X; j++)
        {
            buffer[i][j].Char.AsciiChar = 'X';
        }
    }

    // Die obere linke Ecke des Arrays buffer

    COORD upperLeft = {0,0};

    // Der Bereich (die Region) des Console Screen Buffers in den geschrieben werden soll

    SMALL_RECT ConScrBufReg = {0,0,80,24};

    // Nun rufe ich die Funktion WriteConsoleOutputA auf die mein buffer Array in den

    // aktiven ConsoleScreenBuffer hConOut schreiben soll.

    WriteConsoleOutputA( hConOut, &buffer, bufferSize, upperLeft, ConScrBufReg ); 

    return 0;
}

// Ich bekomme folgende Fehlermeldung: 

// error C2664: 'WriteConsoleOutputA': Konvertierung des Parameters 2 von 

// 'CHAR_INFO
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

22.02.2009, 23:19

Zitat von »"Andreas2"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
    WriteConsoleOutputA( hConOut, &buffer, bufferSize, upperLeft, ConScrBufReg ); 

    return 0;
}

// Ich bekomme folgende Fehlermeldung: 

// error C2664: 'WriteConsoleOutputA': Konvertierung des Parameters 2 von 

// 'CHAR_INFO

In der MSDN steht, die erwarten einen const CHAR_INFO* zum Urpsrung deines buffers. Also etwa so:

C-/C++-Quelltext

1
 WriteConsoleOutputA( hConOut, const_cast<const CHAR_INFO*>(&buffer[0][0]), bufferSize, upperLeft, ConScrBufReg );
"Have you tried turning it off and on again?"

8

23.02.2009, 07:40

Soweit so gut aber ich bekomme leider nix angezeigt :( :?:

C-/C++-Quelltext

1
WriteConsoleOutputA( hConOut, const_cast<const CHAR_INFO*>(&buffer[0][0]), bufferSize, upperLeft, &ConScrBufReg );
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

23.02.2009, 09:09

Wie kommt ihr denn auf sowas? (Genial... const_cast)...

Wie wärs mit:

C-/C++-Quelltext

1
WriteConsoleOutputA( hConOut, &buffer[0][0], bufferSize, upperLeft, &ConScrBufReg ); 


Man beachte auch das & vor ConstScrBufReg.
Übrigens hast du beim füllen von deinem Puffer auch einen Fehler. Es müsst heißen:

C-/C++-Quelltext

1
2
3
4
5
6
7
for(int i=0; i<bufferSize.X; i++) 
    { 
        for(int j=0; j<bufferSize.Y; j++) 
        { 
            buffer[i][j].Char.AsciiChar = 'X'; 
        } 
    } 

10

23.02.2009, 11:27

Jep, Jetzt funktioniert es - Danke! :)
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

Werbeanzeige