Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Bild als Hintergrund     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Mo3bius
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 45
Beitrag Mo3bius Mitglied 10:19:23 02.09.2010   Titel:   Bild als Hintergrund            Zitieren

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
Verim
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.05.2010
Beiträge: 40
Beitrag Verim Mitglied 16:25:57 02.09.2010   Titel:              Zitieren

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....

_________________
Was die Raupe Ende der Welt nennt, nennt der Rest der Welt Schmetterling.
andi01
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.05.2009
Beiträge: 500
Beitrag andi01 Mitglied 16:56:18 02.09.2010   Titel:              Zitieren

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:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
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);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
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);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
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:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
#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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#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:
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
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 zeichnen
C/C++ Code:
1
2
3
4
5
6
7
8
9
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 zeichnen
C/C++ Code:
1
2
3
4
5
6
7
8
9
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 zeichnen


wenn du das Bild zB in ein Fenster wie einen Hintergrund zeichnen willst musst du dir eben vorher noch die Abmessungen besorgen:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.

_________________
Using: Windows 7 / XP SP2; Microsoft Visual C++ 2010 Express Edition.


Zuletzt bearbeitet von andi01 am 17:20:34 02.09.2010, insgesamt 10-mal bearbeitet
berniebutt
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.11.2007
Beiträge: 2082
Beitrag berniebutt Mitglied 17:40:43 02.09.2010   Titel:              Zitieren

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.

_________________
http://berniebutt.npage.de
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 20:04:45 02.09.2010   Titel:              Zitieren

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
Mo3bius
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 45
Beitrag Mo3bius Mitglied 14:53:19 03.09.2010   Titel:              Zitieren

@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
geeky
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 5983
Beitrag geeky Mitglied 16:56:32 03.09.2010   Titel:              Zitieren

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.
Mo3bius
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.08.2010
Beiträge: 45
Beitrag Mo3bius Mitglied 12:18:08 06.09.2010   Titel:              Zitieren

Hat ein bisschen gedauert, jetzt habe ich aber eine zufriedenstellende Lösung für mich gefunden:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
 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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 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
C/C++ Forum :: WinAPI ::  Bild als Hintergrund   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.