Bitmapfrage



  • Hi Leute ;),

    Ich versuch ne Bitmap anzuzeigeb(IDB_BITMAP1).

    Hier mal mein Code:

    void CBitmapverarbeiten1View::OnDraw(CDC* pDC)
    {
    	CBitmapverarbeiten1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen
    	CDC *m_pdcMemory = new CDC ;
            CBitmap *m_pBitmap = new CBitmap;	
    
    	pDC->SetStretchBltMode (COLORONCOLOR);
    	pDC->StretchBlt (20, -20, m_sizeDest.cx, -m_sizeDest.cy, m_pdcMemory, 0, 0, m_sizeSource.cx, m_sizeSource.cy, SRCCOPY);
    	pDC->StretchBlt (450, -20, m_sizeDest.cx, -m_sizeDest.cy, m_pdcMemory, 0, 0, m_sizeSource.cx, m_sizeSource.cy, SRCCOPY);
    
    }
    
    void CBitmapverarbeiten1View::OnInitialUpdate()
    {
    	CScrollView::OnInitialUpdate();
    
    	CDC *m_pdcMemory = new CDC;
            CBitmap *m_pBitmap = new CBitmap;	
    
    	CSize sizeTotal (800, 1050);
    	CSize sizeLine = CSize(sizeTotal.cx /100, sizeTotal.cy /100);
    	SetScrollSizes (MM_LOENGLISH,sizeTotal,sizeTotal,sizeLine);
    
    	BITMAP bm;
    	if (m_pdcMemory->GetSafeHdc () == NULL)
    	{
    		CClientDC dc(this);
    		OnPrepareDC (&dc);
    		m_pBitmap->LoadBitmap (IDB_BITMAP1);
    		m_pdcMemory->CreateCompatibleDC (&dc);
    		m_pdcMemory->SelectObject (m_pBitmap);
    		m_pBitmap->GetObject (sizeof(bm),&bm);
    		m_sizeSource.cx = bm.bmWidth;
    		m_sizeSource.cy = bm.bmHeight;
    		m_sizeDest = m_sizeSource;
    		dc.DPtoLP (&m_sizeDest);
    	}
    }
    

    Wenn ich m_pdcMemory und m_pBitmap als Membervariable deklariere funktioniert die Sache.
    Deklariere ich aber lokal s.o. klappts nicht.
    Was fehlt ist die Zuweisung, aber wie mach ich das ?

    Vielen dank schon mal vorab
    ShadowEater



  • ? Warum zeichnest du nicht alles in der OnDraw? Weiß nicht so ganz was das in OnInitialUpdate bewirken soll ...

    // Halt die Bitmap im Konstruktor laden ...
    CBitmapverarbeiten1View::CBitmapverarbeiten1View() // ...
    {
    	// ...
    	m_bitmap.LoadBitmap(IDB_BITMAP1); // protected: CBitmap m_bitmap; /* so in deiner Klasse definieren */
    	// 
    }
    
    void CBitmapverarbeiten1View::OnDraw(CDC* pDC)
    {
        CBitmapverarbeiten1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
    	CDC dcMem;
    	dcMem.CreateCompatibleDC(pDC);
    	CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
    
    	// Jetzt mal halt noch weiter rein und am ende kopierst du dann mit
    	pDC->BitBlt(/* ... */); 
    	// den Inhalt wieder in deinen pDC ...
    
    	dcMem.SelectObject(pOldBitmap);
    	dcMem.DeleteDC();
    }
    

    so in etwa ...



  • Hi (D)Evil,
    danke für Deine Ant5wort.
    In OnInitialUpdate hab ichs reingeschrieben, damit die Bmp. und der Gerätekontext die selbe Lebensdauer haben wie das Programm.
    Deine Möglichkeit Funktioniert selbstverständlich.
    Was mich interessiert hätte ist, wie ich die Sache Coden müsste wenn ich Bmp. und Kontext nicht als Membervariablen benutze sondern mit :

    CDC *m_pdcMemory = new CDC;
     CBitmap *m_pBitmap = new CBitmap;
    

    arbeite lokal in den Funktionen OnDraw und OnInitialUpdate ?

    regards
    ShadowEater



  • das würde nicht gehen ... bzw wäre es inperformant, da du bei jedem aufruf wieder die bitmap laden müsstest ... und man kann auch ein Objekt lokal erzeugen ... das hat nix damit zu tun ob aufm heap oder net ..



  • Jo,

    inperformant isses wirklich !

    regards
    😉
    ShadowEater


Anmelden zum Antworten