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!!!


Anmelden zum Antworten