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.


Anmelden zum Antworten