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