Ausgabe am Bildschirm SetPixel vs. BitBlt



  • Hi Leute!
    Wenn ich den nachfolgenden Code in das WM_PAINT-Nachrichtenereignis eintrage
    wird durch Bereich 1 eine blaue Fläche, durch Bereich 2 aber eine rote Fläche erzeugt.
    Vertauscht Windows hier einfach die Rot- und Blau-Werte?

    [cpp]
    HDC hdc;
    
    hdc = BeginPaint(hwnd, &ps);
    
    COLORREF Display[1024][768];
    
    // Bereich 1
    //----------
    for(int i = 0; i < 1024; i++)
    {
    	for(int j = 0; j < 768; j++)
    	{
    		SetPixel(hdc, i, j, 0x00FF0000);
    	}
    }
    // Bereich 1 Ende
    
    // Bereich 2
    //----------
    HDC hMemDC;
    HBITMAP hBitmap;
    
    for(int i = 0; i < 1024; i++)
    {
    	for(int j = 0; j < 768; j++)
    	{
    		Display[i][j] = 0x00FF0000;
    	}
    }
    
    hBitmap = CreateBitmap(1024, 768, 1, 32, &Display);
    hMemDC = CreateCompatibleDC(hdc);
    SelectObject(hMemDC, hBitmap);
    BitBlt(hdc, 0, 0, 1024, 768, hMemDC, 0, 0, SRCCOPY);
    // Bereich 2 Ende
    
    EndPaint(hwnd, &ps);
    [/cpp]
    


  • SetPixel will eine COLORREF-Struktur, die ist so definiert:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/colors_9xiq.asp
    Da kommt also zuerst blau dran 😉

    Man kann da auch prima das RGB-Makro benutzen:
    SetPixel(hdc, i, j, RGB(255,0,0));



  • EDIT: (Hatte übersehen, dass du 32 Bit Farbtiefe verwendet hast, deswegen waren meine Aussagen diesbezüglich fehlerhaft.

    CreateBitmap erwartet als Pixeldaten ein Array aus RGBQUAD-Strukturen und nicht COLORREFs. Außerdem müssen die Pixeldaten auf 32Bit ausgerichtet sein, was aber bei deiner Farbtiefe von 32 Bit ja immer der Fall ist ohne besondere Vorkehrungen.


Anmelden zum Antworten