jpg



  • Jetzt doch noch etwas, ich arbeite mit VS 2008 Standard, wenn ich ein CImage deklariere: CImage img; kommt die Compilerfehlermeldung: CImage nicht deklarierter Bezeichner ! Allerdings ist CImage im lokalen Hilfesystem verzeichnet! Muss man irgendeine Headerdatei miteinbeziehen ? Wenn ja welche ?



  • Sorry ich habe es bisher nicht gefunden, man muss #include "atlimage.h" eintragen.



  • Wo sollte man die #include-Anweisung unterbringen ? bei stdafx.h ? dann würde sie doch mehrfach einbezogen werden, weil stdafx.h bei jeder cpp Datei includiert wird ? Oder überall wo man CImage braucht ? Gegoogelt habe ich schon, ohne Erfolg. Vielleicht unzureichend ...


  • Mod

    Wie Du es willst und es zu Deinem Design passt... 😉



  • Danke Martin !



  • Das kannst Du über die OleLoadPicture erreichen damit kannst Du verschiedene
    Formate laden, aber ohne kentznisse der DibSectionen und dem BitmapHandling hast Du keine changes an dem Spiel teilzunehmen. Also erstmal das Thema
    HAL durch sehen HAL = HardwareAbstractionLayer.

    Deine Freunde sind dann CreateDibSection DrawDibDraw und konsorten..

    Pseudo Code zum laden von jpg tif usw..

    // Use IPicture stuff to use JPG / GIF files
       IPicture* pPicture = 0;
       IStream* pStream   = 0;
       LPBYTE   hG        = 0;
    
       DWORD fs = Size;
       hG = (LPBYTE) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, fs);
       if(!hG)
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant alloc processheap for image stream\n");
    
      // memcpy(hG,pMem,fs);
    
       HRESULT hRes = ::CreateStreamOnHGlobal(hG,false,&pStream);// Create an IStream so IPicture can 
       if(hRes != S_OK)
       {
        HeapFree(GetProcessHeap(), 0, hG);
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant CreateStreamOnHGlobal\n");
       }
    
       hRes = ::OleLoadPicture(pStream,fs,TRUE,IID_IPicture,(void**)&pPicture);
    
       if(hRes != S_OK)
       {
    	  pStream->Release();
          HeapFree(GetProcessHeap(), 0, hG);
          return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant OleLoadPicture\n");
       }
    
       short type;pPicture->get_Type(&type);
       if(type == PICTYPE_BITMAP)
       {
    		HBITMAP hBmp = 0;
    		hRes = pPicture->get_Handle( (OLE_HANDLE* )&hBmp);//Retrive GDI Object 
    
    		if (hRes == S_OK)
    		{
    			CDib::Draw(hBmp, Flip);
    		}else CVersions::DbgMsg(false,"error: Dib:StreamToPic get_Handle\n");
    
    		if(hBmp)
             ::DeleteObject(hBmp);
       }
    
       if(pStream)
        pStream->Release();
    
       if(hG)
    	  HeapFree(GetProcessHeap(), 0, hG);
    
       if(pPicture)
        pPicture->Release();
    
       return (hRes == S_OK);
    


  • Ist: CImage image; image.Load(_T("C:\\image.jpg")); nicht einfacher ?



  • Java ist einfacher



  • Achromat schrieb:

    Java ist einfacher

    und was hat Java jetzt mit C++/MFC zu tun? Auch wenn es "besser" ist?



  • Wie zeige ich ein CImage img auf ein Fenster ?
    ....MyView::OnPaint...
    CPaintDc dc(this); // und wie weiter ?



  • Etwa so:
    ....
    CPaintDC dc(this);
    img.StretchBlt(dc,...

    Falls ok, Sorry ...



  • Kann man CImage auch importieren, so wie CBitmap ? So dass es in die Release-Version eingebettet wird. Wenn ja wie ?



  • So, jetzt also zum Schluss, ich will Euch nicht länger nerven, die Sache ist erledigt. Die BildDatei wird im MyView-Fenster angezeigt.

    CImage img; // im Header
    img.Load(<BildDatei>); // im Konstruktor oder sonst ?

    ...MyView::OnPaint...
    CPaintDC dc(this);
    img.StretchBlt(dc, ...

    //Funktioniert !

    Und importieren geht mit
    img.LoadFromResource(AfxGetInstanceHandle(), MYBITMAP);
    Wobei MYBITMAP eine importierte Bitmap ist.

    Schöne Weihnachten und ein gutes neues Jahr 2018, Tschüss ...


Anmelden zum Antworten