Hintergrund in Fenstern ändern. ( C++ )
-
Auch mit 3 Jahren Englisch kann man die MSDN lesen...
Ansonsten stelle "konkrete" Fragen "was" Du nicht verstehst!
Es sei Dir hier schon als Übung angeraten Dich mit Englsich vertraut zu machen, denn die meisten (ergiebigen) Quellen zur Programmierung wirst Du nur in dieser Sprache finden.Es dürfte nicht schwer sein sich aus den Informationen WM_ERASEBKGND und StretchBlt etwas zusammen zu googlen.
Ich sehe hier kein Problem, dass nicht mit etwas Eigeninitiative gelöst werden kann.Just my 2 cents.
-
ja also ich komm mit dem 5. Parameter garnicht zu recht.
und auser dem versteh ich nicht wo ich hinschreiben soll in welchem Verzeichniss das Bild ist.( Link zu Msdn seite: )
http://msdn.microsoft.com/de-de/library/3k5s37a5%28v=VS.80%29.aspx
-
Da warst du bei der falschen Funktion. Richtig: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145120.aspx
-
Ok Aber hier verstehe ich nicht was ich in die HDC Handel rein schreiben soll.
Und überhaupt ich möchte ein bmp in den Hintergrund einfügen dieses Bitmap
habe ich in C:\\Users\\TS Tim\\Pictures\\Wise.bmp gespeichert.Aber so langsam bin ich mir nicht sicher ob das auch mit der StretchBlt
Funktion möglich ist.könntet ihr mir vielecht ein beispiel geben
-
dot schrieb:
Da warst du bei der falschen Funktion. Richtig: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145120.aspx
Wie wäre es wenn Du die benötigten Stellen einfach aus dem dort verlinkten
Beispiel übernehmen würdest ? (For an example, see Scaling an Image.)Dort findet sich z.B.
//Gets the device context for the current window hDC = GetDC(hWnd);
Oder wenn man es in WM_PAINT braucht auch:
//Begin drawing hDC = BeginPaint(hWnd, &ps); ... EndPaint(hWnd, &ps);
Die benötigte Grösse für die Bitmap findet sich ebenfalls im Beispiel:
//Draw and fill rectangles for the background GetClientRect(hWnd, &clientRect);
Wo ist denn konkret das Problem ?
-
Ist schon ewig her, dass ich was mit GDI gemacht hab, daher hab ich evtl. was vergessen, aber rein vom Prinzip her folgender Ablauf:
- hbrBackground deiner WindowClass auf Null setzen.
- Z.B. in WM_CREATE ladest du dein Bild z.B. per LoadImage(), holst dir per GetDC() einen Device Context (DC) für dein Fenster und erzeugst mit CreateCompatibleDC() einen, mit dem Fenster kompatiblen, Memory DC. Dann selektierst du per SelectObject() deine Bitmap in deinen Memory DC und merkst dir die alte Bitmap aus dem DC (Rückgabewert von SelectObject()). ReleaseDC() auf dem Fenster DC nicht vergessen.
- In WM_ERASEBKND malst du per StretchBlt() dein Bild (hDC fürs Fenster findet sich im wParam).
- Am Ende natürlich alles entsprechend freigeben, vor dem DeleteDC() des, für deine Bitmap erzeugten, Memory DC die alte Bitmap wieder rein selecten.
Siehe auch: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145049.aspx
-
Ich glaub ich bin irgend wie zu blöd dafür ich hab den Code jetzt so um geändert
aber es passiert rein garnichts:
#include "stdafx.h" #include <Windows.h> const char szClassName[] = "MyClassEx"; char szTitle[] = "Fenster NO 1. | Copyright by JaRk Producktion © 2012"; LRESULT CALLBACK WndProc ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR szCmdLine, int szCmdShow ) { WNDCLASSEX WndClassEx; HWND hWnd; MSG msg; //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°RESTRIERUNG°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°// WndClassEx.cbSize = sizeof( WndClassEx ); WndClassEx.style = NULL; WndClassEx.lpfnWndProc = WndProc; WndClassEx.cbClsExtra = NULL; WndClassEx.cbWndExtra = NULL; WndClassEx.hInstance = hInstance; WndClassEx.hIcon = LoadIcon( NULL, IDI_ERROR ); WndClassEx.hCursor = LoadCursor( NULL, IDC_HAND ); WndClassEx.hbrBackground = NULL; WndClassEx.lpszMenuName = NULL; WndClassEx.lpszClassName = szClassName; WndClassEx.hIconSm = LoadIcon( NULL, IDI_APPLICATION); if( !RegisterClassEx( &WndClassEx )) { MessageBoxA(NULL, "Registrierungs Fehler! ", "Error ", MB_OK); return false; } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FENSTER ERSTELLEN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, szTitle, WS_OVERLAPPEDWINDOW | WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { MessageBoxA( NULL, "Fenster konnte nicht erstellt werden", "Error", MB_OK); return false; } ShowWindow( hWnd, szCmdShow ); UpdateWindow( hWnd ); while ( GetMessage ( &msg, hWnd, NULL, NULL) > NULL ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return 0; } HGDIOBJ h; HDC hdc; LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch (msg) { case WM_SIZE : RECT rect; GetClientRect( hWnd, &rect ); break; case WM_CREATE : h = LoadImage(NULL, "C:\\Users\\TS Tim\\Pictures\\Wise.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE); hdc = GetDC( hWnd ); CreateCompatibleDC( hdc ); SelectObject( hdc, h ); ReleaseDC( hWnd, hdc ); break; case WM_ERASEBKGND : StretchBlt( hdc, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hdc, rect.left, rect.top, rect.right, rect.bottom, SRCINVERT ); DeleteDC( hdc ); break; case WM_RBUTTONDOWN : MessageBox( NULL, "Rechte Maustaste ;)", "Super", MB_OK); break; case WM_QUIT: MessageBoxA( NULL, "Programm wurde beendet.", "ENDE ;)", MB_OK); DestroyWindow ( hWnd ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam ); } }
irgent wie ist das für meine C++ kenntnisse zu hoch::(:...
-
Du stocherst doch nur im Nebel rum.
StretchBlt benutzt zwei DCs einen Source DC und einen Target DC.
Du benutzt zweimal den gleichen.
Wie wäre es einfach mit Lesen, anstatt mit Try&Error.Zudem wurde Dir bereits gesagt, dass Du in WM_ERASEBKGND in wParam den entsprechenden Bildschirm DC bekommst.
-
ja logisch ich hab mir mal so ein bischen was zusammen gelesen und wollte nur so
neben bei wissen wie ich den hintergrund ändere aber das scheint ja für euch kein
problem zu sein und deshalb wolte ich auch nur ein kleines beispiel wie ich den Code verändern muss, um dann mit diesem Code zu lernen.
-
cppfan schrieb:
Ich glaub ich bin irgend wie zu blöd dafür ...
Da würden wir nicht wiedersprechen, aber daran könntest Du ja was ändern, oder ?
case WM_CREATE : { h = LoadImage(NULL, "C:\\Users\\TS Tim\\Pictures\\Wise.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE); if(h == NULL) { ... // call GetLastError. HDC hdc = GetDC( hWnd ); CreateCompatibleDC( hdc );
Hier ist fast jede Zeile schlecht:
1. Returnwert von LoadImage wird nicht geprüft
2. Fest codierter absoluter Pfad
3. HDC sollte nicht global sein (wozu auch ?)
3. CreateCompatibleDC ist sinnlos ohne Zuweisung der Returnwertescase WM_ERASEBKGND : StretchBlt( hdc, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hdc, rect.left, rect.top, rect.right, rect.bottom, SRCINVERT ); DeleteDC( hdc ); break;
Nach DeleteDC gibt es spätestens beim nächsten WM_ERASEBKGND Probleme, ist auch nicht notwendig hier (s. Kommentare)
Lies doch endlich mal !!!
Z.B. auch dies:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648055(v=vs.85).aspx
-
Super danke aber wenn meine funktionen so aussehen:
case WM_CREATE : HGDIOBJ h = LoadImage(NULL, "C:\\Users\\TS Tim\\Pictures\\Wise.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE); if(h == NULL) { // call GetLastError. MessageBox( hWnd, "bild konnte nicht geladen werden.", "Error", MB_OK); } HDC hdc = GetDC( hWnd ); CreateCompatibleDC( hdc ); break; case WM_ERASEBKGND : StretchBlt( hdc, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hdc, rect.left, rect.top, rect.right, rect.bottom, SRCINVERT ); DeleteDC( hdc ); break;
Dann kommen diese Fehler meldungen:
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(91): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(88): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(91): error C2360: Initialisierung von 'h' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(82): Siehe Deklaration von 'h'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(96): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(88): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(96): error C2360: Initialisierung von 'h' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(82): Siehe Deklaration von 'h'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(100): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(88): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(100): error C2360: Initialisierung von 'h' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(82): Siehe Deklaration von 'h'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(105): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(88): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(105): error C2360: Initialisierung von 'h' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(82): Siehe Deklaration von 'h'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(110): error C2361: Initialisierung von 'hdc' durch 'default'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(88): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(110): error C2361: Initialisierung von 'h' durch 'default'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(82): Siehe Deklaration von 'h'
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Und die grig ich nicht weg. Ich weis zwar schon was es bedeutet aber nicht wie ich den Code ändern muss das die weggehen
...
-
{ } wirken Wunder...
-
dot schrieb:
{ } wirken Wunder...
-
cppfan schrieb:
Super danke aber wenn meine funktionen so aussehen:
case WM_CREATE : HGDIOBJ h = LoadImage(NULL, "C:\\Users\\TS Tim\\Pictures\\Wise.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE); if(h == NULL) { // call GetLastError. MessageBox( hWnd, "bild konnte nicht geladen werden.", "Error", MB_OK); } HDC hdc = GetDC( hWnd ); CreateCompatibleDC( hdc ); break; case WM_ERASEBKGND : StretchBlt( hdc, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hdc, rect.left, rect.top, rect.right, rect.bottom, SRCINVERT ); DeleteDC( hdc ); break;
Die meisten von mir bereits angemerkten Fehler sind noch drin; einige neue
hinzugekommen. Leider bist Du nicht mal in der Lage den von mir geposteten
Code vollständig zu kopieren. So eine "{" steht nicht zufällig im Code ...Der Handle h macht da wo Du ihn jetzt hingepackt hast keinen Sinn. Der Hinweis
mit dem Rückgabewert CreateCompatibleDC ist sicher NICHT optional ...Offensichtlich weisst Du absolut nicht was das Code überhaupt machen soll,
obwohl Du bereits mehrere Links zu funktionierendem Code hast.Ich habe unter solchen Voraussetzungen keine Lust das weiter zu kommentieren.
-
Hat sich schon jemand den Titel des Fensters hinein gezogen? In Zeile 9 im ersten post...
-
Nun Wie du bereits erwähnt hast weis ich wirklich nicht was der code soll meine Frage War ja auch wie ich es Hin bekomme das sich die bilder ebn nicht aneinander reien sondern nur vergrösert oder verkleinert werden.
ach und -lowbyte- wen du JaRk meinst das hab ich blos so auf der Tastatur getipt und als n kumpel ( der Jan heist )meinte es hiese bestimt "Jan Riecht komisch" hab ich das so dofgefunden das ich das einfach so hingeschrieben hab
...
-
cppfan schrieb:
.... meine Frage War ja auch wie ich es Hin bekomme das sich die bilder ebn nicht aneinander reien sondern nur vergrösert oder verkleinert werden.
Auch schon gesagt mit StretchBlt. Du musst nur die Grössen des Bildes (bmp) und des Fensters im aktuellen Zustand abfragen und einsetzen.
-
Es wäre mir zwar recht wenn es mit eurer Metohte funktioniert und ihr noch ein mal der ganze Code wenn ihr meint das es so richtig ist oder was mache ich jetzt noch falsch :
// eigenes Fenster.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <Windows.h> const char szClassName[] = "MyClassEx"; char szTitle[] = "Fenster NO 1. | Copyright by JaRk Producktion © 2012"; LRESULT CALLBACK WndProc ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR szCmdLine, int szCmdShow ) { WNDCLASSEX WndClassEx; HWND hWnd; MSG msg; //°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°RESTRIERUNG°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°// WndClassEx.cbSize = sizeof( WndClassEx ); WndClassEx.style = NULL; WndClassEx.lpfnWndProc = WndProc; WndClassEx.cbClsExtra = NULL; WndClassEx.cbWndExtra = NULL; WndClassEx.hInstance = hInstance; WndClassEx.hIcon = LoadIcon( NULL, IDI_ERROR ); WndClassEx.hCursor = LoadCursor( NULL, IDC_HAND ); WndClassEx.hbrBackground = NULL; WndClassEx.lpszMenuName = NULL; WndClassEx.lpszClassName = szClassName; WndClassEx.hIconSm = LoadIcon( NULL, IDI_APPLICATION); if( !RegisterClassEx( &WndClassEx )) { MessageBoxA(NULL, "Registrierungs Fehler! ", "Error ", MB_OK); return false; } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FENSTER ERSTELLEN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, szTitle, WS_OVERLAPPEDWINDOW | WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { MessageBoxA( NULL, "Fenster konnte nicht erstellt werden", "Error", MB_OK); return false; } ShowWindow( hWnd, szCmdShow ); UpdateWindow( hWnd ); while ( GetMessage ( &msg, hWnd, NULL, NULL) > NULL ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return 0; } LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { HGDIOBJ h; switch (msg) { case WM_SIZE : RECT rect; GetClientRect( hWnd, &rect ); break; case WM_CREATE : { h = LoadImage(NULL, "C:\\Users\\TS Tim\\Pictures\\Wise.bmp", IMAGE_BITMAP, 20, 20, LR_LOADFROMFILE); if(h == NULL) { GetLastError(); } HDC hdc = GetDC( hWnd ); CreateCompatibleDC( hdc ); break; case WM_ERASEBKGND : StretchBlt( hdc, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hdc, rect.left, rect.top, rect.right, rect.bottom, SRCINVERT ); DeleteDC( hdc ); break; case WM_RBUTTONDOWN : MessageBox( NULL, "Rechte Maustaste ;)", "Super", MB_OK); break; case WM_QUIT: MessageBoxA( NULL, "Programm wurde beendet.", "ENDE ;)", MB_OK); DestroyWindow ( hWnd ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam ); } }
ach und es kommen die Fehler:
1>------ Erstellen gestartet: Projekt: eigenes Fenster, Konfiguration: Debug Win32 ------
1> eigenes Fenster.cpp
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(92): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(89): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(97): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(89): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(101): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(89): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(106): error C2360: Initialisierung von 'hdc' durch 'case'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(89): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(111): error C2361: Initialisierung von 'hdc' durch 'default'-Marke übersprungen
1> c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(89): Siehe Deklaration von 'hdc'
1>c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(115): fatal error C1075: Dateiende erreicht, bevor das zugehörige Element für das linke Element Klammer "{" in "c:\users\ts tim\documents\visual studio 2010\projects\eigenes fenster6\eigenes fenster\eigenes fenster.cpp(73)" gefunden wurde
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========ach und so neben bei wo sollen Die hin {} ????????
Ich bin so wütent ( auf mich )
ich glaub irgentwie das das einfach nicht in meinen Schädel will
-
cppfan schrieb:
Nun Wie du bereits erwähnt hast weis ich wirklich nicht was der code soll meine Frage War ja auch wie ich es Hin bekomme das sich die bilder ebn nicht aneinander reien sondern nur vergrösert oder verkleinert werden.
ach und -lowbyte- wen du JaRk meinst das hab ich blos so auf der Tastatur getipt und als n kumpel ( der Jan heist )meinte es hiese bestimt "Jan Riecht komisch" hab ich das so dofgefunden das ich das einfach so hingeschrieben hab
...
Wie bitte? Ach so... Wie schreibt ihr bei euch das Wort das nach Deinem Namen kommt?
-
Nach meinem kommt gar kein Wort nur nach seinem auserdem darf man sich ja mal vertippen.
Und wenn du keine Lösungs vorschläge hast würde ich es sehr beglücken wenn du keine Kommentare mehr abgibst.