BitBlt ?
-
Hi, wollte mal fragen warum folgendes funktioniert:
void paintBlocks() { hdcBoard = CreateCompatibleDC(GetDC(0)); HDC tHDC; for(int i = 0; i < BOARDW; i++) { for(int j = 0; j < BOARDH; j++) { if(myField[i][j] > 0) { stone tmp = myStones.at(myField[i][j]-1); tHDC = getBitmapHDC(tmp.bitmap); BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCAND); } } } HDC test = GetDC(0); BitBlt(test, 0,0,16,16,tHDC,0,0,SRCCOPY); //<-------- blit von tHDC }dies aber nicht:
void paintBlocks() { hdcBoard = CreateCompatibleDC(GetDC(0)); HDC tHDC; for(int i = 0; i < BOARDW; i++) { for(int j = 0; j < BOARDH; j++) { if(myField[i][j] > 0) { stone tmp = myStones.at(myField[i][j]-1); tHDC = getBitmapHDC(tmp.bitmap); BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCAND); } } } HDC test = GetDC(0); BitBlt(test, 0,0,16,16,hdcBoard,0,0,SRCCOPY);//<-------- blit von hdcBoard }Dazu sei gesagt, dass momentan nur ein block auf 0,0 liegt.
wär super, danke
-
Weil in dein Memory-DC "hdcBoard" nur eine 1x1 große Monochrom-Bitmap selektiert ist.
Du musst nach CreateCompatibleDC() noch eine Bitmap erzeugen (CreateCompatibleBitmap()) und rein-selektieren.
-
geeky schrieb:
Weil in dein Memory-DC "hdcBoard" nur eine 1x1 große Monochrom-Bitmap selektiert ist.
Du musst nach CreateCompatibleDC() noch eine Bitmap erzeugen (CreateCompatibleBitmap()) und rein-selektieren.hm danke, kannste mir kurz zeigen wie ich das genau machen soll ?
wenn ich jetzt folgendes mache:
void paintBlocks() { HDC tHDC; for(int i = 0; i < BOARDW; i++) { for(int j = 0; j < BOARDH; j++) { if(myField[i][j] > 0) { stone tmp = myStones.at(myField[i][j]-1); tHDC = getBitmapHDC(tmp.bitmap); BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCCOPY); } } } }case WM_PAINT : GetWindowRect(hDlg, &winCoords); paintBlocks(); hdc = BeginPaint (hDlg, &ps) ; if(hdcBoard) { BitBlt (hdc, boardCoords.left-winCoords.left, boardCoords.top-winCoords.top-16, boardCoords.right-boardCoords.left, boardCoords.bottom-boardCoords.top, hdcBoard, 0, 0, SRCCOPY) ; } EndPaint (hDlg, &ps); return 0 ;dann bekommt ich nur n schwarzes bild

case WM_INITDIALOG: hdcBoard = CreateCompatibleDC(GetDC(0)); tBitmap = CreateCompatibleBitmap(hdcBoard,boardCoords.right-boardCoords.left,boardCoords.bottom-boardCoords.top); SelectObject(hdcBoard,(HBITMAP)tBitmap); return TRUE;
-
Hast du schon versucht alle Inits und Aufrufe hintereinander und nicht in den unterschiedlichen WMs auszuführen...?
Vlt werden die zwischendurchverändert...
-
ase WM_INITDIALOG: hdcBoard = CreateCompatibleDC(GetDC(0)); tBitmap = CreateCompatibleBitmap(GetDC(0),boardCoords.right-boardCoords.left,boardCoords.bottom-boardCoords.top); SelectObject(hdcBoard,(HBITMAP)tBitmap); return TRUE;Nimm bei CreateCompatibleBitmap() nicht hdcBoard!
Bei CreateCompatibleDC() ist in hdcBoard standardmässig eine 1x1 Monochrom-Bitmap rein-selektiert. Wenn du dann CreateCompatibleBitmap() aufrufst mit hdcBoard als HDC-Parameter wird die Bitmap die du zurück bekommst auch Monochrom, bei GetDC(0) kriegt sie dieselbe Farbtiefe wie der Desktop.
-
wenn ich
tBitmap = CreateCompatibleBitmap(GetDC(0),boardCoords.right-boardCoords.left,boardCoords.bottom-boardCoords.top);mache gehts aber auch nicht...
und in GetDC(0) ist ja der gesamte bildschirminhalt drin
hmmwenn ich statt
BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCAND);BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCCOPY);mache, dann gehts oO
edit: aber das ganzw wird, wie ich grade sehe UNTER die controls von meinem fenster gezeichnet oO
wie kann ich über die controls zeichnen?
UND
wie kann ich mehrere bilder nacheinander in ein DC blitten(an verschiedene positionen, so das sie alle sichtbar sind)?
-
pixartist schrieb:
wenn ich
tBitmap = CreateCompatibleBitmap(GetDC(0),boardCoords.right-boardCoords.left,boardCoords.bottom-boardCoords.top);mache gehts aber auch nicht...
und in GetDC(0) ist ja der gesamte bildschirminhalt drin
hmmDu musst die Variable natürlich initialisieren und korrekt deklariern (mglw. static).
pixartist schrieb:
wenn ich statt
BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCAND);BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCCOPY);mache, dann gehts oO
Vllt. mal die MSDN zu den ROP-Codes lesen...
pixartist schrieb:
edit: aber das ganzw wird, wie ich grade sehe UNTER die controls von meinem fenster gezeichnet oO
wie kann ich über die controls zeichnen?Da musst Du die Controls subclassen, da Du unter deren WM_PAINT zeichen musst. Andernfalls würde der Button Dein gezeichnetes Meisterwerk wieder übermalen.
pixartist schrieb:
wie kann ich mehrere bilder nacheinander in ein DC blitten(an verschiedene positionen, so das sie alle sichtbar sind)?
Mit BitBlt und entsprchenden unterschiedlichen Positionsangaben. Ggfs. auch via Back-Buffering (siehe google, FAQ, falls unbekannt).
-
CodeFinder schrieb:
pixartist schrieb:
wie kann ich mehrere bilder nacheinander in ein DC blitten(an verschiedene positionen, so das sie alle sichtbar sind)?
Mit BitBlt und entsprchenden unterschiedlichen Positionsangaben. Ggfs. auch via Back-Buffering (siehe google, FAQ, falls unbekannt).
hmm hab ich mir eig. auch gedacht, kannste mir dann aber erklären, warum das hier:
HDC tHDC; stone tmp; for(int i = 0; i < BOARDW; i++) { for(int j = 0; j < BOARDH; j++) { if(myField[i][j] > 0) { tmp = myStones.at(myField[i][j]-1); tHDC = getBitmapHDC(tmp.bitmap); BitBlt(hdcBoard, i*16,j*16,16,16,tHDC,0,0,SRCCOPY); } } }immur nur den ersten(!) block blittet?
dh. wenn ich folgendes mache:
myField[0][0] = 1; myField[0][1] = 1;dann wird nur der auf 0,0 gezeichnet, wenn ich aber die erste zeile auskommentiere, wird der auf 0,1 gezeichnet usw
edit: ok das muss an einem anderen teil meines codes liegen

hab mich mit subclassing noch nicht beschäftigt..hättest da mal nen link / code ?
-
pixartist schrieb:
edit: ok das muss an einem anderen teil meines codes liegen

hab mich mit subclassing noch nicht beschäftigt..hättest da mal nen link / code ?
...