Problem mit SelectObject



  • Hallo,

    ich habe folgendes Problem. Ich habe eine Dialogbasierte Anwendung erstellt. Es soll ein Informationsdialog über eine Software sein. In einem Bild-Steuerelement soll ein Logo angezeigt werden.
    Je nach Lizenz hat das Produkt aber ein anderes Logo in einer anderen Größe. Ich möchte nun ein zu großes oder zu kleines Logo auf eine feste Größe skalieren.

    Hier liegt das Problem. In der OnPaint Methode habe ich folgenden Code:

    void CInformationDlg::OnPaint() 
    {
    	//Das Bitmap setzen
    	m_cstcBitmap.SetBitmap(m_hLogo);
    
    	CDC* pDCsource, *pDCtarget;
    	pDCsource = new CDC;
    	pDCtarget = new CDC;
    	pDCsource->CreateCompatibleDC(NULL);
    	pDCtarget->CreateCompatibleDC(NULL);
    
    	CBitmap* cbSourceBitmap;
    	cbSourceBitmap = CBitmap::FromHandle(m_hLogo);
    
    	//Quelle mit dem Logo in Ausgangsgröße besetzen
    	CBitmap* test = pDCsource->SelectObject(cbSourceBitmap);
    	ASSERT_VALID(pDCsource);
    
    	CStatic* pLogo = (CStatic*)GetDlgItem(IDB_PRODUCT_LOGO);
    	CRect rect;
    	if(pLogo) {
    
    		pLogo->GetClientRect(&rect);
    	}
    
    	m_cstcBitmap.SetBitmap(m_hLogo);
    	//Größe bestimmen
    	BITMAP bmBitParams;
    	cbSourceBitmap->GetBitmap(&bmBitParams);
    
    	//Neues Bild mit richtiger Größe erstellen
    	CBitmap cbResizedLogo;
    	cbResizedLogo.CreateCompatibleBitmap(pDCsource, rect.right, rect.bottom);
    
    	//Ziel mit dem leeren Bild in Zielgröße besetzen
    	pDCtarget.SelectObject(&cbResizedLogo);
    
    	//Stretchen
    	pDCtarget->StretchBlt( 0, 0, rect.right, rect.bottom, pDCsource, 0, 0, bmBitParams.bmWidth, bmBitParams.bmHeight, SRCCOPY);
    	pDCtarget->SetStretchBltMode(HALFTONE);
    	//dc.BitBlt(0, 0, 285, 216, &pDCtarget, 0, 0, SRCCOPY);
    
    	//Mit neuer Größe setzen
    	m_cstcBitmap.SetBitmap((HBITMAP)pDCtarget.GetCurrentBitmap()->GetSafeHandle());
    
    	if (IsIconic())
    	{
    		CPaintDC dc(this);
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    	delete(pDCsource);
    	delete(pDCtarget);
    }
    

    Beim debuggen habe ich rausgefunden, daß hier:

    CBitmap* test = pDCsource->SelectObject(cbSourceBitmap);
    

    das Problem liegt.
    test enthält NULL. In der Dokumentation steht:

    The return value is NULL if there is an error.
    ERROR Device context or region is not valid.

    Hat jemand irgendeine Idee?

    Danke schonmal


Anmelden zum Antworten