BILD zeigen ausgeben

Faller

Erfahrenes Mitglied
Ich würde gerne das mein Programm ein Bild ausgibt und hab das nun schon auf Direktx 9 gemacht
aber ich würde es gerne ohne machen eventuel mit gdi
oder mit gdi+

beim gdi hab ich schon die Ladenfunktion LoadImage.

aber wie gebe ich es aus?
ich habe bis jetze ein Fenster mit einer Callback schleife und das haut auch alles hin nur mit welcher funktion mahle ich nun dort ein BIld hinein
fals es jemand intreesiert
hier der code
// Das Fensterhandle
HWND hWnd = 0;


LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
{

case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;

case WM_KEYDOWN:
switch(wParam)
{
// Wenn ESC gedrückt, Anwendung beenden
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;

case WM_PAINT:



break;
}

return DefWindowProc(hwnd, msg, wParam, lParam);
}

// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
MessageHandler, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};

// Klasse registrieren
RegisterClassEx(&wndClass);

return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"BILD", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, // Anfangsposition
800,600, // und Größe des Fensters
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}



// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance, // Handle der Programminstanz
HINSTANCE hPrevInstance, // Handle der letzten Instanz
LPSTR lpCmdLine, // Kommandozeile
int nCmdShow) // Art wie das Fenster angezeigt werden soll
{
// Fenster erzeugen und Handle speichern
hWnd = CreateMainWindow(hInstance);

// Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
if(0 == hWnd)
{
MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
return -1;
}


// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg;

// Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
while(GetMessage(&msg,NULL,0,0))
{
// Nachricht an die Callbackfunktion senden
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// Rückgabewert an Windows
return 0;
}
alles ganz simbel under Windows programmiert
 
Zuletzt bearbeitet:
Hallo,

du musst auf die WM_PAINT - Nachricht reagieren, das Bild in einen temporären Devicekontext packen und dann mit BitBlt ins Fenster zeichnen.
Hier ist ein Beispiel (Win32-API):
C++:
// ...

case WM_PAINT: 
    {
        PAINTSTRUCT ps; 
        HDC         hdc = BeginPaint(hwnd, &ps);
        
        HBITMAP hbm = (HBITMAP)LoadImage( NULL,
                                          "C:\\MYPIC.BMP"),
                                          IMAGE_BITMAP,
                                          0,
                                          0,
                                          LR_LOADFROMFILE );

        HDC     hdcMem = CreateCompatibleDC(hdc);
        HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbm);

        BITMAP bm;
        GetObject(hbm, sizeof(bm), &bm);

        BitBlt( hdc,
                5,
                5,
                bm.bmWidth,
                bm.bmHeight,
                hdcMem,
                0,
                0,
                SRCCOPY ); 

        SelectObject(hdcMem, hbmOld); 
        DeleteDC(hdcMem);                   
        EndPaint(hwnd, &ps); 
        return 0L;    
    }

// ...
Gruß
MCoder
 
jer das thx
nun auf zur nächsten frage wie bekomme ich dort png Bilder zum darstellen.
Wäre keine schlechte idee fals es sich nicht zustark unterscheidet auch noch ein paar anderen Formate mit anzugeben für andere die auch mal nen bild darstellen möchten.
thx noch ma an diech MCCoder
 
Hallo,

für andere Formate benötigst du GDI+. Im Beispiel unten habe ich mal kurz die Anwendung skizziert. Du brauchst auf jeden Fall ein aktuelles Platform SDK. Das ist ab Visual Studio 2003 dabei oder ansonsten du musst es ggf. bei MS downloaden.

Gruß
MCoder
C++:
// Header und Bibliothek 
#ifdef _WIN64
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif
#include "gdiplus.h"                 
#pragma comment (lib, "Gdiplus.lib")

ULONG_PTR gdiplusToken;

// ...

// Initialisieren (Programmanfang)
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// ...

// Laden und Zeichen (JPG, PNG, BMP, TIFF, GIF möglich)
Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(L"C:\\bild.jpg", TRUE);
Gdiplus::Rect rect( 5, 5, pBitmap->GetWidth(), pBitmap->GetHeight() ); 
Gdiplus::Graphics g(hdc);
g.DrawImage(pBitmap, rect);
delete pBitmap;

// ...

// Deinitialisieren (Programmende)
Gdiplus::GdiplusShutdown(gdiplusToken);
 
Ok das funktioniert auch
problem ist das prog soll auf vielen rechner laufnen und ich will (oder weis net wie ) ich die dll datei mitschleifen.
ok dan bleiben mir 2 möglichkeiten entweder mir die komplette ausgabe selbst schreiben ist für bilder ja auch recht simpel ggggggggggggggggg (denkste)

oder aber die funktion ihrgentwoher bekommen aus dem gdi pluss.
mein endprodukt solte nur ne exe sein ohne jede verknüpfung zu anderen datein . also die frage wie bekomme ich sowas hin.


wäre es ihrgentwie möglich die header datein richtig mit ins projekt mit einbinden ohne die lib zu nutzen
weil dan wäre es ganz einfach alle .h datein mit ins projekt und dann hat er ja alles was er barucht.
ich habs ausprobiert aber der will unbedingt die .lb datei denn sonst kommen beim erstellen fehler das er ihrgentwelche schlüssel wörter net findet
 
Zuletzt bearbeitet:
Hallo,

für das Verwenden von GDI+ wird die .lib benötigt, da die eigentlichen Funktionen aus einer entsprechenden DLL im Windows-Systemordner kommen und die Lib die Verbindung dazu herstellt.

Bei XP und Vista gehört GDI+ dazu, dein Programm (nur EXE) würde also ohne weiteres laufen. Bei älteren Windows-Versionen wird allerdings eine DLL benötigt, die man zum Programm dazu tun müsste. Von MS gibt's da ein sog. GDI+ Redistributable zum Download, das eben diese DLL enthält.

Gruß
MCoder
 
Wie füge ich noch gleich ein Bitmap via Resource in mein Projekt ein ?
Ein Icon:
Code:
1 ICON DISCARDABLE "icon.ico"

Und ein Bitmap ?

Gruß
 
Dann bleibt mir wohl nix anderes übrig als mir die funktionen selbst zuschreiben.
Denn das Entprodukt soll auf allen windows rechner funktionieren ohne ihrgentwas mitzunehmen.

Aber es ist schon geil das Standart windows c noch nichtmal Bilder ausgeben kann auser bitmaps und umformatierung in andere Formate noch nicht einmal bereitstellt.

Nunja ist halt Windows.

Thx für deine schnelle hilfe Mcoder

So nun du hast gesagt das die .lib auf Windows .dll Datein verweist
1 wo kann man was dazu lessen suche gerade nach sowas
2 könnte man nicht selbst die verlinkung übernehmen so das dann die lib datei entfällt

weis jemand wie lib datein aufgebaut sind
biziehungsweise wo man das wissen darüber herbekommt
weis jemand wie man .lib datein erstellet. wie man dies wieder rück gängig machbar ist

mfg faller
 
Zuletzt bearbeitet:
Ja, das hat schon ziemlich lange gedauert, bis unter Windows eine leidlich brauchbare Grafik-API bereitgestellt wurde :rolleyes:

Als Alternative zum Selberschreiben könntest du dir vielleicht die zahlreichen freien GUI-Toolkits anschauen, die in der Regel mit den diversen Grafikformaten umgehen können. Da die sich auch oft statisch linken lassen, gibt's dann auch wieder bloß eine EXE.

Ansonsten gibt es z.B. hier freie Grafikbibliotheken mit Sourcecode, die vielleicht auch brauchbar sein könnten: http://www.thefreecountry.com/sourcecode/graphics.shtml

Gruß
MCoder
 
jep ich werde mal suchen
thx wür den link ich hoffe das er hilft

wenn du noch was über .lib datein weist ich wäre dir sehr dankbar wenn du mich an deinem wissen teilhaben lästt gggg

ich hab meinen oberen Beitrag editiert und gerade noch nen paar fragen gestellt.

So nun du hast gesagt das die .lib auf Windows .dll Datein verweist
1 wo kann man was dazu lessen suche gerade nach sowas
2 könnte man nicht selbst die verlinkung übernehmen so das dann die lib datei entfällt

weis jemand wie lib datein aufgebaut sind
biziehungsweise wo man das wissen darüber herbekommt
weis jemand wie man .lib datein erstellet. wie man dies wieder rück gängig machbar ist

nun nochmal

mfg rs
 
Zurück