dialog neu zeichnen mit hintergrundbild



  • Hy,

    ich habe das Problem , dass das Neuzeichen des Hintergundbildes mir die Steuerelemente(gruppenfelder usw.) übermalt.

    CRect cr;
    	GetWindowRect(cr); 
        CClientDC dc(this);
    	CBitmap bitmap;
    	CDC dcMemory;
    	bitmap.LoadBitmap(IDB_BITMAP1); 
    	dcMemory.CreateCompatibleDC(&dc); 
    	CBitmap* pOldBitmap = dcMemory.SelectObject(&bitmap);
    	dc.PatBlt(cr.left , cr.top , cr.Width() ,cr.Height() , PATCOPY);
    	dc.SetStretchBltMode(COLORONCOLOR); 
    	dc.StretchBlt(0,0,cr.right - cr.left ,cr.bottom - cr.top ,&dcMemory,0,0,256,256,SRCCOPY);//SRCAND SRCCOPY  
    	dc.SelectObject(pOldBitmap);
    

    Wie erreiche ich ,dass die Steuerelemente oben liegen , wenn OnPaint aufgerufen wird ?



  • Servus,

    rufe einfach vor deinem Code die Methode CDialog::OnPaint() auf:

    Bsp:

    void CDeinDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Symbol in Clientrechteck 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();
    		CRect cr; 
    		GetWindowRect(cr); 
    		CClientDC dc(this); 
    		CBitmap bitmap; 
    		CDC dcMemory; 
    		bitmap.LoadBitmap(IDB_BITMAP1); 
    		dcMemory.CreateCompatibleDC(&dc); 
    		CBitmap* pOldBitmap = dcMemory.SelectObject(&bitmap); 
    		dc.PatBlt(cr.left , cr.top , cr.Width() ,cr.Height() , PATCOPY); 
    		dc.SetStretchBltMode(COLORONCOLOR); 
    		dc.StretchBlt(0,0,cr.right - cr.left ,cr.bottom - cr.top ,&dcMemory,0,0,256,256,SRCCOPY);//SRCAND SRCCOPY   
    		dc.SelectObject(pOldBitmap); 
    	}
    }
    

    Sollte (eigentlich 😃 ) funzen..

    *winke*
    Hellsgore



  • Also bei mir war das Zauberwort der OnEraseBkgnd Event:
    statt IDB_BITMAP4 setzt du einfach deine Resource ein ....
    durch den Event kann man auch das Fenster mal überlappen lassen.

    BOOL CGameSelect::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    CDC* pDC2 = GetDC();
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP4);
    CDC dc2;
    CRect rect;
    GetClientRect(rect);
    BITMAP bm;
    bitmap.GetBitmap(&bm);
    dc2.CreateCompatibleDC(pDC2);
    dc2.SelectObject(bitmap);
    pDC->StretchBlt(0,0,rect.Width(), rect.Height(),&dc2,0,0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    // und hier ein code um ein Bitmap auf einen Button zu bekommen ...
    bitmap.DeleteObject();
    bitmap.LoadBitmap(IDB_deineBitmapResource);
    m_button.SetBitmap(bitmap);

    //return CDialog::OnEraseBkgnd(pDC);
    return 1;
    }



  • Erstmal danke für die Anworten ..
    @Hellsgore : das habe ich ja auch probiert .. war eben ein Misserfolg(sollte eben nur rein theoretisch funzen..)

    @thenoname: Was mache ich wenn ich nicht WM_ERASEBKGND im klassenAssitent aufrufen kann und somit nicht OnEraseBkgnd() ?
    Ich benutze eine Dialogbasierte Anwendung .



  • Ja, das ist Dialogbasierend.
    Gehe mit Rechtsklick auf deinen kompletten Dialog und schau in den Eigenschaften
    das Dingen neben dem Blitz an (Meldungen). Da muss es sein !!



  • Hy ,

    welche Eigenschaften meinst du ? Die Dialogeigenschaften ? und wo soll denn da ein Blitz sein (auf welcher Tabkarte-- es gibt dort keine Meldungen)? Die Nachrichten stehen doch Im Klassenassitent unter Nachrichtzuordnungstabellen(da ist es wie gesagt nicht vorhanden)
    Ich benutze den VC++6..
    (Manche dinge sind doch echt zum verzweifeln ..)


Anmelden zum Antworten