HBitmap aus Resource über Graphics zeichnen

pyr0t0n

Erfahrenes Mitglied
Aloah,

ich hab mir vorgenommen einen kleinen Bildschirmschoner zu programmieren indem ein Bild über den Bildschirm fliegt.

Wenn ich die Bilddatei Lokal von der Festplatte aufrufe funktioniert das, da ich das ganze aber als eine Datei halten will, kam die Idee mit der Resource File.

Habe das Bild usw in der Resourcefile angelegt und habs nach längerem Suchen dann so ausgelesen.

Code:
...
HBITMAP hbild;
...
hbild = LoadBitmap(NULL, MAKEINTRESOURCE(IDB_BITMAP1));
...



Jetzt habe ich ja ein HBitmap, vorher hab ich das Bild von der Festplatte in ein

Code:
Bitmap ^bild;



eingelesen und so zeichnen lassen

Code:
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
e->Graphics->DrawImage(bild, p.X, p.Y, 240, 180);
}


Doch wie mach ich das jetzt?
Kann ich das HBitmap irgendwie in ein Normales Bitmap packen oder wie zeichne ich das HBitmap das es über den Bildschirm fliegt.

Danke schonmal

PS: Wenn jemand eine andere Idee hat nehme ich diese auch gerne an... will aber das Programm / den Bildschirmschoner auf die EXE Datei beschränken.

Mit freundlichen Grüßen
pyr0t0n

Im anhang der ganze Code:

Code:
#pragma once

#include "Windows.h"
#include "resource.h"

namespace MeinBildschirmschoner {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;
	using namespace System::Reflection;

	public ref class Form1 : public System::Windows::Forms::Form
	{
		String ^text;
		Point p;
		Timer ^zeitgeber;
		int vx;
		int vy;
		//HBITMAP hbild;
		Bitmap ^bild;
	public:
		Form1(void)
		{
			InitializeComponent();
			vx = 1;
			vy = 1;
			hbild = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
			p = Point(0,100);
			zeitgeber = gcnew Timer();
			zeitgeber->Tick += gcnew EventHandler(this,
												&Form1::Animieren);
			zeitgeber->Interval = 2;
			zeitgeber->Start();
			Cursor->Hide();
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}

	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		System::ComponentModel::Container ^components;

		void Animieren(Object ^sender, EventArgs ^e)
		{
			p.X += vx;
			p.Y += vy;
			if(p.X > this->Width-240 || p.X < 0)
			{
				vx = -vx;
			}
			if(p.Y > this->Height-180 || p.Y < 0)
			{
				vy = -vy;
			}
			Refresh();
		}


#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
			this->SuspendLayout();
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->BackColor = System::Drawing::Color::Black;
			this->ClientSize = System::Drawing::Size(292, 266);
			this->DoubleBuffered = true;
			this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;
			this->Name = L"Form1";
			this->ShowInTaskbar = false;
			this->Text = L"Form1";
			this->TopMost = true;
			this->WindowState = System::Windows::Forms::FormWindowState::Maximized;
			this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::Form1_Paint);
			this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &Form1::Form1_KeyDown);
			this->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Form1_MouseDown);
			this->ResumeLayout(false);

		}
#pragma endregion
	private: System::Void Form1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
				 Close();
			 }
	private: System::Void Form1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {
				 Close();
			 }
	private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
				 e->Graphics->DrawImage(bild, p.X, p.Y, 240, 180);
			 }
	};
 

MCoder

Erfahrenes Mitglied
Hallo,

mit HBITMAP brauchst du gar nicht zu arbeiten.
Füge das Bild einfach als eingebettete Resource hinzu (Neben bmp kannst du auch jpg oder png verwenden):

- Im Projektmappen-Explorer über Hinzufügen->Vorhandenes Element die Bilddatei ins Projekt einfügen.
- Bei den Projekteigenschaften zu Linker und Eingabe gehen und dort bei "Verwaltete Resourcendatei einbetten" den Dateinamen hinschreiben.

Das Laden (im Konstruktor) geht dann so:
C++:
bild = gcnew Bitmap(System::Reflection::Assembly::GetExecutingAssembly()->GetManifestResourceStream("meinbild.bmp"));

Gruß
MCoder
 
Zuletzt bearbeitet: