Bild als Hintergrund
-
Hi,
ich habe hier ein Programm, bei dem ich als Hintergrund eine Grafik haben möchte. Geht das und wenn wie?Bei meinem Programm erstelle ich geometrische Formen, wie Rechtecke und Ellipsen. Diese sind mit einer Frabe gefüllt. Kann man die auch transparent machen, damit man die Grafik sehen kann?
Ich habe keine Ahnung wie schwierig das ist. Wenn ihr nicht wisst wie das geht, euch aber sicher seid, dass das extrem schwierig ist, dann schreibt das bitte. Das würde mir auch helfen.

Mfg Mo3bius
-
Eventuell soltest du auf DirectX oder OpenGL zurückgreifen - damit ist sowas garkein Problem und schnell gemacht und ansich auch nicht wirklich schwer.
Geht mit WinApi aber sicher auch iwie....
-
das mit dem Hintergrund könntest du so lösen, dass du in der WndProc bei WM_PAINT das Bild neu zeichnest und dann die Formen drüber (zB mit der Gdi+).
--> DrawImage()
auch das mit der Transparenz geht mit der gdi+ sehr leicht.
(einfach beim farbwert als ersten parameter einen transparenzgrad zwischen 0 und 255 angegen (0= vollständig transparent).
für die fomen: zB FillRectangle, FillPolygon,...
Beispiel Hintergrund:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(message) { case WM_PAINT: bild_zeichnen(); break; } return DefWindowProc(hwnd, message, wparam, lparam); }Beispiel für ein gefülltes Viereck:
HWND dein_fenster; HDC hdc=GetDC(dein_fenster); Graphics g(hdc); int transparenz=255;//nicht transparent; int rot=255;//voller rotanteil int grün=0; int blau=0; SolidBrush brush(Color(transparenz, rot, grün, blau));//das wird hellrot int x=100, y=100, breite=200, höhe=100;//daten des zu zeichneneden rechtecks g.FillRectangle(&brush, x, y, breite, höhe);Beispiel wie man die Gdi initialisiert/beendet:
#include<gdiplus.h> using namespace Gdiplus; #pragma comment(lib, "Gdiplus.lib") ULONG_PTR token; GdiplusStartupInput input; GdiplusStartup(&token, &input, 0); { //hier zeichencode rein } GdiplusShutdown(token);und zum Schluss ein Bsp wie man ein Bild zeichnet:
HWND hwnd; HDC hdc=GetDC(hwnd); Graphics g(hdc); Image im(TEXT("C:\\test\\test.bmp"));//Pfad durch Pfad deines Bildes ersetzen RectF r(100, 100, 100, 100);/*rechteck in das das Bild "hineingezeichnet" wird, so kann es zB auch verzerrt werden*/ g.DrawImage(&im, r);//Bild zeichnenwenn du das Bild zB in ein Fenster wie einen Hintergrund zeichnen willst musst du dir eben vorher noch die Abmessungen besorgen:
RECT r; GetClientRect(hwnd_dein_fenster, &r); RectF rf; rf.x=r.left; rf.y=r.top; rf.width=r.right-r.left; rf.height=r.bottom-r.top; Image im(TEXT("C:\\test\\test.bmp")); HWND dein_fenster; HDC hdc=GetDC(dein_fenster); Graphics g(hdc); g.DrawImage(&im, rf);lg,
andi01.
-
Du hast im Forum WinApi gefragt. Da hast mit WinApi die Möglichkeit zur Einbindung von Bitmaps wo immer du willst. Das Bild als Hintergrund wäre im betreffenden Fenster zu plazieren. Alles weitere käme darunter.
-
hi
andi hat da sehr kleine schöne bsp. vorgestellt.
einfach eine search-engine benutzen, und nach gdi/gdi+ oder directx,alternative opengl. das ist alles zu genüge dokummentiert.lowbyte
-
@andi01: Vielen Dank für diese ausführliche Anleitung. Bis jetzt ist meine Anwendung für GDI geschrieben. Meine Kenntnisse über die WinApi sind begrenzt, aber kann ich überhaupt einfach mal so zu GDI+ wechseln? DIe Funktion Solid Brush sieht ja schon mal ein bisschen anders aus...
Was sagt ihr? Kann ich GDI+ verwenden oder müsste ich da meine ganze Anwendung umschreiben?
Mfg Mo3bius
-
GDI+ läuft oftmals ein wenig langsamer, Kreise etc. sehen allerdings (bei aktivierter Kantenglättung) meistens besser aus.
Wenn die Render-Geschwindigkeit keine große Rolle spielt, würde ich GDI+ nehmen.
Man kann natürlich auch einfach weiterhin GDI nehmen und nur Teile mit GDI+ zeichnen - sofern es halt Sinn macht.
-
Hat ein bisschen gedauert, jetzt habe ich aber eine zufriedenstellende Lösung für mich gefunden:
BITMAP bm; HANDLE bild = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // HBITMAP tmpbitmap = CreateCompatibleBitmap(hdc, akt.right-200 -akt.left , akt.bottom - akt.top); HDC hdcMem = CreateCompatibleDC(hdc); HGDIOBJ hbmOld = SelectObject(hdcMem, bild); GetObject(bild, sizeof(bm), &bm); pt[0] = stretchbitmap((akt.right-200 -akt.left),(akt.bottom - akt.top),bm.bmWidth,bm.bmHeight); StretchBlt(hdc, 0, 0, pt[0].x , pt[0].y , hdcMem, 0, 0, bm.bmWidth, bm.bmHeight,SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hdcMem);Hier lade/erstelle ich ein Bitmap. Damit das Ganze dann noch richtig skaliert ist, habe ich noch eine kleine Funktion geschrieben, die mir pt[0] berechnet.
Als "transparente" Ellipse nehme ich nun einen Kreisbogen über 360 Grad. Der ist dann nicht gefüllt

Mfg Mo3bius