Zeichnen in einem Picture Control



  • Ich möchte ein Picture Control nutzen um den Bereich in dem ich Male abzugrenzen. Dazu habe ich in einen Dialog ein Picture Control eingebetet und eine Membervariable vom Typ Control hinzugefügt. Allerdings wurde daraus dann ein

    public:
    	CStatic m_WndPicture;
    

    Nun möchte ich in dieses Control eine Linie (fürs erste) hineinzeichnen.
    Bei allen Hilfen zum Zeichnen habe ich immer einen Code mit

    CClientDC dc (this);
    

    wo dann mit dc.LineTo ... gemalt wird.

    Mir ist vollkommen unklar wie ich mit diesen Kenntnissen in ein Picture Control male.

    Matthias



  • Der Parameter des CClientDC Ctors ist das CWnd, in dem du malen willst. Normalerweise übergibst du dafür deine Dialog-oder View-Klasse (als this), aber in dem Fall mußt du das Objekt übergeben, das du für dein Picture angelegt hast:

    CClientDC(&m_WndPicture);
    

    (der Rest geht ganz normal)



  • Ein

    CClientDC dc (&m_WndPicture);
    

    führt nur dazu, dass die Application abstürzt. Kompilieren funktioniert.

    Bin damit also noch nicht weiter.

    Matthias



  • in die .h Datei eine Variable rein

    CDC   *m_pCDCStatic
    

    in die Funktion OnInitDialog()

    m_pCDCStatic = this->GetDlgItem(IDC_DEINSTATIC)->GetDc();
    

    und mit dem kannst dann im ganzen Programm zeichnen.... und nur in der Picturebox



  • DaDings schrieb:

    in die .h Datei eine Variable rein

    CDC   *m_pCDCStatic
    

    in die Funktion OnInitDialog()

    m_pCDCStatic = this->GetDlgItem(IDC_DEINSTATIC)->GetDc();
    

    Was für eine ID soll denn IDC_DEINSTATIC sein ?

    Ein

    m_pCDCStatic = this->GetDlgItem(IDC_PICTURE)->GetDc();
    

    liefert mir nur den Fehler: "error C2039: 'GetDc': Ist kein Element von 'CWnd'"

    DaDings schrieb:

    und mit dem kannst dann im ganzen Programm zeichnen.... und nur in der Picturebox

    Da ich nicht verstehe was die Variable m_pCDCStatic enthält weiß ich noch nicht wie ich damit jetzt zeichnen kann.

    Matthias



  • pospiech schrieb:

    DaDings schrieb:

    in die .h Datei eine Variable rein

    CDC   *m_pCDCStatic
    

    in die Funktion OnInitDialog()

    m_pCDCStatic = this->GetDlgItem(IDC_DEINSTATIC)->GetDc();
    

    Was für eine ID soll denn IDC_DEINSTATIC sein ?

    Die ID, die du im Ressourcen-Editor deinem Picture Control verpasst hast.
    (hmm, da du dafür sowieso schon einen Member hast, könntest du auch darüber gehen:

    m_WndPicture.GetDC();
    

    Ein

    m_pCDCStatic = this->GetDlgItem(IDC_PICTURE)->GetDc();
    

    liefert mir nur den Fehler: "error C2039: 'GetDc': Ist kein Element von 'CWnd'"

    Ja, die Methode schreibt man auch mit großem 'C' am Ende 😉

    DaDings schrieb:

    und mit dem kannst dann im ganzen Programm zeichnen.... und nur in der Picturebox

    Da ich nicht verstehe was die Variable m_pCDCStatic enthält weiß ich noch nicht wie ich damit jetzt zeichnen kann.

    Die Variable bekommt den Device Context des Fensters.

    @Dings: Hast du dir mal die Beschreibung zu GetDC() angesehen?

    MSDN - CWnd::GetDC schrieb:

    The pointer may be temporary and should not be stored for later use.

    Besser ist es deshalb vermutlich, den DC in jeder Funktion anzufordern, die ihn benötigt - und am Ende jeweils per ReleaseDC() freizugeben.



  • Vielleicht sehe ich einfach nicht was ich falsche mache, da ich hier zum ersten Mal überhaupt in VC C++ versuche etwas zu malen.

    in der .h Datei

    public:
    	CStatic m_WndPicture;
    

    ich vermute ja das es nicht CStatic sein darf, weiß aber nicht wie ich die membervariable einer Picture Control anders zuweisen müsste. Eine Auswahl hat mit VS eh nicht angeboten.

    Zuerst versuche ich die Koordinaten der Picture Control zu bekommen

    CRect rect;
    	m_WndPicture.GetClientRect (&rect);
    

    damit stürzt die Application ab (kompilieren tut sie)

    die hier vorgeschlagene Variable habe ich so genutzt wie ich es verstanden habe, was aber nur dazu führt, das die Applikation mit einer Zugriffsverletzung abstürzt

    m_pCDCStatic = m_WndPicture.GetDC();
    

    da ich nicht wußte womit ich jetzt zeichnen kann habe ich einfach mal folgendes ausprobiert

    m_pCDCStatic.MoveTo (rect.left, rect.top);
       m_pCDCStatic.LineTo (rect.right, rect.bottom);
    

    was aber offensichtlich falsch ist, weil es nicht kompiliert.

    Ich habe also offensichtlich einen 100 % falschen Quellcode und bin noch immer nicht weiter.

    Matthias



  • pospiech schrieb:

    Vielleicht sehe ich einfach nicht was ich falsche mache, da ich hier zum ersten Mal überhaupt in VC C++ versuche etwas zu malen.

    in der .h Datei

    public:
    	CStatic m_WndPicture;
    

    ich vermute ja das es nicht CStatic sein darf, weiß aber nicht wie ich die membervariable einer Picture Control anders zuweisen müsste. Eine Auswahl hat mit VS eh nicht angeboten.

    Zuerst versuche ich die Koordinaten der Picture Control zu bekommen

    CRect rect;
    	m_WndPicture.GetClientRect (&rect);
    

    damit stürzt die Application ab (kompilieren tut sie)

    Was für einen Fehler meldet denn die Anwendung, bevor sie sich verabschiedet? Eventuell hast du ja auch zu früh versucht, das ClientRect zu bekommen (viele CWnd-Methoden funktionieren erst, wenn das dahinterliegende Fenster erstellt ist).

    da ich nicht wußte womit ich jetzt zeichnen kann habe ich einfach mal folgendes ausprobiert

    m_pCDCStatic.MoveTo (rect.left, rect.top);
       m_pCDCStatic.LineTo (rect.right, rect.bottom);
    

    was aber offensichtlich falsch ist, weil es nicht kompiliert.

    m_pCDStatic ist ein Pointer, da greift man über -> auf die Member(funktionen) zu.

    PS: Eventuell könntest du mal genauer umreißen, was du eigentlich vorhast. Und du solltest etwas mehr Code posten, damit wir sehen, in welchem Zusammenhang etwas nicht funktioniert hat.


Log in to reply