das mit dem Gerätekontext funktioniert nicht so...



  • hi
    ich möchte in einer anwendung etwas malen. das funktioniert auch, solange ich in der Klasse CProjektDlg bin.
    ich habe aber noch eine andere selbst erstellte Klasse, aus der funktioniert das ja nicht mit
    CClientDC dc(this);
    wie mache ich das da? hab schon versucht, irgendwie das this aus der CProjektDlg zu übergeben, aber das hat nicht funktioniert.
    (sorry wenn es ne doofe frage ist, ich bin noch net so lang dabei 😉 )
    mfg Misc2



  • Gezeichnet wird grundsätzlich nur in OnPaint (Dialog) bzw. in OnDraw (View).
    Du kannst zwar von außerhalb zeichnen, aber das gezeichnete ist beim nächsten neuzeichnen des Fensters wieder weg.



  • naja, aber wenn cih irgendwas grafisches simulieren will, kann ich das doch net in ondraw oder onpaint machen, oder? wie soll denn das gehn? zb wenn ich eine linie aus punkten langsam hinmalen will? (brauch ich für meine facharbeit)



  • Misc2 schrieb:

    naja, aber wenn cih irgendwas grafisches simulieren will, kann ich das doch net in ondraw oder onpaint machen, oder? wie soll denn das gehn? zb wenn ich eine linie aus punkten langsam hinmalen will? (brauch ich für meine facharbeit)

    Klar macht man das so. Du sammelst die Punkte in einer Liste oder in einem Array und in der OnDraw oder OnPaint malst Du die Pixel mit den Werten aus diesem Struct. Da dies sicher zum Flackern führt empfehle ich Dir aber eine Off-Screen-Technik. Da malst die Pixel in eine Bitmap, die als Speichergerätekontext vorliegt. In der OnDraw oder OnPaint blittest Du diese Bitmap auf den Schirm. Funktioniert relativ gut bei mir. Ich muss kreisartige Gebilde malen, die im Vollkreis aus 200 Pixeln bestehen und wo pro Sekunde eine solche Struktur entsteht. Der Vorteil der Bitmap ist, dass die immer im Speicher vorliegt und beim Neuzeichnen nur geblittet werden muss.



  • das klingt gut... leider weiß ich nicht wie cih so ein bitmap erstelle und drin male, oder was "blitten" ist 😉
    ich bin eben noch ein neuling auf dem gebiet.
    kann ich nicht einfach die punkte, die ich male, in einem globalen array speichern und dann in onpaint dieses array durchgehn und alle punkte ncohmal malen? oder geht das nciht mit einem array weil ich vorher die größe noch net weiß? die punkte haben alle die gleiche farbe, also müsste ich eig nur die koordinaten speichern...



  • Misc2 schrieb:

    kann ich nicht einfach die punkte, die ich male, in einem globalen array speichern und dann in onpaint dieses array durchgehn und alle punkte ncohmal malen? oder geht das nciht mit einem array weil ich vorher die größe noch net weiß? die punkte haben alle die gleiche farbe, also müsste ich eig nur die koordinaten speichern...

    Sicher geht das auch. Allerdings kannst Du ja mal ein TRACE in die OnPaint einbauen und schauen, wie oft die aufgerufen wird. Das wird mit hoher Wahrscheinlichkeit zum flackern führen. Also malt man nur das, was neu hinzugekommen ist. Außerdem wenn Du mehrere Tausend Pxel so malen willst wird die Anwendung irgendwann nur noch mit malen beschäftigt sein und somit zu langsam werden.
    Was die Arrays angeht: schau Dir mal die Klassen CArray und CList an. Die kannst Du dynamisch zur Laufzeit vergrößen, d.h. zur Compile-Zeit müssen die Größen nicht bekannt sein.



  • naja, sie wird ja nur aufgerufen, wenn das fenster verdeckt war oder irgendwie inaktiv war. wenn man mit dem programm arbeitet ist es ja normal immer im vordergrund, dann wird onpaint nie aufgerufen und er is nicht nur mit malen beschäftigt.
    wie würde diese andere möglichkeit mit dem bitmap denn funktionieren?



  • Schau mal unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-137769-and-highlight-is-.html nach, da hab ich das Ganze schon mal umrissen.


Anmelden zum Antworten