Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » textcolor() geht bei meiner output-funktion nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.03.2005, 20:44 Uhr
RedEagle



Hi
Ich habe eine Funktion geschrieben, die ein Zeichen an einer bestimmten stelle ausgibt. allerdings wird IMMER in Grau, mit schwartzem background ausgegeben

Meine Funktio:

C++:
void coutput(char value, int x, int y)
{
COORD WriteCoord;
DWORD dwNumberOfCharsWritten = 1;

   WriteCoord.X = x;
   WriteCoord.Y = y;

FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), value, 1, WriteCoord, &dwNumberOfCharsWritten);
}


--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.03.2005, 21:36 Uhr
Spacelord
Hoffnungsloser Fall


Wieso sollte es auch anders sein?
Das was du brauchst ist FillConsoleOutputAttribute.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.03.2005, 21:54 Uhr
RedEagle



Ne, die Farbe mache ich mit

C++:
void mytextcolor(int newcolor)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE                     hOutput;

  if(INVALID_HANDLE_VALUE == (hOutput = GetStdHandle(STD_OUTPUT_HANDLE))) return;
  if(!GetConsoleScreenBufferInfo(hOutput, &csbi)) return;

SetConsoleTextAttribute(hOutput, (WORD)((csbi.wAttributes & ~0x0F) | ((WORD)(newcolor & 0x0F))));

return;
}



---


C++:
mytextcolor(14);
coutput('x', 10, 15);



Es sollte an der Position 10/15 ein gelbes 'x' ausgeben, aber er wird nur ein graues ausgegen
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.03.2005, 10:58 Uhr
RedEagle



Hab den Fehler behobe. hab anstatt "FillConsoleOutputCharacter" "WriteConsole" genommen, und dann gings

trotzdem
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.03.2005, 10:58 Uhr
Spacelord
Hoffnungsloser Fall


Ich sag ja du brauchst FillConsoleOutputAttribute.


Zitat von MSDN::

The SetConsoleTextAttribute function sets the foreground (text) and background color attributes of characters written to the screen buffer by the WriteFile or WriteConsole function, or echoed by the ReadFile or ReadConsole function.



FillConsoleOutputCharacter scheint aber direkt in den Puffer zu schreiben und nicht WriteConsole zu nutzen.Insbesondere nutzt FillConsoleOutputCharacter auch das ColorAttribut was zu diesem Zeitpunkt noch in dieser Zelle steht.

Also musst du entweder mit ner (selbstgebastelten) gotoxy an die gewünschte Position springen und dein Zeichen "normal" ausgeben oder du überschreibst in deiner textcolor Funktion gleich die Colorattribute des kompletten ScreenBuffers.

Auf die schnelle zusammen geschustert:




C++:
#include <windows.h>
#include <iostream>

void coutput(char value, int x, int y)
{
COORD WriteCoord;
DWORD dwNumberOfCharsWritten = 1;

   WriteCoord.X = x;
   WriteCoord.Y = y;

FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), value, 1, WriteCoord, &dwNumberOfCharsWritten);
}

void mytextcolor(int newcolor)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE                     hOutput;

  if(INVALID_HANDLE_VALUE == (hOutput = GetStdHandle(STD_OUTPUT_HANDLE))) return;
  if(!GetConsoleScreenBufferInfo(hOutput, &csbi)) return;

SetConsoleTextAttribute(hOutput, (WORD)((csbi.wAttributes & ~0x0F) | ((WORD)(newcolor & 0x0F))));

return;
}

void setScreenColor(WORD farbe)
{
    COORD curPos={0,0};
    DWORD rueckgabe;
    CONSOLE_SCREEN_BUFFER_INFO conInfo;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&conInfo);
    DWORD pufferGroesse = conInfo.dwSize.X * conInfo.dwSize.Y;
    FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE),farbe,pufferGroesse,curPos,&rueckgabe);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),farbe);
}

void gotoxy(int x,int y)
{
    COORD curPos={x,y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),curPos);
}


int main()
{           //entweder
    //mytextcolor(14);
    setScreenColor(14);
    coutput('x', 10, 15);

    //oder
    mytextcolor(25);
    gotoxy(15,20);
    std::cout<<'A';


    return 0;
}





MfG Spacelord


Bearbeitung von Spacelord:

Shit,also das geht mir jetzt aber feste auf den Sack!!


--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 13.03.2005 um 10:59 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.03.2005, 11:14 Uhr
RedEagle





zum abschluss mal meine neue coutput-funktion

C++:
void coutput(char value, int x, int y)
{
DWORD dwNumberOfCharsWritten = 1;

gotoxy(x,y);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), &value, 1, &dwNumberOfCharsWritten, NULL);
}


--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: