Größe einer Bitmap im CStatic anpassen
-
Hallo!
Ich Programmiere mit Visual Studio 2008 unter WINXP und verwende die MFC.
Ich habe ein ByteArray, welches meine RGB Werte enthält, die ich als Bitmap anzeigen möchte. Ich erzeuge mir eine BITMAPINFO und dann eine HBITMAP, die ich in meinem CStatic anzeigen lasse, was auch prinzipiell funktioniert:hBitmap = CreateDIBSection ( NULL, (BITMAPINFO *) &bmpInfo, DIB_RGB_COLORS, (void **)&pPixels , NULL, 0); SetBitmapBits( hBitmap, lBmpSize, imageArray); // GDI-Funktion m_CStaticPreview.SetBitmap (hBitmap);Da die Bitmap größer als das CStatic ist, ist nur ein Teil der Bitmap zu sehen.
Nun möchte ich gerne die Größe der Bitmap anpassen (auf die Größe des CStatic reduzieren auch wenn dadurch dass Bild verzerrt wird). Erzeuge ich ein HBITMAP von einem BMP, das von der Festplatte geladen wird geschieht diese Skalierung implizit denn:HBITMAP myTest = (HBITMAP) LoadImage(NULL, "c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_CStaticPreview.SetBitmap (myTest );staucht die Bitmap von allein, so dass sie genau das CStatic ausfüllt.
Meine Idee war nun zu dem CStatic den HDC zu holen dazu einen kompatiblen HDC erzeugen und mittels StretchBlt(...) oder StretchDIBits(...) die Bitmap zu skalieren. Wahrscheinlich ist schon dieser Ansatz falsch denn:
HDC hdcCStatic, hdcTemp; hdcCStatic = (HDC) m_CStaticPreview.GetDC(); hdcTemp = CreateCompatibleDC (hdcCStatic); bool temp = StretchBlt(hdcCStatic, 0,0,m_nDisplayWidth, m_nDisplayHeight, hdcTemp, 0, 0, 320, 240, SRCPAINT); DWORD dw = GetLastError(); SetBitmapBits ( hBitmap, lBmpSize, imageArray); m_CStaticPreview.SetBitmap (hBitmap);liefert für hdcTemp NULL

Und demnach nach StretchBlt für dw einen "Ungültiges Handle" als Fehlerocde.
Wie kann ich denn nun einfach nur dafür sorgen dass das Bitmap auf die größe des CStatic skaliert wird...Bin über jeden Hinweis sehr Dankbar!
Grüße André
-
Guck mal, ob Dir dies was hilft:
http://www.codeproject.com/KB/miscctrl/wndimg.aspxIch schnall' den DC/BMP - Krams auch nicht so richtig, aber dort hab' ich das schonmal zum Laufen gebracht
