JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7411862cde5c838924ae8d11f44e5a10Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Grafikspeicher/Windows/Visual C++

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
fedaYkin
Mini JLI'ler



Anmeldedatum: 02.12.2002
Beiträge: 10
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 02.12.2002, 10:30    Titel: Grafikspeicher/Windows/Visual C++ Antworten mit Zitat

hi, mein name ist tobias und ich komm aus österreich.

mein problem hat eigentlich nixhts mit direkter spieleprogrammierung zu tun, sondern mit meiner diplomarbeit, welche ich mit zwei klassenkollegen versuch zu realisieren Smile.

unsere arbeit besteht aus 3 teilen: der hardware, der software, und der schnittstelle zwischen den beiden. ich bin für software verantwortlich. unser ziel ist es, einfache grafiken für blinde mit hilfe einer speziellen vorrichtung zu "visualisieren". die hardware will ich jetz nicht näher erklären aber ich will sagen, dass das ausgabe feld 7x7 felder gross ist.

folgendes brauche ich: wenn zb auf dem bildschirm eine einfache schwarze vertikale linie (ein pixel breit) auf weißem hintergrund zu sehen ist wird folgendes in binärem code in eine datei gespeichert, um dann eben wieder ausgegeben zu werden:

0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0

wenn die auflösung des bildschirms höher wird, werden dann auch dementsprechen mehrere pixel zu einem zusammengefasst. dunklere farben werden zu 1, helle zu 0.

das ganze soll in visual c++ von microsoft realisiert werden.

das problem ist, dass wir uns völlig neu einarbeiten müssen, was zum teil auch schon passiert ist, aber unser wissen reicht leider noch nicht um den ganzen code völlig allein zu schreiben.

meine frage: wie kann ich von visual c++ auf den windowsgrafikspeicher zugreiffen und gibt es bereits irgendwo quellcode dafür?

es ist wirklich sehr dringend Smile

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 02.12.2002, 15:02    Titel: Antworten mit Zitat

Was bitte ist "Windowsgrafikspeicher"? Meinst du virtuellen Speicher? Normalerweise:

Windows = Betriebssystem = Software
und
Grafikspeicher = Hardware
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MAG
Mini JLI'ler



Anmeldedatum: 21.11.2002
Beiträge: 15
Wohnort: Falkenrehde/Brandenburg/Deutschland
Medaillen: Keine

BeitragVerfasst am: 02.12.2002, 16:51    Titel: Antworten mit Zitat

Man Hazel, du scheinst das '='-Zeichen ja zu lieben! Very Happy

Wie auch immer, zum Thema.
Meinst du vielleicht mit " wie kann ich von visual c++ auf den windowsgrafikspeicher zugreiffen " eventuell eine Grafikausgabe auf den Bildschirm?
Zum Beispiel über die Standartausgabefunktionen für Konsolenanwendungen.Dann kannst du es folgender Maßen machen:
Code:

#include <iostream.h> // Lib for Standartausgabefunktionen des Betriebssystems

void main() // Hauptfunktion
{
        char* string = "Hallo Welt!";
        cout << "Jetzt folgt ein Text: " << string << endl; // Ausgabe von statischen Text und einer String-Variablen
        return(0);
}


So macht man das Standartmäßig mit Schrift.Aber, da du Linien erwähntest, brauchst du wahrscheinlich die Win32 API.
Das sieht dann ungefähr so aus:

Code:

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

HWNDhwnd;
HINSTANCE hinst;

void Init();
void Main();
void Exit();

////==============

void Init()
{
// Initialisierungen
}

void Main()
{
// wie main() bei Konsolenanwendung
                                hDC = GetDC(hWnd);
                                                MoveToEx(hDC,0,0,NULL);
                                                LineTo(hDC,800,600); // Eine Linie Quer über den Bildschirm
ReleaseDC(hWnd,hDC);
}

void Exit()
{
// Freigabe von Objekten etc.
}

LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
done = TRUE;
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wparam)
{
case VK_ESCAPE:
PostMessage(hwnd,WM_CLOSE,0,0);
return 0;
break;
}
default:break;
}
return (DefWindowProc(hwnd,message,wparam,lparam));
}

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPSTR lpcmdline,int ncmdshow)
{
WNDCLASSEXwinclass;
MSGmessage;
const charszclassname[] = "ProgrammKlasse";
DWORDloop_start_time;

winclass.cbSize= sizeof(WNDCLASSEX);
winclass.style= CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc= WindowProc;
winclass.cbClsExtra= 0;
winclass.cbWndExtra= 0;
winclass.hInstance= hinst;
winclass.hIcon= LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor= LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
winclass.lpszClassName= szclassname;
winclass.lpszMenuName= NULL;
winclass.hIconSm= LoadIcon(NULL);

if(!RegisterClassEx(&winclass))
{
return 0;
}

if(!(hwnd = CreateWindowEx(NULL,szclassname,"TryGame 2002",WS_POPUPWINDOW | WS_VISIBLE,0,0,SCREEN_BREITE,SCREEN_HOEHE,NULL,NULL,hinst,NULL)))
{
return 0;
}

Init();

while(!done)
{
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(message);
DispatchMessage(message);
}

loop_start_time = GetTickCount();
Main();

while( (GetTickCount() - loop_start_time) < 40);
}
Exit();
return message.wParam;
}


Oder wie meintest du das?(Übrigens kannst du mit DirectX per Zeigern wirklich direkt auf die Grafikoberfläche zugreifen)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 02.12.2002, 18:03    Titel: Antworten mit Zitat

Du kannst dir ein Gerätekontext des Desktops besorgen. Mit diesem Kontext kannst du dann ein Bitmap erstellen, daß du beliebig weiter verarbeiten kannst. Der Kontext des Desktop muß allerdings sehr schnell wieder freigegeben werden, weil es sonst zu inkonsequenzen zwischen dem Desktopinhalt und dem Kontext kommt. Es ist zwar technisch sogar möglich, auf diesen Kontext Zeichenoperationen auszuführen, allerdings ist das ja weder dein Anliegen, noch besonders schön, in fremden Fenstern zu Zeichnen...
Mir fällt die bebötigte Funktion im Augenblick nicht ein, aber such in der MSDN mal nach Desktop und Kontext und DC...

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fedaYkin
Mini JLI'ler



Anmeldedatum: 02.12.2002
Beiträge: 10
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 03.12.2002, 11:20    Titel: Antworten mit Zitat

irgendwie scheint mir hier keine antwort "richtig" zu sein... Smile vielleicht kenn ich mich aber auch nur zu wenig aus.

ich meinte jedes pixel, das auf dem bildschirm wiedergegeben wird hat ha eine bestimmte farbe. bei einer standardaufläsung von 1024x768 hat man fast 800000 pixel am bildschirm, und jedes hat eine bestimmte farbe. ich wollte wissen, wie man die farbe eines bestimmten pixel, in dem fall der pixel auf dem der mauszeiger steht und die drum herum, erfahren kann (eben mit visual c++ 6.0). ich "zeichne" es noch mal auf -->

0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 X 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0

X stellt die mauszeigerspitze an, die einser die vertikale schwarze linie. links und rechts neben der linie ist es weiss, also stehen nullen da. das ist die form, in der ich die info mit dem programm das ich zu schreiben versuche, in einer datei abspeichern will. die wird dann weiterverarbeitet.

ich muss jetz einfach nur wissen, wo in der hardware gespeichert ist, des dieses smiley --> Confused gelb ist und wie kann ich auf diese information zugreiffen?

ich find einfach nix was mit weierhelfen könnte ... Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fedaYkin
Mini JLI'ler



Anmeldedatum: 02.12.2002
Beiträge: 10
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 03.12.2002, 11:29    Titel: Antworten mit Zitat

AFE-GmdG hat Folgendes geschrieben:
Du kannst dir ein Gerätekontext des Desktops besorgen. Mit diesem Kontext kannst du dann ein Bitmap erstellen, daß du beliebig weiter verarbeiten kannst. Der Kontext des Desktop muß allerdings sehr schnell wieder freigegeben werden, weil es sonst zu inkonsequenzen zwischen dem Desktopinhalt und dem Kontext kommt. Es ist zwar technisch sogar möglich, auf diesen Kontext Zeichenoperationen auszuführen, allerdings ist das ja weder dein Anliegen, noch besonders schön, in fremden Fenstern zu Zeichnen...
Mir fällt die bebötigte Funktion im Augenblick nicht ein, aber such in der MSDN mal nach Desktop und Kontext und DC...

AFE-GmdG


in einem anderen (englischen) forum hab ich eine ähnliche antwort erhalten, nur leider bin ich nicht so ein profi, als dass ich damit etwas konstruktives anfangen könnte :/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 03.12.2002, 13:06    Titel: Antworten mit Zitat

Ich habe mal ein Beispielprogramm "Rotation" geschrieben, bei dem eine Bitmap gedreht wird. Dazu habe ich mir von einem Bitmap ein DC geben lassen, und die passenden farben ausgelesen. Die Technik ist die selbe, schau dir das Programm mal an:
Rotation

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MAG
Mini JLI'ler



Anmeldedatum: 21.11.2002
Beiträge: 15
Wohnort: Falkenrehde/Brandenburg/Deutschland
Medaillen: Keine

BeitragVerfasst am: 03.12.2002, 15:26    Titel: Antworten mit Zitat

Ach du willst also auf einzelne Pixel des Bildschirmspeichers zugreifen?
Na dann, nimm doch die Win32-API Funktion GetPixel():
Code:

COLORREF GetPixel(
  HDC hdc,   // handle to device context
  int XPos,  // x-coordinate of pixel
  int nYPos  // y-coordinate of pixel
)


Zurückgegeben wird die Farbe des Pixels als RGB-Wert(deshalb auch der Rückgabetyp COLORREF!)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fedaYkin
Mini JLI'ler



Anmeldedatum: 02.12.2002
Beiträge: 10
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 04.12.2002, 09:19    Titel: Antworten mit Zitat

hey super, der befehl dürft mir weiterhelfen Smile

gibts das jetz die koordinaten der maus wieder?

und wie schaut ein RGB wert aus?

mal schaun...

*up*

ich hab grad in der MSDN library gelesen, das es nur in dem spezifischen programmfenster funktioniert. kann man das auch auf den ganzen bildschirm ausdehnen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 04.12.2002, 12:39    Titel: Antworten mit Zitat

Mit GetWindowDC(NULL); bekommt man das Fensterhandle des Desktops. Das Handle wendest du dann in Kombination mit der aktuellen Mausposition mit GetPixel() an und du hast die Farbinfo, die du haben willst.
COLORREF ist ein 32-Bit-Datentyp, der je 8 Bit für Rot, Grün und Blau definiert, die letzten 8 Bit sind unbelegt.

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum