thread aktualisiert neu - diesen bitte löschen
-
Ich habe ein Bytefeld von 2500 chars. (virtuell 50 * 50)
dieses soll ein Heightfield darstellen.
Wie kann ich jetzt in WinAPI das Ganze in ein BITMAP bekommen, das ich per BitBlt oder StretchBlt darstellen kann?in der FAQ steht afaik nix darüber .. ?
[ Dieser Beitrag wurde am 10.12.2002 um 21:57 Uhr von DocJunioR editiert. ]
-
CreateBitmap, CreateBitmapIndirect, CreateDIBSection.
-
so, ich hab das jetzt nochmal durchprobiert, es klappt aber nicht
typedef unsigned char T_KACHEL[2500]; struct S_ARCHEAD { int SizeOfKachel; int XKCount, YKCount; char WaterMark; }; ... HBITMAP CreateBitMap (HWND hwnd, T_KACHEL *K, S_ARCHEAD *aH) { BITMAPINFOHEADER bi, *lpbi; RGBQUAD *lpQuad; HBITMAP hBitmap; HDC hDC; HANDLE hDIB; int i; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = aH->XKCount; bi.biHeight = aH->YKCount; bi.biPlanes = 1; bi.biBitCount = 8; bi.biCompression = BI_RGB; bi.biSizeImage = aH->XKCount * aH->YKCount; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; hDIB = GlobalAlloc (GHND, sizeof (BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); lpbi = (BITMAPINFOHEADER*) GlobalLock ( hDIB ); *lpbi = bi; lpQuad = &((LPBITMAPINFO)lpbi)->bmiColors[0]; for (i = 0; i <= aH->WaterMark; i++) // Blau bis zur Wassermarke { lpQuad->rgbRed = 0 + 5 * i; lpQuad->rgbGreen = 0 + 5 * i; lpQuad->rgbBlue = 0x80; lpQuad++; } for (i = aH->WaterMark + 1; i <= 255; i++) // Braun bis zur Wassermarke { lpQuad->rgbRed = 0 + i; lpQuad->rgbGreen = 0 + i; lpQuad->rgbBlue = aH->WaterMark; lpQuad++; } hDC = GetDC(hwnd); hBitmap = CreateDIBSection(hDC, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS, (VOID **) &K, NULL, 0); ReleaseDC(hwnd, hDC); GlobalUnlock( hDIB ); GlobalFree ( hDIB ); }
das mag ja vielleicht klappen, aber wenn ich die bilder darstellen will, zeigt er mir nix
LRESULT CALLBACK C_mygrid::ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { C_mygrid *Sc = (C_mygrid*) GetWindowLong(hWnd, GWL_USERDATA); int ScItemX, ScItemY, ScStep; T_KACHEL *K; PAINTSTRUCT ps; HDC hDC, hMemDC; BITMAP bm; RECT rect; HBRUSH Brush; float MapCX, MapCY; int CiRad; switch (message) /* handle the messages */ { ... case WM_PAINT: /* Todo: Mapdaten darstellen */ ScStep =(int)(Sc->fZoom * (float)50); K = &Sc->Felddaten[0]; GetClientRect(hWnd, &rect); for (ScItemX= 0; ScItemX <= Sc->FileHeader.XKCount; ScItemX += 1) { for (ScItemY = 0; ScItemY <= Sc->FileHeader.YKCount; ScItemY += 1) { K = &Sc->Felddaten[ScItemY * Sc->FileHeader.XKCount + ScItemX]; hMemDC = CreateCompatibleDC( hDC ); Sc->BitMap = CreateBitMap(hWnd, K, &Sc->FileHeader); GetObject ( Sc->BitMap, sizeof(BITMAP), &bm); SelectObject (hMemDC, Sc->BitMap); SetStretchBltMode (hDC, STRETCH_DELETESCANS); StretchBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); DeleteDC( hMemDC ); ReleaseDC ( hWnd, hDC ); DeleteObject ( Sc->BitMap ); } } /* Raster Darstellen */ /* funktioniert - deswegen kommt's hier raus. */ break; ... default: /* for messages that we don't deal with */ return DefWindowProc (hWnd, message, wParam, lParam); } return 0; }
was mache ich falsch??
[ Dieser Beitrag wurde am 10.12.2002 um 18:19 Uhr von DocJunioR editiert. ]
-
Ich weiß, pushen ist gemein, hinterhältig und ich bin eigentlich selber kein fan davon. allerdings bin ich auch verzweifelt. ich bin sicher, das ich nur irgendeine Kleinigkeit vergessen habe. bitte helft mit!!!