Problem mit Fensterhandle HWND
-
Hallo,
ich habe folgendes Problem. Ich bekomme in einer Funktion einen Handle auf
ein Picture Controll als HWND übergeben. Ich habe bisher nur direkt mit der
Controll Variable des Steuerelemts gearbeitet und würde jetzt gerne wissen,
wie ich so Sachen wie GetClientRect und GetDC auf dieses Handle anweden kann.
Bzw. wie ich ggf. aus diesem Handle eine mir vertrautes Steuerelement bekomme.
Ich muss ein Bitmap in der Grösse angepasst in diesem Steuerelement anzeigen.Vielen Dank im Voraus.
Gruss Charlie
-
Es gibt dafür auch WinAPI Funktionen:
HWND hWnd = GibMirDieHWND(); // Hier Deine Funktion/Methode CRect rc; ::GetClientRect(hWnd, &rc); HDC hDC = ::GetDC( hWnd );
-
Erstmal danke für die schnelle Antwort.
Irgendwie funktioniert mein Ansatz aber nicht. Hier mal der Code:CBitmap cbmpBitmap; BITMAP bmpBitmap; HBITMAP hBitmap; // Gewählte Bitmap-Datei laden HINSTANCE hInstance=AfxGetInstanceHandle(); hBitmap=(HBITMAP)::LoadImage(hInstance,path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION); // Ist Handle für das geladene Bild gültig? if(hBitmap) { // Aktuelles Bitmap löschen if(cbmpBitmap.DeleteObject()) // War Bitmap vorhanden, löschen cbmpBitmap.Detach(); // Aktuell geladenes Bitmap mit Bitmap-Objekt verbinden cbmpBitmap.Attach(hBitmap); CDC dcMem; CDC dc; HDC hDC = ::GetDC(m_pWnd); dc.Attach(hDC); cbmpBitmap.GetBitmap(&bmpBitmap); // Geladenes Bitmap holen dcMem.CreateCompatibleDC(&dc); // Neuen Gerätekontext zum orginalen DC kompatibel machen dcMem.SelectObject(cbmpBitmap); // Bitmap in den kompatiblen Gerätekontext selektieren CRect imageRect; ::GetClientRect(m_pWnd, &imageRect); dc.StretchBlt(0, 0, imageRect.Width(), imageRect.Height(), &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); }
Der Code wir fehlerfrei kompiliert, das Bild wird aber leider nicht angezeigt.
Kann mir jemand einen Tipp geben was ich da falsch mache? Ich habe das Bild
testweise mit SetPixel angezeigt, das hat funktioniert.CDC dc; HDC hDC = ::GetDC(m_pWnd); dc.Attach(hDC); CRect rc; ::GetClientRect(m_pWnd, &rc); double zoomX,zoomY; zoomY = (1.0 * bm.bmHeight) / (1.0 * rc.Height()); zoomX = (1.0 * bm.bmWidth) / (1.0 * rc.Width()); for(y=0;y<rc.Height();y++) { for(x=0;x<rc.Width();x++) { dc.SetPixel(x,y,pColor[int(y * zoomY) * bm.bmWidth + (int)(x*zoomX)]); } }
Gruss Charlie
-
Was wäre ein dir vertrautes control?
Meinst du mit "Picture Control" das, was du im VC++ - Ressourceneditor einfügst? Das ist einfach ein Static-control mit SS_BITMAP style. Ein Bitmap kannst du da mit STM_SETIMAGE setzen. Das wird automatisch gestreckt (es sei denn, der SS_REALSIZEIMAGE-Style uit gesetzt).
Vor langer langer Zeit (
)hab ich mal alles, was zum "Bitmap anzeigen" gehört, in ein MFC-Control gepackt: Clickety