Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:02 Der er 40 kommentarer og
1 løsning

Console applikation, anden bg farve

Hej!

Kan man godt, i en C++ Console Applikation, lave baggrundsfarven om til f.eks. blå?

MVH
Anders
Avatar billede soreno Praktikant
22. maj 2003 - 19:08 #1
Se dette eksempel:

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

  SetConsoleTitle("Hello World!!");

  SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  printf("Hello ");

  SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE);
  printf("World!!\n");

  SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

  return 0;
}

Og kig her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setconsoletextattribute.asp

Leg så selv med:
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:15 #2
Hvis jeg indsætter dette

SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

Får jeg fejl i linjen..

Hvor skal jeg ca. sætte det ind?

Det er den samme lommeregner kode som før.
Avatar billede driis Nybegynder
22. maj 2003 - 19:16 #3
... og du kan bruge flg. til at kombinere farven:
Attribute Meaning
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.
COMMON_LVB_LEADING_BYTE Leading byte.
COMMON_LVB_TRAILING_BYTE Trailing byte.
COMMON_LVB_GRID_HORIZONTAL Top horizontal.
COMMON_LVB_GRID_LVERTICAL Left vertical.
COMMON_LVB_GRID_RVERTICAL Right vertical.
COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE Underscore.
Avatar billede driis Nybegynder
22. maj 2003 - 19:17 #4
Har du husket
#include <windows.h> ?
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:18 #5
Nej, det er en Console applikation.
Avatar billede driis Nybegynder
22. maj 2003 - 19:18 #6
og, du skal naturligvis huske at køre linien
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
før du bruger SetConsoleTextAttribute
Avatar billede driis Nybegynder
22. maj 2003 - 19:19 #7
Ja, men windows.h skal bruges, fordi SetConsoleTextAttribute er en Windows - funktion, ligesom GetStdHandle.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:20 #8
Det skal lige siges, at jeg er helt newbie til C++.

Kan ikke mere, end hvad halvdelen af Kris Jamsa's bog er.

Hvor skal jeg indsætte det? i main funktionen?
Avatar billede driis Nybegynder
22. maj 2003 - 19:22 #9
#include <windows.h>
Skal stå øverst, sammen med dine andre #include direktiver.
Funktionerne kan du bruge, hvor du nu har brug for dem i din kode.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:24 #10
OK, men jeg får stadig fejl, i

SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

som jeg har skrevet inden u main funktionen.
Avatar billede driis Nybegynder
22. maj 2003 - 19:26 #11
Post lige koden her, så. Hvilken fejl får du ? Du har ikke svaret på, om du har husket linien
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
før du forsøger at bruge SetConsoleTextAttribute
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:27 #12
Vil i ikke poste et eksempel, der med sikkerhed dur? )altså ikke i små stumper, som jeg skal sammensætte, for jeg er helt newbie, så det kan jeg ikke finde ud af :o(
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:28 #13
Her er hele koden:

#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{

  SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
  SetConsoleTitle("YabiSoft lommeregner");
   
  int tal1;
  char hvad, input;
  int tal2;
  int resultat;


  cout << "Velkommen til YabiSoft's lommeregner! :o) \n Indtast først et tal, lav et mellemrum, \n indtast dit tegn [+, -, *, /] \n og lav mellemrum, indtast et tal, og tryk <enter> \a";
do
{
  cin >> tal1;
  cin >> hvad;
  cin >> tal2;
 
  if (hvad == '+')
    resultat = tal1 + tal2;
    else if (hvad == '-')
      resultat = tal1 - tal2;
    else if (hvad == '*')
      resultat = tal1 * tal2;
    else if (hvad == '/')
      resultat = tal1 / tal2;
 
  cout << "\n";
  cout << tal1;
  cout << " ";
  cout << hvad;
  cout << " ";
  cout << tal2;
  cout << " = ";
  cout << resultat;
  cout << "\n \n";
 
cout << "Vil du lave en ny beregning [j, n] ? ";
cin >> input;
}while(input != 'n');
  if (input = 'n');
{
cout << "////////////////////////////////////////////////////\n";
cout << "//  Copyright (C) 2003, af Anders fra YabiSoft  //\n";
cout << "//                                                //\n";
cout << "//        Besøg venligst www.snuseren.dk        //\n";
cout << "//                                                //\n";
cout << "///////////////////////////////////////////////////\n\a"; 

  system("PAUSE");   
  return 0;
}
Avatar billede driis Nybegynder
22. maj 2003 - 19:29 #14
soreno's første eksempel dur da helt fint, hvis du copy-paster det hele ind ? (altså uden at blande det med noget andet kode).
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:31 #15
Efter jeg har husket HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);, kan den compile fint. Meen baggrundsfarven er den samme - sort.
Avatar billede driis Nybegynder
22. maj 2003 - 19:32 #16
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
Den linie SKAL stå før SetConsoleTextAttribute ! Denne funktion returnerer et handle til konsolvinduet, som SetConsoleTextAttribute skal bruge.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:33 #17
Det gør det også da, men det er kun noget af teksten. BG'en er stadig sort.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:33 #18
Det gør den også.
Avatar billede soreno Praktikant
22. maj 2003 - 19:35 #19
Kig på disse (en gentagelse af driis' kommentar):
Attribute Meaning
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensifi

Bruges sådan:
SetConsoleTextAttribute(hConsole, BACKGROUND_RED | BACKGROUND_GREEN | FOREGROUND_BLUE);
Avatar billede driis Nybegynder
22. maj 2003 - 19:35 #20
Så skal du bruge nogle af dem her:
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.

Til at kombinere en baggrundsfarve, f.eks.
SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
Giver blå baggrund. Baggrunden skifter først når du skriver på skærmen.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:38 #21
ok, hvad er der galt her?:

#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle("YabiSoft lommeregner");
  BACKGROUND_BLUE Background color contains blue.
  BACKGROUND_GREEN Background color contains green.
  BACKGROUND_RED Background color contains red.
  BACKGROUND_INTENSITY Background color is intensified.
  SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
     
  int tal1;
  char hvad, input;
  int tal2;
  int resultat;


  cout << "Velkommen til YabiSoft's lommeregner! :o) \n Indtast først et tal, lav et mellemrum, \n indtast dit tegn [+, -, *, /] \n og lav mellemrum, indtast et tal, og tryk <enter> \a";
do
{
  cin >> tal1;
  cin >> hvad;
  cin >> tal2;
 
  if (hvad == '+')
    resultat = tal1 + tal2;
    else if (hvad == '-')
      resultat = tal1 - tal2;
    else if (hvad == '*')
      resultat = tal1 * tal2;
    else if (hvad == '/')
      resultat = tal1 / tal2;
 
  cout << "\n";
  cout << tal1;
  cout << " ";
  cout << hvad;
  cout << " ";
  cout << tal2;
  cout << " = ";
  cout << resultat;
  cout << "\n \n";
 
cout << "Vil du lave en ny beregning [j, n] ? ";
cin >> input;
}while(input != 'n');
  if (input = 'n');
{
cout << "////////////////////////////////////////////////////\n";
cout << "//  Copyright (C) 2003, af Anders fra YabiSoft  //\n";
cout << "//                                                //\n";
cout << "//        Besøg venligst www.snuseren.dk        //\n";
cout << "//                                                //\n";
cout << "///////////////////////////////////////////////////\n\a"; 

  system("PAUSE");   
  return 0;
}
Avatar billede soreno Praktikant
22. maj 2003 - 19:40 #22
Det er parametre til funktionen SetConsoleTextAttribute. De skal ikke stå alene.

Sådan:
  SetConsoleTextAttribute(hConsole, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
Avatar billede soreno Praktikant
22. maj 2003 - 19:40 #23
Dette:
if (input = 'n');
{
cout << "////////////////////////////////////////////////////\n";
cout << "//  Copyright (C) 2003, af Anders fra YabiSoft  //\n";
cout << "//                                                //\n";
cout << "//        Besøg venligst www.snuseren.dk        //\n";
cout << "//                                                //\n";
cout << "///////////////////////////////////////////////////\n\a";


Kan effektiviseres sådan:
cout << "////////////////////////////////////////////////////\n";
cout << "//  Copyright (C) 2003, af Anders fra YabiSoft  //\n";
cout << "//                                                //\n";
cout << "//        Besøg venligst www.snuseren.dk        //\n";
cout << "//                                                //\n";
cout << "///////////////////////////////////////////////////\n\a";
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:44 #24
ok. Men det er altså ikke der fejlen kommer.

Fejlen er denne linje:  BACKGROUND_BLUE Background color contains blue.
Avatar billede soreno Praktikant
22. maj 2003 - 19:47 #25
Slet de linier. Det er ikke valid kode.

int main(int argc, char *argv[])
{

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle("YabiSoft lommeregner");
  BACKGROUND_BLUE Background color contains blue.
  BACKGROUND_GREEN Background color contains green.
  BACKGROUND_RED Background color contains red.
  BACKGROUND_INTENSITY Background color is intensified.
  SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
   
  int tal1;
  char hvad, input;
  int tal2;
  int resultat;

Skal være:

int main(int argc, char *argv[])
{

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle("YabiSoft lommeregner");
  SetConsoleTextAttribute(hConsole, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
   
  int tal1;
  char hvad, input;
  int tal2;
  int resultat;
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 19:51 #26
okay, men det ændrer altså ikke på selve bg farven - det ændrer kun på baggrunden på teksten. Ikke hele vinduet.
Avatar billede soreno Praktikant
22. maj 2003 - 19:57 #27
Så lav en workaround (utestet):

int main(int argc, char *argv[])
{

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle("YabiSoft lommeregner");
  SetConsoleTextAttribute(hConsole, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY) ;
  system("cls");

  int tal1;
  char hvad, input;
  int tal2;
  int resultat;
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:03 #28
Det virker bare perfekt!

TAKKER!

Også tak til Driis, men det var soreno's svar, der virkede, så han får points.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:07 #29
Hvad hedder farven lyseblå?
Avatar billede soreno Praktikant
22. maj 2003 - 20:10 #30
Måske:
SetConsoleTextAttribute(hConsole, BACKGROUND_BLUE | BACKGROUND_INTENSITY);

Du har ikke mulighed for at kombinere mere end med disse:
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensifi

Det giver ikke specielt mange farver.
16 Foreground farver og 16 Background farver.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:10 #31
Der er bare nogle farver der ikke virker, som f.eks. WHITE. Hvordan kan det være?
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:11 #32
ok, altså man kan ikke lave hvid baggrund?
Avatar billede soreno Praktikant
22. maj 2003 - 20:12 #33
Dette:
BACKGROUND_BLUE | BACKGROUND_INTENSITY

blander blå med intensitet (som jeg forventer bliver lyseblå).

BACKGROUND_BLUE |BACKGROUND_RED
Giver (måske) gul.
Avatar billede soreno Praktikant
22. maj 2003 - 20:13 #34
Hvid er det samme som alle farver blandet sammen (Rød, Grøn og Blå tændt).

BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED
Giver nok en grå farver.

BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY
Giver nok en hvid farve.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:14 #35
BACKGROUND_BLUE | BACKGROUND_INTENSITY giver mørkeblå.

Men man kan jo ikke blande sig til hvid, hvad gør man så?
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:15 #36
Hvis jeg bruger  BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY

får jeg fejl i system("cls");
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:16 #37
og hvis man så sletter system("cls");, får man bare fejl i den næste linje.
Avatar billede soreno Praktikant
22. maj 2003 - 20:16 #38
Så er det nok:
BACKGROUND_BLUE

der giver lyseblå.
Avatar billede soreno Praktikant
22. maj 2003 - 20:17 #39
Post lige linie før den der giver fejl
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:18 #40
ok. Havde glemt ; for enden.

Men når det bliver kompileret med BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY kommer der bare en sort farve.
Avatar billede snuseren.dk Nybegynder
22. maj 2003 - 20:21 #41
Jaa, det virker :o)

Det var mig der havde lavet en fejl.

(Havde glemt det første (hehe) )

Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester