Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Näyttötilan vaihtaminen

Olli Vanhoja [09.07.2003 17:33:35]

#

Eilikkä c++:salla näyttötilan vaihto. Tuo alku on ripattu jostain vanhasta koodin pätkästä.
Ohjelma eivälttämättä toimi WindowsXPeessä kunnolla esim. jotkut tilat eivät toimi tai tulee siniseksi teksti.

vaihto.cpp

#include <iostream>
#include <stdlib.h> //atoita varten
#include <conio.h> //system (pause komennon suoritusta varten)
using namespace std;

void svm(int x) /*funktio grafiikka tilan vaihtamiseen. Optimoimisen varaa olisi,
					mutta koodin pätkä on ripattu jostain vanhasta ohjelmasta.*/
{
	int a = 0;
   int b = 1;
   int c = 2;
   int d = 3;
   int e = 4;
   int f = 5;
   int g = 6;
   int h = 7;
   int i = 8;
   int j = 9;
   int k = 10;
   int l = 11;
   int m = 12;
   int n = 13;
   int o = 14;
   int p = 15;
   int q = 16;
   int r = 17;

	if (x == a)
		{
      	//40x25 mono(16) teksti
  			asm {
   				mov ax, 0000h
   				int 10h
         }
		}
	if (x == b)
   	{
      	//40x25 16 teksti
      	asm {
      			mov ax, 0001h
            	int 10h
         }
      }
   if (x == c)
   	{
      	//80x25 mono(16) teksti
      	asm {
      			mov ax, 0002h
            	int 10h
         }
      }
   if (x == d)
   	{
      	//80x25 16 teksti
      	asm {
      			mov ax, 0003h
            	int 10h
         }
      }
   if (x == e)
   	{
      	//320x200 4 grafiikka
      	asm {
      			mov ax, 0004h
            	int 10h
         }
      }
   if (x == e)
   	{
      	//320x200 mono(4) grafiikka
      	asm {
      			mov ax, 0005h
            	int 10h
         }
      }
   if (x == f)
   	{
      	//640x200 2 grafiikka
      	asm {
      			mov ax, 0006h
            	int 10h
         }
      }
   if (x == g)
		 {
       	//80x25 mono(2) teksti
       	asm {
       			mov ax, 0007h
            	int 10h
         }
       }
   if (x == h)
   	{
     		//160x200 16 grafiikka
      	asm {
      			mov ax, 0008h
            	int 10h
         }
      }
   if (x == i)
   {
   	//320x200 16 grafiikka
   	asm {
   			mov ax, 00009h
         	int 10h
      }
	}
   if (x == j)
   {
   	//640x200 4 grafiikka
   	asm {
   			mov ax, 000Ah
     	      int 10h
      }
   }
   if (x == k)
   {
   	//320x200 16 grafiikka
   	asm {
   			mov ax, 000Dh
    			int 10h
      }
   }
   if (x == l)
   	{
      	//640x200 16 grafiikka
      	asm {
      			mov ax, 000Eh
            	int 10h
         }
      }
   if (x == m)
   	{
      	//640x350 mono(2) grafiikka
      	asm {
      		  mov ax, 000Fh
           	  int 10h
         }
      }
   if (x == n)
   	{
      	//640x350 4 grafiikka
    	  asm {
      			mov ax, 0010h
         	   int 10h
        }
      }
   if (x == o)
   	{
      	//640x350 2 grafiikka
    	  asm {
 		     		mov ax, 0011h
      	      int 10h
        }
      }
   if (x == p)
   	{
      	//640X480 16 grafiikka
    	  asm {
      		mov ax, 0012h
        	   int 10h
        }
      }
   if (x == q)
   	{
      	//320x200 256 grafiikka
      	asm {
      			mov ax, 0013h
            	int 10h
         }
      }
   if (x == r)
   {
   	//640x480 256 grafiikka??? En ole varma mikä tila luultavasti 640x480, suurempiakin voi yrittää
      	asm {
      			mov ax, 0014h
         	   int 10h
      	}
      }
}
int main()
{
   char in[80]; //näyttötilan kirjoitus puskuri
	int mode; //näyttötila
   int small = 0; //pienin näyttötila
   char big = 17; //suurin näyttötila
   int NTILA; //näyttötilan tallentamiseen

   //nykyisen näyttötilan tallennus
   asm {
   		mov ah, 0Fh //haetaan nykyinen näyttötila
         int 10h //kutsu BIOS-palvelu
         mov NTILA, al //tallenna näyttötila
   }
   // silmukka uuden näyttötila numeron vastaan ottamiseen
   while(1)
   {
   	cout << "Press key 0-17 to select video mode:\n";
   	cin >> in; //vastaan otetetaan tilan numero
      mode=atoi(in); //muunnetaa in(char)->mode(int)
   	if((small > mode)||(big < mode)) /*varmistetaan, että syötetty näyttötila
      											numero on oikealta alueelta*/
		{
      cout << "Wrong videomode number!\n"; //Nyt ei kyllä ole oikea
   	}
   	else
   		break; //keskeytetään while
   }

	cout << "\nChanging video mode...\n";
   svm(mode); //kutsutaan svm javaihdetaan näyttötila
   system("pause"); /*järjestelmä komento joka pysäyttääsyötteen kunnes käyttäjä
   					 painaa jotain näppäintä*/

   // Palautetaan alkuperäinen näyttötila
   asm {
   		mov al, NTILA //vanha näyttötila
         xor ah, ah //AH = 0 -aseta näyttötila
         int 10h //kutsu BIOS-palvelu
   }

   return(0);
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta