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 😞
    hmm

    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

    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 😞
    hmm

    Du 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 ?

    Klar 😉 ... ➡ http://winapi.net/index.php?inhalt=s27


Anmelden zum Antworten