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.