StretchBlt mit dem Ergebnis von CreateDIBSection
-
ich habe mit CreateDIBSection ein hBitmap erstellt:
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 = 5 * i; lpQuad->rgbGreen = 5 * i; lpQuad->rgbBlue = 0x80; lpQuad++; } for (i = aH->WaterMark + 1; i <= 255; i++) // Braun bis zur Wassermarke { lpQuad->rgbRed = i; lpQuad->rgbGreen = 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 ); return hBitmap; }
So weit waren wir ja schon.
Nun aber mein neues Problem. Es wird alles dargestellt. Allerdings besteht mein Bitmap scheinbar nur aus nullen, weshalb es rein blau dargestellt wird.mach ich mal wieder was falsch? - klar. aber was?
-
Du hast doch bisher auch nur ein Bitmap mit deiner Palette angelegt, aber doch noch nichts direkt gezeichnet, oder sehe ich das falsch?
-
ups - vergessen
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_LBUTTONDOWN: GetWindowRect(hWnd, &rect); // relative Koordinate der Mouse MapCX = ((float)(LOWORD(lParam)/ 50.0) * Sc->fZoom) + (Sc->TickX); MapCY = ((float)(HIWORD(lParam)/ 50.0) * Sc->fZoom) + (Sc->TickY); FillKachel (Sc->Felddaten,Sc->FileHeader, MapCX, MapCY, Sc->ScPos, 10, Sc->ActTool); //Füllen der Map Sc->MXPos = LOWORD(lParam); Sc->MYPos = HIWORD(lParam); InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: /* Todo: Mapdaten darstellen */ ScStep =(int)(Sc->fZoom * (float)50); hDC = GetDC(hWnd); for (ScItemX= 0; ScItemX < Sc->FileHeader.XKCount; ScItemX += 1) { for (ScItemY = 0; ScItemY < Sc->FileHeader.YKCount; ScItemY += 1) { // Daten aus dem großen Feldarray ziehen memcpy(&K, Sc->Felddaten[ScItemY * Sc->FileHeader.XKCount + ScItemX], sizeof (T_KACHEL)); // hBitmap erstellen Sc->BitMap = CreateBitMap(hWnd, &K, &Sc->FileHeader); // Koordinaten berechnen rect.left = (int) (Sc->fZoom * 50 * (ScItemX- Sc->TickX)); rect.top = (int) (Sc->fZoom * 50 * (ScItemY- Sc->TickY)); rect.right = (int) (Sc->fZoom * 50); // missbraucht als breite rect.bottom = (int)(Sc->fZoom * 50); // missbraucht als länge // Bitmap darstellen GetObject ( Sc->BitMap, sizeof(BITMAP), &bm); hMemDC = CreateCompatibleDC( hDC ); 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); DeleteObject ( Sc->BitMap ); DeleteDC( hMemDC ); } } ReleaseDC ( hWnd, hDC ); break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hWnd, message, wParam, lParam); } free (K); return 0; }
FillKachel ist eine Fuktion von mir, die die Werte in den Felddaten ändert.