Bitmaps reihen
-
Hallo,
mein Titel ist ziemlich dämlich, aber mir viel nix besseres einIch 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