B
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