ein Array von char[2500] soll als Bitmap dargestellt werden..



  • Ich habe einen Array von char[2500].
    jetzt möchte ich diesen Array darstellen - klar, in meiner WM_PAINT-Section.

    Ich bastle also DIB-Sections und möchte das Ganze dann per StretchBlt darstellen:
    << sämtliche Variablenwerte sind an sich ok..>>

    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 );
    
    }
    

    Soviel zum CreateDIBSection()..

    hier die (gekürzte Fensterfunktion:

    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);
    
    //                  rect.left = (int)  (Sc->fZoom * (50 * Sc->TickX + ScItemX));
    //                  rect.top = (int)   (Sc->fZoom * (50 * Sc->TickY + ScItemY));
    //                  rect.right = (int) (Sc->fZoom * (50 * Sc->TickX + ScItemX + 1.0));
    //                  rect.bottom = (int)(Sc->fZoom * (50 * Sc->TickY + ScItemY + 1.0));
    
                      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;
    
    }
    

    So, was ist nun nicht richtig?
    Ich gebe zu, dass ich sowas noch nie probiert habe und deswegen relativ wenig Ahnung von DIBSections..

    plz hlp!! 🙂

    cYa && thx
    DjR

    [ Dieser Beitrag wurde am 04.12.2002 um 21:30 Uhr von DocJunioR editiert. ]



  • *push*



  • Ich sehe nirgends den Inhalt dieses Char-Arrays initialisiert.

    Mfg Ominion



  • wer zum Geier durchsucht uralte posts um sie hoch zu pushen??
    Und warum benutzt der Honk auch noch meinen Nick für solch Schwachsinn?



  • Naja das scheint jetzt jemand lustig zu finden. Das war mit der Schriftart auch so.
    Topic: Hast du die Lösung schon?

    Mfg Ominion



  • Ich bin der Meinung, dass ja.. allerdings ist das schon 3.4 Jahre her.. Ich weiß gerade mal noch halbwegs, was für ein Programm ich da gebaut hatte.
    Kann also nicht genau sagen, wie ich's gelöst hab..



  • Aso...kann ja sein das du das immer noch nicht gelöst hast, und dein Programm irgendwo auf der Festplatte vergamelt, deshalb meine Frage.

    Mfg Ominion


Log in to reply