Problem mit zeichnen auf Display



  • Guten Morgen allerseits,

    ich schreibe zur Zeit eine Anwendung für Win Mobile 5 und MFC.
    Grob gesagt geht es darum EKG-Daten auf den Handy darzustellen.

    Zuerst mal habe ich mir in der onDraw-Methode ein Millimeterpapier aufs Display zeichnen lassen.

    http://img12.imageshack.us/my.php?image=screenshot1glp.png

    anschließend lasse ich mir die EKG Daten über das Millimeterpapier zeichnen. Wenn ich am Ende des Display angekommen bin springe ich wieder an den Anfang. Problem an der ganzen Sache ist nur dass ich nicht weiß wie ich die Alte Linen wieder löschen kann, wenn ich an den Anfang springe. Hoffe jemand hat ne Idee für mich 🙂

    LG



  • schon mal versucht dein milimeterpapier wieder hinzuzeichnen? dadurch is doch dann der Hintergrund wieder gelöscht



  • richtig habe ich schon versucht allerdings fängt es dann ziemlich zu flackern an 😞



  • das kommt davon weil du keinen backbuffer hast, kannst du das net in ne bitmap zeichnen und dann aufs display blitten, sorry mit win mobile kenn ich mich net wirklich aus, ich weiss das da net alles geht aber das wars schon



  • hm wie könnte ich das in ein Bitmap zeichnen ?

    LG



  • na im normalfall zeichnest du wie aufn display, nur das du dir ne bitmap so groß wie dein display erzeugst, einen displaykompatiblen dc erstellst die bitmap da hineinselektierst und auf der zeichnest, wenn du fertig mit zeichnen bist, blittest du die ganze bitmap auf den screnndc fertig.



  • Hab hier gerade mal im Forum nachgeschaut und anscheinend gibt es schon kein CImage, welches ich imho ja bräuchte 😞



  • wieso brauchst du CImag, reicht doch CBitmap und die wird es doch geben



  • Hm ja stimmt. Ich werde das ganze mal testen und mich dann wieder melden.
    THX schon mal.



  • so das ganze klappt ganz gut und flackert jetzt auch nicht mehr.

    // Create a memory DC compatible with the paint DC
        	 CDC memDC;
        	 memDC.CreateCompatibleDC( &dc );
    
           	 CRect rcClip, rcClient;
        	 dc.GetClipBox( &rcClip );
    
           	 GetClientRect(&rcClient);
    
            	 // Select a compatible bitmap into the memory DC
        	 CBitmap bitmap;
        	 bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
        	 memDC.SelectObject( &bitmap );
    
           	 // Set clip region to be same as that in paint DC
        	 CRgn rgn;
        	 rgn.CreateRectRgnIndirect( &rcClip );
        	 memDC.SelectClipRgn(&rgn);
        	 rgn.DeleteObject();
    
        	//hier  zeichnen ......
    
      	 //jetzt den MemDC kopieren
     	 dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC,rcClip.left, rcClip.top, SRCCOPY );
    

    aufrufen tue ich es dann mit reDraw().

    Eine frage noch, ist es irgendwie aus Performancegründen möglich das er das Zeichnen nur 1 mal macht und dann nur noch die Bitmap läd?

    LG



  • hast du dir das geliehen aus nen anderen thread von hier? sieht so zumindest aus, das ich zum beispiel noch nie solche sachen wie GetClipBox, CreateRectRgnIndirect und SelectClipRgn gebraucht habe wenn ich über ne bitmap gezeichnet habe und die auf den screen geblittet habe. aber na ja was solls nur mal mein kommentar dazu 😉

    // Create a memory DC compatible with the paint DC
             CDC memDC;
             memDC.CreateCompatibleDC( &dc );
    
            CRect rcClient;
             GetClientRect(&rcClient);
    
                 // Select a compatible bitmap into the memory DC
             CBitmap bitmap;
             bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
             memDC.SelectObject( &bitmap );
    
            //hier  zeichnen ......
    
           //jetzt den MemDC kopieren
          dc.BitBlt( 0, 0, rcClient.Width(), rcClient.Height(), 0, 0, SRCCOPY );
    

    Is kürzer und sollte das gleiche rauskommen


Log in to reply