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


Anmelden zum Antworten