DI Bitmaps erzeugen



  • Hallo,

    ich spiele nun seit einiger Zeit mit CBitmap rum. Aber so wie ich das bis jetz begriffen habe ist CBitmap nicht device unabhängig. ich musste jedes mal einen konstanten RGB Bytestream (3Farbkomponentenx8Bits/Farbkomponente = 24Bit)(r,g,b,r,g,b) in einen Strom mit 32Bit umwandeln.

    Zusätzlich muss ich in meinen windows einstellungen 32Bit Farbtiefe einstellen, sonst wird mir auf dem dialog gar nichts angezeit, wenn ich die CBitmaps mittels BitBlt darstelle

    Wie kann ich also device unabhängig meine bilder darstellen, sodass ich direkt im 24Bit modus bleiben kann und ich die bilder unabhängig von den windows einstellungen darstellen kann?

    Mein erster ansatz wäre von CBitmap wegzukommen und direkt BITMAP bzw. HBITMAP zu verwenden, bringt das was? Wo ist der unterschied zwischen CBitmap und BITMAP?

    danke schonmal

    mfg, TFTS



  • ok und so gehts:

    Membervariablen im Dialog erzeugen:

    CDC* m_pVirtualDC;
    int m_nCurrentWidth;
    int m_nCurrentHeight;
    

    In die OnInit:

    m_pVirtualDC = new CDC;
    m_pVirtualDC->CreateCompatibleDC(NULL);
    

    Die OnPaint:

    void CJpg2bmpDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Center icon in client rectangle
    		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;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CPaintDC dc(this);
    		dc.BitBlt(0,0,m_nCurrentWidth,m_nCurrentHeight,m_pVirtualDC,0,0,SRCCOPY);
    		CDialog::OnPaint();
    	}
    }
    

    Und diese Funktion aufrufen (zb per Button) mit dem Pfad zur bmp-File als Parameter:

    CJpg2bmpDlg::DrawDIBitmap(CString csFilePath)
    {
    	BITMAP bmParameter;
        HBITMAP hBitmap;
    	CBitmap *pCBitmap;
    
        // Handle auf geladene Bitmap holen
        hBitmap = (HBITMAP)::LoadImage(0,csFilePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    	pCBitmap = CBitmap::FromHandle(hBitmap);
    	m_pVirtualDC->SelectObject(pCBitmap);
    	pCBitmap->GetBitmap(&bmParameter);
    	m_nCurrentWidth = bmParameter.bmWidth;
    	m_nCurrentHeight = bmParameter.bmHeight;
        this->Invalidate();
    }
    

    wer das ganze für Dokumenten basierende Anwendung braucht kann hier mal gucken:
    http://www.cpp-tutor.de/mfc/mfc/kap5/lektion8.htm

    mfg, TFTS


Anmelden zum Antworten