Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

In Dialog Box Bilder wechseln MSVC++





Frage

Hallo, ich habe folgendes Problem. Ich habe ein Dialog-Fenster(MSVC++) in dem ich ein Picture darstelle. Jetzt möchte ich während der Laufzeit dieses Bild zu einem anderen verändern, also einfach den Pfad zu dem Bild. Irgendeine Idee wie das geht? Finde unter google nämlich nichts gescheites.

Antwort 1 von TheRealWhistler

Hi,

das Bitmap welches du laden, willst wird in meinem Beispiel von einer Instanz von "CBitmap" repräsentiert. Wenn du mehrere Bilder laden willst, einfach mehrere solcher CBitmap-Objekte, beispielsweise in einem Array anlegen.

[CODE]

CBitmap einBitmap;

[/CODE]



Geladen wird ein kompatibles Format wie folgt:
"IDB_EIN_BITMAP" ist eine Konstante, welche
das Bild als Datei im Ressourcen-Editor repräsentiert. Natürlich musst du das Bild vorher als Ressource hinzufügen.


[CODE]

einBitmap.LoadBitmap( IDB_EIN_BITMAP);

[/CODE]



Das Updaten eines Bitmaps geht wie folgt
"IDC_PICTURE_STATIC" ist eine Konstante, welche
das Bild-Objekt in deinem Dialogfenster
Identifiziert. (Ebenfalls im Ressourcen-Editor aufgelistet, genauer gesagt beim Dialogfeldeditor.)


[CODE]

CStatic *s;

s = (CStatic *)GetDlgItem( IDC_PICTURE_STATIC);

s->SetBitmap( (HBITMAP)einBitmap);

[/CODE]



Du musst dich explizit um die Freigabe dieses manuell geladenen Bildes kümmern, wenn du es nicht mehr benötigst:

[CODE]

einBitmap.DeleteObject();

[/CODE]


Hoffe ich konnte dir mit den paar Codefragmenten helfen.


PS: Noch ein bisschen Werbung: Schaut doch mal bei codinghelp.de vorbei... ein neues Forum für Programmierer.


Ciao

Andreas

Antwort 2 von h3h3

Erstmal vielen Dank für die lange Antwort.
Ich meine ich habe noch was wichtiges vergessen, ich code einen Dialog via einer Win32-Application nicht via MFC.
Ist dies auch der Grund, warum ich die CBitmap nicht benutzen kann?
Wenn ich den für CBitmap erforderlichen Header #include <afxwin.h> inkludiere, meckert der Compiler weil er die #include <afxwin.h> nicht findet... .
Irgendeine Ahnung wie ich das mit Win32 realisieren kann?

Antwort 3 von TheRealWhistler

Hi,

warum eigentlich nicht MFC... geht doch viel einfacher? Vielleicht hast du aber auch andere Gründe. Wenn du direkt die Win32-API für Grafiken nutzen willst, musst du direkt mit dem GDI Arbeiten
(Graphics Device Interface).

Hier ist ein Link zu einem Win32-Tutorial mit Codebeispielen:
(Schaue weiter unten bei
"Graphics Device Interface - 1. Bitmaps, Device Contexts and BitBlt" nach.)

http://www.winprog.org/tutorial/

Es ähnelt der MFC-API sehr. Du könntest auch in einer MFC Anwendung direkt mit GDI Arbeiten und dir in einem WM_PAINT-Eventhandler einen DC (Geräte Kontext) holen.

Antwort 4 von h3h3

na ja Win32 ist eigentlich auch ziemlich einfach. Ich benutze für die Dialoge ja auch den Ressourcen Editor von dem MSVC++ :).
Vielleicht kennst du den ja....
Ich habe eben in diesem Editor ein Bild hinzugefügt und ich meine es wäre am einfachsten dieses Bild zu ändern, indem man über die ID z.b. IDB_IMAGE das Abbild von IDB_BILD1 zu IDB_BILD2 macht.
Die Frage ist nur wie ....

Antwort 5 von TheRealWhistler

Hi,

versuchs mal damit...

// Deklaration
[CODE]
HBITMAP einBitmap = NULL;
[/CODE]

...

// Der Augenblick wo das Bitmap anhand einer ID geladen wird.
[CODE]
einBitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_???));

if(einBitmap == NULL)
MessageBox( hwnd, "Konnte IDB_??? nicht laden!", "FEHLER", MB_OK | MB_ICONEXCLAMATION);

[/CODE]


//Der Augenblick wo du das Bild änderst
// "hwnd" ist eine ID für den aktuellen Dialog
[CODE]

HWND hPicture;

hPicture = GetDlgItem( hwnd, IDC_PICTURE);

SetBitmap( hPicture, einBitmap);
[/CODE]




// Der Augenblick wo das Bitmap wieder frei gegeben wird, wenn du es nicht mehr benötigst.
[CODE]
DeleteObject( einBitmap);
[/CODE]



Ich bin mir net 100% sicher ob die Syntax stimmt, aber wen du oben bei der MFC-Variante nachschaust wirst du sehen dass es quasi das gleiche ist.

Antwort 6 von h3h3

ahh, das ist es. Vielen Dank.

Aber noch eine letzte Frage, kann es sein dass die Funktion SetBitmap( hPicture, einBitmap); so wie du sie geschrieben hast nicht existiert?

Ich kann nämlich SetBitmap(HWND hWnd , HBITMAP hBitmap) nirgendwo finden (Weder in der Dokumentation noch in Google...)

Antwort 7 von TheRealWhistler

stimmt, die Funktion lautete anders:

SendMessage(
(HWND) hWnd, // handle to destination window
STM_SETIMAGE, // message to send
(WPARAM) wParam, // image type
(LPARAM) lParam // handle to image (HANDLE)
);


Du musst über eine Nachricht der Schaltfläche klar machen, dass es ein anderes Bitmap anzeigen soll:

[CODE]
SendMessage( hPicture, STM_SETIMAGE, IMAGE_BITMAP,
einBitmap );
[/CODE]

Das müsste funktionieren.

Antwort 8 von h3h3

kewl, vielen dank...

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: