"Zeichnen auf Knopfdruck"



  • Hi,

    ich hab folgendes Problem in eine dialog. Anwendung:
    Ich zeichne etwas in OnPaint(), funktioniert wunderbar. Jetzt soll aber, sobald der Anwender auf einen Button klickt, noch etwas zusätzliches gezeichnet werden. Wenn ich in der Methode des Buttons einen neuen DC erstelle und dort rein zeichne, funktioniert das zwar, allerdings ist das gezeichnete nachdem man minimniert hat wieder weg! Am besten wäre es, wenn ich auf Buttondruck OnPaint() nocheinmal mit anderen Funktionswerten aufrufen könnte, allerding passiert gar nix wenn ich in die OnClick Methode einfach nur OnPaint() schreibe. Weiß da jemand Rat?!

    Und noch eine Frage: Wenn ich z. B. eine Linie zeichne, wie könnte ich die denn auf Buttonklick wieder löschen?? Also nicht mit "Tricks" wie drübermalen mit Hintergrundfarbe!

    Viele Dank!!



  • Du könntest Dir für jede "Zeichenoperation" ein Objekt anlegen das diese Aufgabe übernimmt.

    Die Objekte haben alle z.B. paint(DC 😉 und werden in einer Liste eingefügt wenn dein Knopf gedrückt wird.

    In OnPaint läufst Du über die Liste und rufst paint() jedes Objektes auf das in der Liste steckt.

    Wenn Du nun 1 Objekt rauslöschst wird es auch nicht mehr gezeichnet (so wirst Du die Linie wieder los).

    Und neuzeichnen :

    versuchs mal mit invalidate update refresh oder so was.

    (Ist nur ein schubs in die richtung, hab selbst mit onpaint noch nicht gearbeitet.)

    Beispiel:

    struct PaintClass
    {
      virtual void paint(CDC * dc) = 0;
    };
    
    class Line : public PaintClass
    {
       int top;
       int left;
       int width;
       int height;
    
    public:
    
       Line();
       virtual ~Line();
    
       set_und_get_Methode(); // Damit die Linie weiß wo sie hinsoll)
       virtual void paint(CDC * dc); // oder doch DC * ka virtual um ableiten zu können
    
    };
    
    class RechtEck : public PaintClass
    {
       int top;
       int left;
       int width;
       int height;
    
    public:
    
       RechtEck();
       virtual ~RechtEck();
    
       set_und_get_Methode(); // Damit die Linie weiß wo sie hinsoll)
       virtual void paint(CDC * dc); // oder doch DC * ka virtual um ableiten zu können
    
    };
    

    dann:

    // Eine ID um das Objekt später wieder zu finden
      std::map<int,PaintClass *> m_paintJob;
    

    Beim Knopf:

    void Irgendwas::OnBtnClick_ZeichneLinie()
    {
       Linie * temp = new Linie;
       Linie.DerLinieSagenWoSieHinSoll();
       int EindeutigeID = 12; // Für jedes Objekt ne neue ID
       m_paintJob.insert(std::make_pair(EindeutigeID,temp))
    }
    
    void Irgendwas::OnBtnClick_ZeichneRechteck()
    {
       Rechteck * temp = new Rechteck;
       Linie.DerLinieSagenWoSieHinSoll();
       int EindeutigeID = 112; // Für jedes Objekt ne neue ID
       m_paintJob.insert(std::make_pair(EindeutigeID,temp))
    }
    

    Bei OnPaint:

    CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
      std::map<int,PaintClass *>::iterator pos;
    
      for(pos = m_paintJob.begin();pos != m_paintJob.end();++pos)
        pos->second->paint(dc); // Das Objekt zeichnen
    

    Im Destruktor das Löschen nicht vergessen !!

    std::map<int,PaintClass *>::iterator pos;
      for(pos = m_paintJob.begin();pos != m_paintJob.end();++pos)
        delete pos->second;
    

    Da ich in MFC nicht wirklich fitt bin steckt viel standard drinne. Wenn Du also mehr auf MFC stehst musste mal pusseln. Aber der Ansatz dürfte hinkommen.



  • Vielen Dank, das werd ich mich gleich mal durcharbeiten und es versuchen anzupassen!!

    Gruß!


Anmelden zum Antworten