zeichnen im Dialogfenster



  • Hallo

    ich brauch mal wieder ein bisschen Beistand beim zeichnen.
    Mal kurz mein Problem und Ziel:
    Ich habe 2 Eingabefelder wo ich x und y Koordinaten eingeben kann. Zudem einen Button mit dem Befehl Punkt setzen. Wenn ich nun den Button drücke soll in einen vorher definierten Bereich des Dialogfensters der Punkt gesetzt werden.
    Mein Problem ist es, dass ich nicht weis, welche Befehle wo hin müssen.
    Aber so Punkte setzen mache ich ja unter

    void CTest_GrafikView::OnPaint()
    

    mit dc.SetPixel.

    Vielen Dank
    MfG
    Stefan





  • Das war erst mal ein guter Anfang:) Habe aber immer noch das Problem das er nicht in den Feld richtig zeichnet. Mein Code sieht so aus:

    void CTest_GrafikView::OnZeichnen() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	CWnd *wp;
    	CDC *pDC;
    	CRect Rect;
    
    	wp=GetDlgItem(IDC_STATIC_BILD);
    	pDC=wp->GetDC();
    	wp->GetWindowRect(&Rect);
    
    	pDC->SetPixel(Rect.TopLeft().x+m_xwert,Rect.TopLeft().y+m_ywert,RGB(250,0,0));
    
    	wp->ReleaseDC(pDC);
    }
    

    Mittels

    Rect.TopLeft().x
    

    und

    Rect.TopLeft().y
    

    bekommt man doch die Koordinaten des gezogenen Gruppenfeldes, oder?

    Zudem will ich wenn ich dann einen Punkt gesetzt habe noch einmal Koordinaten in die Felder schrieben und dann den 2. Punkt setzen, wo muss dann die Schleife hin?

    PS:
    Könntest du nochmal kurz erklären woführ CWnd,CDC und CRect ist? Würde darauf tippen, dass man das Dialogfenster mit CWnd initiert und das eigentliche zeichnen mit CDC und das Gruppenfeld mit CRect?



  • Hab jetzt mittels UpdateDate(TRUE|FALSE) es hinbekommen mehrere Punkte setzen zu lassen, blos wenn ich nun das Fenster so verkleinere, dass der Punkt nicht mehr sichtbar ist und dann das Fenster wieder größer ziehe ist der gesetzte Punkt weg. Wie kann ich dies noch umgehen, will schließlich nicht das ein Bild gezteichnet wird und wenn ich das Fenster verkleinere und dann wieder vergrößere, dass das Bild weg ist.

    Hab immer noch das Problem, dass ein Punkt mit P(0|0) im Gruppenfeld nicht in der linken oberen Ecke gesetzt wird?

    MfG
    Stefan

    EDIT:
    Was mir gerade beim probieren noch einfiel, kann ich in den Gruppenfeld auch ein Koordinatensystem einbauen mit der Ausrichtung:

    SetMapMode(hdc,MM_LOENGLISH);
    

    ?



  • *hochschieb*



  • Wie kann ich dies noch umgehen,

    Du musst dafür sorgen das auch beim neuzeichnen des Dialoges deine Punkte gemalt werden. Also z.B. in OnPaint...

    Hab immer noch das Problem, dass ein Punkt mit P(0|0) im Gruppenfeld nicht in der linken oberen Ecke gesetzt wird?

    Client2Screen/ Screen2Client anschauen...



  • Ok, habe jetzt aber das Problem, wie kann ich dann OnPaint mit dem Button verbinden? Bis jetzt akzeptiert er bei

    pDC.SetPixel(m_xwert,m_ywert,RGB(250,0,0));
    

    immer nur die Koordinaten (0|0) und reagiert nicht auf m_...



  • also die frage ist da eher was du genau machen willst und wie du es umsetzt... wenn das programm die ganze zeit neu malen soll kannst du auch nen thread oder einen timer starten der halt ständig zum neu malen aufruft.... wenn du willst das per buttonklick neu gezeichnet wird vermutlich RedrawWindow() weiss ich jetzt nicht aus dem Hut wie die funktion wirklich dazu heisst... findest du aber in der MSDN....



  • Ich will am Ende ein Fraktal berechnen lassen und dies ausgeben. Das hab ich auch schon hinbekommen, wo das Fraktal im ganzen Fenster gezeichnet wurde, blos der Benutzer konnte noch keine Werte verändern, welche das Fraktal beeinflussen. Der Button soll das Fraktal einmal zeichnen und dann soll aber das Bild bestehen bleiben, bis man die Werte geändert hat und wieder den Button für das neuzeichnen drückte.

    Werd dann mal die MSDN nach den Befehl durchsuchen, lässt sich hoff ich was brauchbares finden.

    MfG
    Stefan



  • naja in dem fall kannst du es ja auch benutzerfreundlicher machen und z.b einen Thread oder Timer automatisch z.B. jede Sekunde neu zeichnen lassen... dann muss nur noch an den werten gespielt werden ein eventuelles lästiges buttonklicken entfällt dann...



  • Das mit den Button würde ich schon gerne lassen, denn das anzeigen eines Fraktals kann je nach Rechner eine Weile dauern( ca. 15sek). Je nachdem was der Benutzer für Werte nimmt. Mal noch ne Frage, wäre es umständlicher ein zweites Fenster zu generieren um dort das gesamte Bild zeichnen zu lassen?



  • Das mit den Button würde ich schon gerne lassen, denn das anzeigen eines Fraktals kann je nach Rechner eine Weile dauern( ca. 15sek). Je nachdem was der Benutzer für Werte nimmt

    Na dann ists mit dem Button wirklich besser...

    Mal noch ne Frage, wäre es umständlicher ein zweites Fenster zu generieren um dort das gesamte Bild zeichnen zu lassen?

    Nö wiso soltle das gross umständlich sein... mit AfxGetParentWindow oder so ähnlich heisst die methode bekommst du einen Pointer auf dein "Hauptdialog" von dem ja vermutlich die zu zeichnenden Punkte members sind...



  • Habe mal das mit dem zweiten Fenster angefangen, wie es im Tut. "erklärt" wird, blos verstehe ich da folgende Passage nicht:

    Bevor Sie die Anwendung kompilieren und ausführen können, müssen Sie die Header-Datei für die zweite Dialogfeldklasse in den Quellcode des ersten Dialogfelds einbinden. Weiterhin ist die zweite Dialogfeldklasse als Variable in die erste aufzunehmen. Zu diesem Zweck müssen Sie lediglich eine Member-Variable in die erste Dialogfeldklasse hinzufügen, wobei Sie als Variablentyp den Klassentyp - in diesem Fall CPaintDlg - spezifizieren, den in Listing 8.1 verwendeten Variablennamen m_dlgPaint angeben und den Variablenzugriff als Privat festlegen. Um die Header- Datei in das erste Dialogfeld einzubinden, gehen Sie an den Beginn des Quellcodes für das erste Dialogfeld und fügen eine #include-Anweisung wie in Listing 8.2 hinzu.

    Das mit #include ist ja kein Thema, aber mit der Membervariable bei den ersten Dialogfenster funktioniert irgend wie nicht. Denn wenn ich eine Variable hinzufüge, dann kann ich als Variablentyp nicht den Klassentyp wählen?



  • Na du brauchst nur in dem File deines Childdialoges den deines Parentdialoges includieren und hast dann mit

    ((CParentDlg*)AfxGetMainWnd())->member
    

    zugriff auf das gewünschte...



  • Den Code baue ich dann in die .cpp der Childdatei ein, nehme statt CParentDLG* meine Parent.cpp, z.B. Bild -> CBildDLG und als member?



  • Den Code baue ich dann in die .cpp der Childdatei ein

    Ja wie auch immer dein MaleDialog heisst...

    nehme statt CParentDLG* meine Parent.cpp

    Ich habe keine Ahung wie deine Klasse von der du das "Hauptfenster" erstellst heisst.... du must danach casten... Wenn deine Klasse also MEINFENSTERINDICHDIEWERTEFÜRDIEFRAKTALBERECHNUNGEINTRAGE heisst dann halt nach
    (MEINFENSTERINDICHDIEWERTEFÜRDIEFRAKTALBERECHNUNGEINTRAGE*) casten...

    z.B. Bild -> CBildDLG und als member?

    äh nein

    ((MEINFENSTERINDICHDIEWERTEFÜRDIEFRAKTALBERECHNUNGEINTRAGE*)AfxGetMainWnd())->member_des_Datendialoges_auf_das_ich_vom_dem_Dialog_auf_dem_ich_zeichne_zugreifen_will
    


  • Nun noch eine winzige Frage, was könnte folgenden Fehler verursachen?

    error C2059: Syntaxfehler : 'constant'
    

    Danke für deine Geduld 🙂



  • kann ich dir so aus dem Hut nicht sagen... dazu müsste ich Quellcode sehen...



  • Also der Fehler kommt von diesen Codestück:

    ((CBildDlg*)AfxGetMainWnd())->IDD_GRAFIK_DIALOG;
    

    Hauptfenster ist Grafik und Subfenster ist Bild

    EDIT: Habe das in

    CBildDlg::CBildDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CBildDlg::IDD, pParent)
    

    geschrieben



  • ((CBildDlg*)AfxGetMainWnd())->IDD_GRAFIK_DIALOG;

    IDD_GRAFIK_DIALOG ist falsch...

    du musst doch irgendwelche Paramter und Punkte oder was auch immer angeben die du zeichenen willst... Diese solltest du als ein member deiner Klasse repräsentieren... auf das greifst du dann beim malen zu...


Log in to reply