Bitmaps reihen



  • Hallo,
    mein Titel ist ziemlich dämlich, aber mir viel nix besseres ein 🙂

    Ich möchte gerne ein Bitmap von einer Breite von ca. 3-4px auf eine Fläche von ca 40-50 px bringen. Wie könnte ich das am geschicktesten wäre es doch, das Bitmap ein paar mal nebeneinander zu reihen, doch wie bewerkstellige ich dies am besten ??

    Im Grunde will ich das selbe machen, wie wenn man bei tables (in html) einen Hintergrund angibt.

    Vielen Dank für jeglich Tipps
    🙂



  • Bin mir im Augenblick nicht sicher, ob es nicht auch einfacher geht, aber im Prinzip könntest du doch einfach mehrmals hintereinander BitBlt aufrufen 🙄



  • PatBlt() ist die Antwort. Hier mal eine Funktion, mit der man den gesamten Bildschirm eingrauen kann wie, wenn man auf Start->Beenden in win9X klickt:

    VOID DarkenScreen()
    {
       HBITMAP           hBrushBmp;
       HDC               hMemDC;
       HDC               hdc;
       HBRUSH            hBrush, hOrgBrush;
       int               i, k, offset, width, height;
    
       // Vorbereitungen
       width     = Screen->Width;  // Wäre noch zu modifizieren mit
       height    = Screen->Height; // GetSystemMetrics() und SM_CX(Y)SCREEN
       hdc       = GetWindowDC(GetDesktopWindow());
       hMemDC    = CreateCompatibleDC(hdc);
       hBrushBmp = CreateCompatibleBitmap(hdc, 8, 8);
       SelectObject(hMemDC, hBrushBmp);
    
       // Das Brush-Bitmap erstellen im DC
       offset = 0;
       for(i=0; i<8; i=i+1)
       {
          for(k=0; k<8; k=k+1)
             if(   (  (k + offset) % 2  ) == 0   )
                SetPixel(hMemDC, k, i, RGB(0,0,0));
             else
                SetPixel(hMemDC, k, i, RGB(255,255,255));
          offset = offset + 1;
       }
    
       // Den Brush erstellen und ins Screen-DC hauen
       hBrush = CreatePatternBrush(hBrushBmp);
       hOrgBrush = (HBRUSH)SelectObject(hdc, hBrush);
    
       // Den Bildschirm verdunkeln
       PatBlt(hdc, 0, 0, width, height, 0xA000C9);
    
       // Aufräumen
       SelectObject(hdc, hOrgBrush);
       DeleteObject(hBrush);
       DeleteObject(hBrushBmp);
       ReleaseDC(NULL, hMemDC);
       ReleaseDC(GetDesktopWindow(), hdc);
    }
    


  • BitBlt ist dein Freund 😃

    HDC hDC = 0, hMemDC = 0;
    RECT rc;
    static BITMAP bm;
    static HBITMAP hBitmap;
    PAINTSTRUCT ps;
    
    //...
    
    	case WM_CREATE: //case WM_INITDIALOG:
    		hBitmap = LoadBitmap(GetModuleHandle(0),MAKEINTRESOURCE(IDB_BITMAP1));
    		GetObject(hBitmap,sizeof(BITMAP),&bm);
    		break;
    	case WM_PAINT:
    		hDC = BeginPaint(hWnd,&ps);
    		hMemDC = CreateCompatibleDC(hDC);
    
    		GetClientRect(hWnd,&rc);
    		SelectObject(hMemDC,hBitmap);
    
    		for (int y = 0; y < rc.bottom; y += bm.bmHeight)
    			for (int x = 0; x < rc.right; x += bm.bmWidth)
    				BitBlt(hDC,x,y,bm.bmWidth,bm.bmHeight,0,0,hMemDC,SRCCOPY);
    
    		DeleteDC(hMemDC);
    		EndPaint(hWnd,&ps);
    		return 0;
    //...
    


  • Shlo schrieb:

    BitBlt ist dein Freund 😃

    Aber ein schlechter. Mehr ein Kumpel, würd ich sagen. Dein richtiger Freund ist PatBlt(). 😃



  • Gast- schrieb:

    Ich möchte gerne ein Bitmap von einer Breite von ca. 3-4px auf ...

    WebFritzi schrieb:

    PatBlt() ist die Antwort

    MSDN schrieb:

    The PatBlt function paints the specified rectangle using the brush that is currently selected into the specified device context.

    aber was hat es mit seiner Frage zu tun? 😕



  • Oh man! Lies dir meinen Beitrag durch, dann kapierst auch du es! Man erstellt mit CreatePatternBrush() einen Brush mit dem BMP darin. Dann benutzt man PatBlt() wie in dem Code, den ich gepostet habe, und es funzt.

    EDIT: Vielleicht geht es auch mit BitBlt() und dem oben angegebenen Raster Operation Code. Dann braucht man auch kein Bitmap-Brush. 😉



  • Hier! Hab ich eben getestet. Sind zwar VCL-Befehle drin, aber die sind selbsterklärend. Canvas->Handle ist das HDC des Hauptfensters. bmp->Handle ist das HBITMAP-Handle des Bitmaps.

    Graphics::TBitmap* bmp = new Graphics::TBitmap;
       bmp->LoadFromFile("WinFlagXP.bmp");
    
       HBRUSH hBrush = CreatePatternBrush(bmp->Handle);
       HBRUSH hOrgBrush = (HBRUSH)SelectObject(Canvas->Handle, hBrush);
    
       PatBlt(Canvas->Handle, 0, 0, Width, Height, 0xA000C9);
    
       delete bmp;
       SelectObject(Canvas->Handle, hOrgBrush);
       DeleteObject(hBrush);
    


  • @Shlo: Ich habe auch deine Methode mal getestet. Die ist schneller! 🙄 Du solltest trotzdem mehr auf die Beiträge anderer achten.

    @Gast: Nimm also Shlo's Methode.



  • @WebFritzi: Hast du das alles in WM_PAINT gehabt? Dann wäre es ja klar, das das langsamer ist. Aber das traue ich dir gar nicht zu. 🤡



  • WebFritzi schrieb:

    Du solltest trotzdem mehr auf die Beiträge anderer achten.

    tue ich 😃 😋


Anmelden zum Antworten