LoadImage
-
hallo Forum,
ich habe mir ein kleinen Quellcode gemacht, wo eineinfaches bild im fenster angezeigt werden soll.
nun habe ich das problehm, das wenn ich es kompiliere zwei errors kommen

hier der Quelltext:
#include <windows.h> #include "stdafx.h" #include "dmhdsg.h" LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { HDC hdc; PAINTSTRUCT ps; int i; HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HDC hdc = GetWindowDC(hwnd); HDC hdc_ram = CreateCompatibleDC(NULL); SelectObject(hdc_ram, hbitmap); BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY); switch( message ) { case WM_PAINT: hdc = BeginPaint( hwnd, &ps ); for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) ); EndPaint( hwnd, &ps ); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } int WINAPI WinMain( HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow ) { static TCHAR szName[] = TEXT("Fensterklasse"); HWND hwnd ; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); hwnd = CreateWindow (szName, TEXT("Punkte setzen"), WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; }Und in diesem bereich wird das Bild geladen und ausgegeben:
HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HDC hdc = GetWindowDC(hwnd); HDC hdc_ram = CreateCompatibleDC(NULL); SelectObject(hdc_ram, hbitmap); BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);wenn ich es nun kompiliere kommt folgendes:
c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(13) : error C2664: 'LoadImageW': Konvertierung des Parameters 2 von 'const char [9]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(14) : error C2086: 'HDC hdc': Neudefinition
c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(9): Siehe Deklaration von 'hdc'
c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(67) : warning C4244: 'return': Konvertierung von 'WPARAM' in 'int', möglicher Datenverlustkann mir vieleicht jeman weiter helfen?
MfG
Showball!
-
Hilfe zur Selbsthilfe :
... HDC hdc; // <- ! PAINTSTRUCT ps; ... HDC hdc = GetWindowDC(hwnd); // <- ! ...TEXT("test.bmp")
-
hey, Danke!!!
Ein feghler is nun behoben, aber eine error habe ich noch

Ich weiß leider nicht was diese error beduetet, habe die nähmlich eigentlich noch net gehabt

hier der code:
#include <windows.h> #include "stdafx.h" #include "dmhdsg.h" LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { int i; HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HDC hdc = GetWindowDC(hwnd); HDC hdc_ram = CreateCompatibleDC(NULL); SelectObject(hdc_ram, hbitmap); BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY); TEXT("test.bmp"); PAINTSTRUCT ps; switch( message ) { case WM_PAINT: hdc = BeginPaint( hwnd, &ps ); for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) ); EndPaint( hwnd, &ps ); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }und hier die error:
c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(14) : error C2664: 'LoadImageW': Konvertierung des Parameters 2 von 'const char [9]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.mal so eine andere frage, würde der code eigentlich mit MSVC++2005EE überhaupt gehen, wenn ich nur den compiler und API installiert habe??
Alsoe es soll halt eine Bilmap datei, also eon bild anzeigen

hoffe das es sol klappt wie ich es mir vorstelle
Also cih füge ienfach eine ressource im projekt hinzu und zwar das test.bmp die bitmap datei, und dann soll das bild eingelesen und angezeigt werden 
ich hoffe das es geht
dann währe ich nähmlich sehr glücklich!MfG
Showball!
-
Ähem, eigentlich war das mit TEXT("test.bmp") so gemeint :
// HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HANDLE hbitmap = LoadImage(NULL,TEXT("test.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
-
hey danke es klappt, nur jetzt wird das bild net angezeigt, es heißt Bild1.bmp
aber es wird halt net angezeigt, und weil ich mich in den images nicht sehr gut auskenne, weiß ich auh net genau warum

hier der Code:
#include <windows.h> #include "stdafx.h" #include "dmhdsg.h" LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { int i; HANDLE hbitmap = LoadImage(NULL,TEXT("bild1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HDC hdc = GetWindowDC(hwnd); HDC hdc_ram = CreateCompatibleDC(NULL); SelectObject(hdc_ram, hbitmap); BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY); PAINTSTRUCT ps; switch( message ) { case WM_PAINT: hdc = BeginPaint( hwnd, &ps ); for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) ); EndPaint( hwnd, &ps ); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } int WINAPI WinMain( HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow ) { static TCHAR szName[] = TEXT("Fensterklasse"); HWND hwnd ; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); hwnd = CreateWindow (szName, TEXT("Punkte setzen"), WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; }Also zurst lade ich das bild in die ressourcen, also ich mache im projekt bei ressorrcen "hinzufügen" ->> "vohandenes Element" ->> und dann das bild auswählen
habe ich noch irgent was vergessen?
MfG
Showball!
-
kann das vieleciht sein, das die Funktion fürs anzeigen fehlt, sowas wie DrawPic oder so?
Aber wie mache ich das???
MfG
Showball!
-
Überleg mal, ob die Stelle wo LoadImage () aufgerufen wird, irgendwie auch richtig ist.
Sie sollte "irgendwo" in der switch () - Anweisung liegen. Aber wo ?
Danach informiere Dich über folgende WinAPI-Funktionen :
-> DeleteObject ()
-> DeleteDC ()
-> ReleaseDC ()Erst wenn alles läuft solltest Du anfangen, Ressourcen via Kompilereinstellungen hinzuzufügen.

-
Also ich habe versucht das in einer switch funktion in einer case ein zu fügen, aber es funktionierte nicht, kahmen 9 errors

Wo kann ich mich denn uber die drei Objekte informieren?? knnst du einen guten link, am besten auf deutsch?
MfG
Showball!PS: Finde es gut das du mir den Code nicht vorgiebst, so muss ich selber herausfinden wie's geht, zu mindest zum teil

EDIT: Wie geht das denn sonst ohne ressourcen?? geht das noch anders, einfacher?
-
Grundsätzlich gilt : Was man vom Betriebssystem anfordert, muss man (nach Gebrauch) auch wieder freigeben.
D.h. zu jedem "open" gehört ein "close", zu jedem "LoadImage" gehört ein "DeleteObject", zu jedem "CreateCompatibleDC" gehört ein "DeleteDC".
Ich gebe jetzt mal sechs Zeilen vor
Guck nochmal genau die Anweisungen an, die Du bei "WM_PAINT" bereits hast und setze diese sechs Zeilen dann an die richtige Stelle :switch (message) { case WM_PAINT : { ... //---------------------------------------------------- hbitmap = LoadImage (NULL,TEXT("C:\\TEMP\\bild1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hdc_ram = CreateCompatibleDC(NULL); SelectObject (hdc_ram, hbitmap); BitBlt (hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY); DeleteDC (hdc_ram); DeleteObject (hbitmap); //---------------------------------------------------- ... return 0; } case WM_DESTROY : { ... return 0; } }
-
haha! Das ist ja eigentlich einfacher als ich dachte, wozu braucht man denn Directx wenns auch so geht!!!

danke!!!
bist echt ne gute Huilfe!!!
Für alle die das auch gerne machen wollen, versucht es doch mal damit:
switch( message ) { case WM_PAINT: hdc = BeginPaint( hwnd, &ps ); hbitmap = LoadImage (NULL,TEXT("C:\\Dokumente und Einstellungen\\Dustin.TRANCE\\Eigene Dateien\\Visual Studio 2005\\Projects\\dmhdsg\\bild2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hdc_ram = CreateCompatibleDC(NULL); SelectObject (hdc_ram, hbitmap); BitBlt (hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY); DeleteDC (hdc_ram); DeleteObject (hbitmap); for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) ); EndPaint( hwnd, &ps ); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }jetzt habe ich nurnoch eine frage, so wie ich das sehe funktionieren da aber keine zwei bilder oder??? wenn ih mal zwei bilder einfügen will ...
Oder geht das doch?
**und wie kann ich machen, also den link dort zu dem bild, das man da ine variable rein acht, also ab da wo die exe ist beginnt der link, denn wenn ich mein proggy jetzt anderen geben würde und die das wo ganz anders haben, dann werden die bilder ja uh nimmer angezeigt oder?
**
PS: Nochmals tausenden dank!!!MfG
ShowballWähre das auch nichts fürs FAQ??
-
ich weiß das man grundlos eigentlich nix posten sollte, aber das muss ich jetzt einfach, weil ich nun weiß, das das was ich vor habe nun geht.
Als info für alle die es noch nicht wissen, bei den abständen zu den rändern kann man auch negative werte eintareg, z.b -10 oder so, dann wird das bild um 10 pixel weniger ganz am rand angezeigt!!!
-
Ich hbe mal so eine frage, wenn ich farablen in den abständen einfügen will, muss ich da dann einfach den variablen namen einfügen, z.b. i oder so ähnlich, oder was muss ich dafür machen?