CreateCompatibleBitmap - keine grossen Bitmaps ?



  • Hallo zusammen!

    Ich habe ein Problem mit CreateCompatibleBitmap:

    Wenn ich eine grosse Bitmap (5000 x 500) erstelle, bekomme ich zwar keinen
    Fehler, es geht aber etwas schief, weil ich nachher nicht auf diese Bitmap
    zeichnen kann. (es erscheint einfach nichts darauf)

    Erstelle ich hingegen die Bitmap mit nur 2000x500 funktioniert alles einwandfrei.

    CClientDC dc(this);
    CDC memDc;
    if(!memDc.CreateCompatibleDC(&dc))
        return FALSE;   
    CBitmap bitmap;
    
    if( !bitmap.CreateCompatibleBitmap(&dc, 5000, 500))
        return FALSE;
    
    CBitmap* pOldBitmap = memDc.SelectObject(&bitmap);
    
    // draw something
    
    // BitBlt
    

    Gibt es einen Trick fuer grosse Bitmaps ?
    Oder warum schlaegt CreateCompatibleBitmap fehl (return FALSE wird nie ausgefuehrt) ?

    Vielen Dank im Voraus!

    Schoene Gruesse,
    Captain.



  • Wenn CreateCompatibleBitmap keinen Fehler zurückgibt, dann hat alles geklappt. Da ich letztens ein 5800x2500 BMP erstellt habe, weiss ich, dass es funzt. Also liegt der Fehler wohl in dem Stück Deines Codes, den Du uns nicht mitgeteilt hast!

    [ Dieser Beitrag wurde am 19.02.2003 um 13:42 Uhr von RenéG editiert. ]



  • Hallo René!

    Vielen Dank fuer Dein reply!

    Ich bin jetzt Zuhause und hier ist mein Test-Code:

    CBitmap bmp;
                    CDC dc2;
            CClientDC dc(this);
                    int picwidth = 5000; 
            if (!dc2.CreateCompatibleDC(&dc)) {
                AfxMessageBox("error");
                return FALSE;
            }
    
            if (!bmp.CreateCompatibleBitmap( &dc, picwidth,512)) {
                AfxMessageBox("error");
                return FALSE;
            }
    
            CBitmap* oldbmap=dc2.SelectObject(&bmp);
    
                CPen pen( PS_SOLID, 0, RGB(255,255,255));
            CPen* pPenOld = dc2.SelectObject( &pen );
            int nMap = dc2.SetMapMode( MM_TEXT );
    
            for (i=0;i<picwidth;i++) {
                dc2.MoveTo( i, 300 );
                dc2.LineTo( i, 300 );
            }
    
            dc2.SetMapMode( nMap );
                dc2.SelectObject( pPenOld );        
    
            pDC->BitBlt(5,5, 600 , 512 ,&dc2,0,0,SRCCOPY);
            dc2.SelectObject(oldbmap);
    

    Die weisse Linie ist bei z.b. picwidth = 1000 sichtbar, aber nicht mehr bei 5000.

    Vielen Dank fuer Deine Hilfe!

    Schöne Gruesse,
    Hannes.



  • Hm, wer hat Dir eigentlich erzählt, dass eine Linie so gezeichnet wird:

    for (i=0;i<picwidth;i++) {
                dc2.MoveTo( i, 300 );
                dc2.LineTo( i, 300 );
            }
    

    😕 😕 😕

    Probiers mal so:

    dc2.MoveTo( 0, 300 );
    dc2.LineTo( picwidth, 300 );
    


  • Ja, schon klar 😉

    Könntest Du bitte ein Snippet von Deinem '5800x2500 BMP' Project posten ?

    Vielleicht sehe ich dann was ich falsch mache...

    Vielen Dank! 🙂

    Hannes.



  • Da ich mit der WTL arbeite, sieht das so aus:

    CPaintDC dc( m_hWnd);
    CBitmap bmp;
    CDC dc2;
    dc2.CreateCompatibleDC( dc);
    bmp.CreateCompatibleBitmap( dc, 5800, 2500);
    CBitmapHandle oldBmp = dc2.SelectBitmap( bmp);
    dc2.FillSolidRect( CRect( 0, 300, 5000, 301), RGB( 255, 255, 255));
    dc.BitBlt( 0, 0, 600, 512, dc2.m_hDC, 0, 0, SRCCOPY);
    dc2.SelectBitmap( oldBmp);
    

    Also nix anderes im Vgl. zur MFC!



  • Vielen Dank René! 🙂

    Ich werds gleich heute Abend mit CPaintDC, CBitmapHandle, SelectBitmap probieren. Vielleicht liegt da der Hund begraben 🙄

    Schöne Grüße,
    Hannes.



  • DES RÄTSELS LÖSUNG 🙂

    Anstatt dieses Teils

    CPen pen( PS_SOLID, 0, RGB(255,255,255));
            CPen* pPenOld = dc2.SelectObject( &pen );
            int nMap = dc2.SetMapMode( MM_TEXT );
    
            for (i=0;i<picwidth;i++) {
                dc2.MoveTo( i, 300 );
                dc2.LineTo( i, 300 );
            }
    
            dc2.SetMapMode( nMap );
            dc2.SelectObject( pPenOld );
    

    hatte ich meine methode 'setpix' verwendet.
    Da liegt das Problem!

    Ich setze meine Pixel jetzt nicht mehr mit mit 'setpix' (siehe snippet unten) sondern direkt mit FillSolidRect anstatt des Methodenaufrufs 'setpix' (ok, vielleicht etwas 'russisch' aber es funzt).
    Seit dieser Änderung gibt es keine Probleme mehr! Die bitmap wird korrekt angezeigt.

    void CRomeView::setpix (COLORREF color, int x, int y)
    {
    
        CPen pen( PS_SOLID, 0, color);
        CPen* pPenOld = dc2.SelectObject( &pen );
        int nMap = dc2.SetMapMode( MM_TEXT );
    
        dc2.MoveTo( x, y );
        dc2.LineTo( x, y );
    
        dc2.SetMapMode( nMap );
        dc2.SelectObject( pPenOld );
    
    }
    

    Es geht jetzt zwar, aber was ist in 'setpix' falsch ?
    bzw. warum und wie beeinflußt das die bitmap ?

    Herzlichen Dank für die Geduld mit mir. 🙂

    Schöne Grüße,
    Hannes.



  • Na ich denke doch mal, dass

    dc2.MoveTo( x, y );
    dc2.LineTo( x, y );
    

    kein Pixel darstellt, weil eine Linie von (x,y) bis (x,y) gezogen wird, wobei der Zielpukt selbst nicht mehr gemalt wird.
    In diesem Falle wird also gar kein Punkt gezeichnet...
    Oder liege ich da falsch?

    Aber warum sollte man ueberhaupt auf diese Weise einen einzigen Punkt zeichnen wollen?


Log in to reply