Grafikprogrammierung



  • Hallo,

    ich bin eigentlich beim Borland Builder zuhause und wir überlegen gerade einen Umstieg. Aus diesem Grund habe ich versucht, ein paar Bitmaps auf einem Hintergrundbild über ein Formular "laufen" zu lassen. Dies ging unter vcl so, daß ich auf eine Bitmap alle anderen Bitmaps anhand ihrer Koordinaten draufgezeichnet hab und dann das "Gesamtwerk" auf dem Formular dargestellt hab. Jetzt wollte ich das hier genauso machen, aber das scheint nicht zu gehen. Ich hab es bisher nur so hinbekommen, daß ich die Bitmaps direkt auf das Graphic Objekt des Formulars zeichne. Dann flackert es aber ein bischen (trotz double buffering). Meine Frage: Hab ich das Konzept falsch verstanden oder gibt es doch eine Möglichkeit alles im Hintergrund vorzubereiten und erst das fertige Gesamtbild auf dem Bildschirm darzustellen.

    Danke schon mal

    Ebi01



  • Leite eine eigene Klasse von Control ab und rufe im Konstruktor Folgendes auf und verwende dann dieses Control...

    public ref class MyPaintCtrl : Control
    {
    public:
      MyPaintCtrl()
      {
        this.SetStyle(ControlStyles.DoubleBuffer 
          | ControlStyles.AllPaintingInWmPaint 
          | ControlStyles.UserPaint 
          | ControlStyles.ResizeRedraw, 
          true);
      }
      Bitmap^ image;
    protected:
      void OnPaint(PaintEventArgs^ e) override
      {
        if (imager != nullptr)
          e->Graphics->DrawImage(image);
      }
    };
    


  • ich verstehe jetzt noch nicht, wie ich hier mehrere Bitmaps draufbekommen. Kannst du das ein bischen genauer erklären?

    Danke scho mal

    Ebi01



  • Mehrere Bitmaps bekommst Du drauf, wenn Du mehrere zeichnest...

    void OnPaint(PaintEventArgs^ e) override
      {
        e->Graphics->DrawImage(image1);
        e->Graphics->DrawImage(image2);
        e->Graphics->DrawImage(image3);
        e->Graphics->DrawImage(image4);
        e->Graphics->DrawImage(image5);
        e->Graphics->DrawImage(image6);
      }
    

    Diese Klasse unterstützt halt schon automatisch das DoubleBuffering...



  • Hm,

    also ich hab jetzt die Klasse abgeleitet und hab die Bitmaps so reingepackt wie du das geschrieben hast. Aber wie bekomme ich die jetzt auf mein Formular??? Ich steh da glaub ich total auf dem Schlauch.....



  • Pack einfach mal ein "Panel" in Dein Formular und ersetze dann in der "InitializeComponents" Methode das "Panel" durch Dein eigenes Control...



  • So, nach jetzt viel Arbeit um die Ohren mein nächster Versuch. Ich stelle fest: bei .net bin ich noch gaaaaanz am Anfang. Ich habe also ein Projekt geöffnet und auf mein Formular ein Panel gesetzt. Dann hab ich oberhalb der Klassendefinition deine Klasse MyPaintControl reingesetzt. (Wußte nicht wo sonst). Als ich dann wieder in die Formularansicht wechseln wollte, konnte er es schon nicht mehr anzeigen und brachte die Meldung, ich sollte Klassen aus der Toolbox ziehen... Also hab ich wohl einen Fehler gemacht. Deshalb
    1. Frage: an welche Stelle schreibe ich meine Klasse hin.
    2. Frage: wie sieht das mit dem "Ersetzen des Panels genau aus, was davon und schreibe ich dann überall dort wo panel steht, dann MyPaintControl hin?
    muß ich davon auch irgendwo ein Objekt erstellen?

    Du siehst ich habe glaube ich das ganze Prinzip noch nicht kapiert und komme mir deshalb ziemlich doof vor 😕
    Kannst du mir das nochmal etwas ausführlicher erklären? wäre toll

    Ebi01



  • Ebi01 schrieb:

    1. Frage: an welche Stelle schreibe ich meine Klasse hin.

    da machst Du einfach eine neue CPP-datei und neue H-Datei auf .. Projekt->Hinzufügen



  • Hallo ich bin mal wieder da.

    ich hab also die Klasse in eine eigene Header Datei reingepackt

    #pragma once
    using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    ref class MyPaintCtrl :public Control
    {
    public:
    
    	  MyPaintCtrl()
      {
    	  this->SetStyle(ControlStyles::DoubleBuffer
    		  | ControlStyles::AllPaintingInWmPaint
    		  | ControlStyles::UserPaint
    		  | ControlStyles::ResizeRedraw,
          true);
    	  image = gcnew Bitmap("donald.jpg");
      }
      Bitmap^ image;
    protected:
    virtual  void OnPaint(PaintEventArgs^ e) override
      {
        if (image != nullptr)
          e->Graphics->DrawImage(image,0,0);
      } 
    };
    

    und mein Formular sieht so aus

    namespace DotNetGrafik {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    #include"MyPaintCtrl.h"
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Panel^  panel1;
    			 MyPaintCtrl^ paint1;
    	protected: 
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #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->panel1 = (gcnew System::Windows::Forms::Panel());
    			this->SuspendLayout();
    			// 
    			// panel1
    			// 
    			this->panel1->Location = System::Drawing::Point(201, 173);
    			this->panel1->Name = L"panel1";
    			this->panel1->Size = System::Drawing::Size(80, 86);
    			this->panel1->TabIndex = 0;
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 262);
    			this->Controls->Add(this->panel1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	};
    }
    

    Ich hab jetzt mehrere Probleme
    1. ich bekomme nichts auf den Bildschirm
    2. wenn ich auf die Formularansicht wechsle, bekomme ich eine Fehlermeldung, daß im C'tor von MyPaintCtrl ein Fehler wäre, der den Designer in einen undefinierten Zustand versetzen würde 😕

    könntet ihr da bitte noch mal drüberschauen??

    Danke schon mal

    Ebi01



  • aus

    namespace DotNetGrafik {
    
        using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;
    #include"MyPaintCtrl.h"
    

    musst Du

    #include"MyPaintCtrl.h"
    
    namespace DotNetGrafik {
    

    machen ... ein Include ist wie ein Copy&Paste der kompletten Datei

    hand, mogel



  • o.k. das hab ich gemacht, aber auf dem Formular seh ich jetzt trotzdem noch nichts....

    Ebi01


Anmelden zum Antworten