Riesenprobleme beim Abbilden auf Gerätekontext



  • hi,

    ich bekomme echt langsam das mittlere Verzweifeln:

    ich versuche mich grade an einem Programm, mit dem ich über mathematische Algorithmen Grafiken erzeugen will.
    Dafür habe ich COLORREF verwendet:

    for(int y = 0; y < 480; y++)
    {
    for(int x = 0; x < 640; x=x+1)
    { 
    if(y%factor_y==0)r = (y*255/480)+factor_y;
    if(r<0)r==0;
    if(r>255)r=255;
    if(x%factor_x==0)g = (x*255/640)+factor_x;
    if(g<0)g==0;
    if(g>255)g=255;
    b=(255-r-g);
    if(b<0)b=0;
    if(b>255)b=255;
    this->m_colData[y * 640 + x] = RGB(b, g, r);
    }
    }
    

    Das bilde ich nun in der Funktion OnOK wie folgt ab:

    CClientDC mydc(this); // device context for painting
    	if(!SetDIBitsToDevice(mydc, 20, 20, 320, 240, 0, 0, 0, 240, m_colData, &this->m_bmi, DIB_RGB_COLORS))
    	{
    		AfxMessageBox("ERROR");
    	}
    

    hiermit erzeuge ich einen einfachen "Verlauf".
    Dieses Bild möchte ich nun Abbilden und dann durch versch. Filter "jagen"... ...
    matheatisch ist das alles kein Problem, nur habe ich meine Sorgen mit den tausenden Kontexten, Bitmaps etc. So gibt es z.Bsp, CDC, HDC, CPaintDC, CClientDC oder es gibt BITMAP, HBITMAP, CBitmap. Ich sehe da nicht durch .. und wäre froh, wenn es nur für Grafikprogrammierung ein Buch gäbe.

    Mein Problem ist nun:
    Ich habe eine SDI-Aplikation und möchte da textdateien(algorithmen) laden, Bilder erstellen, abbilden und später speichern.
    Das einlesen der algorithmusDatei ist auch kein Problem, nur das Abbilden, ohne ständig neu einzulesen.

    Idealerweise sollte das Programm dann schon so ablaufen:
    - Datei laden
    - Bild dazu erstellen
    - Bild im Fenster abbilden
    - Bild evtl. nachbearbeiten (nur Filter)
    - Bild als BMP (vorerst) speichern

    Wie muß ich nun vorgehen, so dass ich das "Bild" einmal erstelle, und dann mit BitBlt abbilde ... ich habe sehr intensiv die MSDN durchsucht, finde aber nichts, was im Zusammenhang mit SetDIBits und BitBlt stehen könnte. AUch ist mein English nicht grade sehr gut, so dass mir das auch Schwierigkeiten bereitet.

    ich bin für jede Hilfe mehr als dankbar, weil das Thema mich langsam echt frustriert.



  • Ich weiss nciht, was this->m_colData[y * 640 + x] = RGB(b, g, r); ist, aber ich nehme mal an, das ist ein Array aus COLORREF-Objekten.
    Ich würde das ganze mal ganz simpel machen:

    CDC m_dc;
    CBitmap m_bmp;
    

    als Member der Klasse.

    In deiner OnInitDialog oder InitialUpdate:

    CClientDC dc(this);
    m_dc.CreateCompatibleDC(&dc);
    m_bmp.CreateCompatibleBitmap(&dc,640,480); //Habe hier angenommen, dass dein Bild 640x480 Pixel groß werden soll.
    m_dc.SelectObject(&m_bmp);
    

    Dann in deiner Funktion:

    [cpp]
    for(int y = 0; y < 480; y++)
    {
    for(int x = 0; x < 640; x=x+1)
    {
    if(y%factor_y==0)r = (y255/480)+factor_y;
    if(r<0)r**=**0; // Ich habe mir erlaubt den Fehler hier rauszumachen
    if(r>255)r=255;
    if(x%factor_x==0)g = (x
    255/640)+factor_x; // Kommt es bei dieser Rechnung auf die Nachkommastellen an? wenn ja, dann mach es so:
    // if(x%factor_x==0)g = (x*255.0/640.0)+factor_x;
    if(g<0)g**=**0; // Ich habe mir erlaubt den Fehler hier rauszumachen
    if(g>255)g=255;
    b=(255-r-g);
    if(b<0)b=0;
    if(b>255)b=255;
    m_dc.SetPixel(x,y,RGB(b, g, r));
    }
    }[/cpp]

    CClientDC mydc(this); // device context for painting
        mydc.BitBlt(0,0,640,480,&m_dc,0,0,SRCCOPY);
    

    Aus dem Kopf geschrieben, könnte ein paar Fehler enthalten.



  • hi,

    danke für deine Hilfe .... es klappt so:

    Nun habe ich noch eine Frage: ich nutze CScrollView in einer SDI-Applikation.
    und wenn ich nun die Scrollbalken verschiebe, dann wird jedesmal das bild wieder links oben im Fenster gezeichnet .. wie bringe ich das Bild wirklich zum Scrollen ?

    DANKE



  • Die beiden ersten Parameter von BitBlt geben den Offset an. Du musst also einfach die aktuelle Position der Scrollbar nehmen um einen anderen Offset zu berechnen.


Anmelden zum Antworten