# Hintergrundbild einfuegen?



## tetzlaff (22. Februar 2005)

Ich bin Anfänger in C++. Wie fügt man am einfachsten ein Hintergrundbild ein? Bitte Programmbeispiel mit ausführlicher Erklärung.


----------



## MFC openGL (22. Februar 2005)

Wo willste das denn einfügen ?  in den Windows Hintergrund oder als Hintergrund in dein Programm ?

 Und dann wieder die Fragen weil du die "Wie stelle ich eine Frage richtig" nicht gelesen hast...

 Betriebssystem, Entwicklungsumgebung ?


----------



## tetzlaff (22. Februar 2005)

Sorry, natürlich als Hintergrund in meinem Programm. Ich frage das erste mal in diesem Forum, habe die Rubrik "Wie frage ich richtig" noch nicht gelesen.


----------



## Tobias K. (22. Februar 2005)

moin




> Sorry, natürlich als Hintergrund in meinem Programm



Ahhhhja, jetzt wissen wir leider auch nciht viel mehr als vorher.
Beantworte mal folgende Fragen:
Welche Sprache (C/C++/MFC/API)?
Eine Konsolenanwendung?
Welcher Compiler?
Welche IDE?
Welches Betriebssystem?

Wenn du schon ein Beispiel mit ausführlicher Beschreibung haben willst (übrigens will man nciht, man möchte!), dann muss erstmal was von dir kommen, weil sonst keiner helfen kann.


mfg
umbrasaxum


----------



## tetzlaff (22. Februar 2005)

Win32 Konsolenanwendung, C++, 
Betriebssystem Windows XP Home,
Microsoft Visual Studio C++ 6.0



Wer hat geschrieben ich will?


----------



## Tobias K. (22. Februar 2005)

moin


Keiner hat das geschrieben.

Guckmal hier, vielleicht hilft es dir, wenn du danach noch Fragen hast, frag.
http://www.tutorials.de/tutorials187283.html&highlight=handle
http://www.tutorials.de/tutorials186707.html&highlight=handle


mfg
umbrasaxum


----------



## tetzlaff (3. März 2005)

Es hat leider nicht funktioniert.
Kann mir bitte jemand einen einfachen Code schreiben, so das ihn auch ein Anfänger versteht?


----------



## Tobias K. (3. März 2005)

moin


Wirklich verstehen kann man das nur mit dem nötigen Grundwissen.

Einfacher geht es nicht:

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


void main(void)
{
	SetConsoleTitle("Bild");
	HWND hWnd = FindWindow(NULL, "Bild");
	
	HDC hDC = GetDC(hWnd);
	
	HBITMAP hBitmap = (HBITMAP)LoadImage(0, "karten.bmp", IMAGE_BITMAP, 0, 0,
				LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
	
	HDC hdcmem = CreateCompatibleDC(hDC);
	
	SelectObject(hdcmem, hBitmap);

	BitBlt(hDC, 0, 0, 100, 100,
				hdcmem, 0, 0, SRCCOPY);

	ReleaseDC(hWnd, hDC);
	DeleteObject(hBitmap);
	


	std::cin.get();
}
```


mfg
umbrasaxum


----------



## tetzlaff (10. März 2005)

std::cin.get();  

Bei dieser Zeile habe ich folgende Fehlermeldung bekommen:

Keine Klasse oder Namespace.

Das Hintergrundbild wurde in meinem C++ Editor angezeigt, nicht in dem von mir programmierten Programm. Das Fenster war schwarz.


----------



## Tobias K. (10. März 2005)

moin


Dann konnte das Bild wohl nicht gefunden werden, versuch nochmal folgendes.

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


void main(void)
{
	SetConsoleTitle("Bild");
	HWND hWnd = FindWindow(NULL, "Bild");

	HDC hDC = GetDC(hWnd);

	HBITMAP hBitmap = (HBITMAP)LoadImage(0, "karten.bmp", IMAGE_BITMAP, 0, 0,
		LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);

	if(!hBitmap)
		MessageBox(hWnd, "Bild nicht gefunden!", "Fehler", NULL);

	HDC hdcmem = CreateCompatibleDC(hDC);

	SelectObject(hdcmem, hBitmap);

	BitBlt(hDC, 0, 0, 100, 100,
		hdcmem, 0, 0, SRCCOPY);

	ReleaseDC(hWnd, hDC);
	DeleteObject(hBitmap);

	cin.get();
}
```


mfg
umbrasaxum


----------



## tetzlaff (10. März 2005)

Habe  deine Änderung eingefügt. Das Bild ist immer noch oben links in der Ecke.
Manchmal ist es zum Teil auf meinem Programmfenster. Muß ich das Fenster positionieren oder die Größe ändern. Wie geht das eigentlich?


----------



## Tobias K. (10. März 2005)

moin


Fenster Positionieren mit:

```
BOOL SetWindowPos(
    HWND hWnd,
    HWND hWndInsertAfter,
    int X,
    int Y,
    int cx,
    int cy,
    UINT uFlags
);
```


Und Bild anzeigen und größe beeinflussen mit:

```
BOOL BitBlt(
  HDC hdcDest, // handle to destination DC
  int nXDest,  // x-coord of destination upper-left corner
  int nYDest,  // y-coord of destination upper-left corner
  int nWidth,  // width of destination rectangle
  int nHeight, // height of destination rectangle
  HDC hdcSrc,  // handle to source DC
  int nXSrc,   // x-coordinate of source upper-left corner
  int nYSrc,   // y-coordinate of source upper-left corner
  DWORD dwRop  // raster operation code
);
```


mfg
umbrasaxum


----------



## tetzlaff (10. März 2005)

Erst mal vielen Dank für deine Antworten.

 Das Fenster " Bild" hat er gefunden.
 Fenster positionieren und Größe verändern muß ich noch ausprobieren.


----------



## tetzlaff (10. März 2005)

Das Hintergrundbild habe ich eingefügt. Wenn ich das Fenster an den Kanten entlangbewege, wird das Hintergrundbild dort gelöscht. Ich habe es mit malloc versucht. Habe aber immer eine Fehlermeldung bekommen ( siehe unten). Was habe ich falsch gemacht? Gibt es noch eine andere Möglichkeit das Hintergrundbild zu erhalten. Das Fenster positionieren hat leider nicht geklappt.



CHAR_INFO* SaveRect(int left,int top, int width, int height)

{
	COORD bc = {0,0},
		bs = {width, height};
	SMALL_RECT sr = {left, top, left+width-1, top + height-1};
	CHAR_INFO* cip = malloc(width*height*sizeof(int));
	ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),
		cip, bs, bc, &sr);
	return cip;
}
//'initializing' : 'void *' kann 
// nicht in 'struct _CHAR_INFO *' konvertiert werden
// Konvertierung von 'void*' in Zeiger auf nicht-'void'
// erfordert eine explizite Typumwandlung


void RestoreRect (CHAR_INFO* cip, int left, int top, int width, int height)
{
	COORD          bc = {0,0},
		bs = { width, height};
	SMALL_RECT sr = {left, top, left + width - 1, top + height - 1};

	WriteConsoleOutput ((STD_OUTPUT_HANDLE),cip, bs, bc, &sr);
	free (pci);
}


----------



## tetzlaff (18. März 2005)

Das Hintergrundbild habe ich eingefügt. Wenn ich das Fenster an den Kanten entlangbewege, wird das Hintergrundbild dort gelöscht. Außerdem wird das Hintergrundbild zum Teil über das Fenster rübergemalt, also auch auf meinen Editor. Über eine gute Idee würde ich mich freuen.


----------



## Daniel Toplak (18. März 2005)

Erstell dir ein Fenster (Konsolenanwendungen sind nicht für Bilder geeignet, auch wenn es funktioniert) mit CreateWindow() dann must du eine Nachrichten-Callbackfunktion bauen (WndProc). Darin kannst du WM_DRAW-, WM_MOVE-, usw... Nachrichten behandeln.
Das Ganze ist Grundlage von Windowsprogrammierung.

Warum wollt ihr immer mit komplizierten Sachen wie Bilder blitten, 3D Sachen usw. anfangen?

Übrigens das Beispiel von Umbrasaxum soll nur ein Anhaltspunkt für einen Bitblit sein.

Gruß Daniel


----------



## Tobias K. (19. März 2005)

moin


Ja, Daniel Toplak hat recht.
Es ist nur ein Beispiel wie es im Prinzip gehen würde.
Die Konsole ist einfach nicht für Bilder da.
Wenn man was mit Bildern machen will, sollte man sich mit Windowsprogrammierung beschäftigen.

Das Beispiel wird übrigens (fast) genauso in der Windowsprogrammierung verwendet.


mfg
umbrasaxum


----------



## Flegmon (19. März 2005)

Hallo,

ich würde dir auch empfehlen auf Windows Anwendungen umzusteigen.
Es dauert zwar etwas bis man volkommen den Durchblick mit Windows hat.
Aber es lohnt sich. Irgendwann will man gar kein Konsolenprogramm mehr schreiben.
Und wenn das mit Grafischen möglichkeiten noch nicht genug ist, kann man noch OpenGl oder DirectX benutzen.


----------

