Hintergrundfarbe während der Runtime ändern



  • ruf mal nicht die Methode der Elternklasse auf, damit machst doch dein Zeug wieder weg, weil die Standardimplementierung wieder aktiv ist dadurch.



  • ja ok

    aber was hab ich denn noch für andere möglichkeiten außer das BMP?

    bei der InitInstance kann ich des eh vergessen, EraseBkgnd geht auch so nicht, CtlColor kann ich nur nen brush zurück geben...

    also das ma echt ne klasse aufgabe *ggg*

    ich meine, ich kann auch mit kanonen auf spatzen schießen

    wenn ich die hintergrundfarbe während der runtime ändern will, kann ich das aktuelle dialogfenster schließen, ein neues öffnen und dann in der InitInstance andere werte reinpacken

    aber das ma doch echt net sinn der sache, oder?



  • du? kein wunder dass er das BMP was ich da noch drinhabe auf diesen Bgrnd setzt

    weil ich übergebe ihm dieses DC und nicht das Dialog DC

    ich implementiere das mal eben um

    ker, bei der hitze is das auch kein wunder...

    kann man ja gar net mehr nachdenken



  • *lol* ok

    aber das Aufrufen der ELternmethode lass trotzdem mal draußen^^



  • damit mach ich das aber gerade wieder *Ggg*

    also eigentlich ist das schonmal ein fortschritt, problem ist nur, dass er irgendwie nicht das ganze dialogfenster nimmt *ggg*

    lustig ist auch, wenn ich das fenster verschiebe, ist das ding wieder weg Ügg

    ker, is das ma echt dumm 🙂



  • Ich test das auch ma grad, bei mir wird der Hintergrund immer nur schwarz??



  • jo, bei mir kommen auch so lustig sachen raus *gg*

    bei FloodFill z.B. is bei mir alles weiß 🙂



  • hast du ICQ, bevor wir das ganze Forum vollspammen mit der Farbe?
    meine Nummer: 191133458



  • //
    BOOL CDialogTestDlg::OnEraseBkgnd(CDC* pDC)
    {
    	CRect rect;
        GetClientRect(&rect);	
    
    	pDC->FillSolidRect(&rect,RGB(1,0,255));
    
    	return true;
    }
    

    Ok also damit macht er es bei mir. Mein Fehler war die OpenGL-Denke, da gehen die Farbangaben von 0-1 und nicht bis 255^^ Daher war alles schwarz.

    Was natürlich nicht blau wird, ist der Hintergrund der Steuerelemente, die bleiben Standardgrau, dazu musst dann wohl die WM_CTLCOLOR abfangen.

    Aber alles was zum Dialoghintergrund gehört wird eingefärbt



  • hmm, irgendwie funzt das hier net

    haben nen proxy druf

    schon alles probiert



  • ja genau

    so hab ich das ja auch

    und wenn de jetzt nen button nimmst und da mal das ausführen lässt

    CDC* WindowCDC;
    WindowCDC = GetWindowDC();
    OnEraseBgrnd(WindowCDC);
    

    da passiert da was ganz komisches

    brauchste noch netmal die farbwerte verändern

    einfach mal aufrufen das ding per button oder sp



  • alles klar

    ich habs

    ich räum nur mal eben die CPP datei auf und dann poste ich den code



  • MSS-Software schrieb:

    ja genau

    so hab ich das ja auch

    und wenn de jetzt nen button nimmst und da mal das ausführen lässt

    CDC* WindowCDC;
    WindowCDC = GetWindowDC();
    OnEraseBgrnd(WindowCDC);
    

    da passiert da was ganz komisches

    brauchste noch netmal die farbwerte verändern

    einfach mal aufrufen das ding per button oder sp

    Ich würde da aber eher für das Elternfenster des Buttons Invalidate() aufrufen.



  • ja, hab ich ja jetzt auch so gemacht

    also hier der code:

    1. 2 Member anlegen

    *.h

    COLORREF m_crColors;
    BOOL m_bMerker;
    
    this->m_crColors = RGB(255,0,0); //Entweder im Constructor oder OnInitDialog
    this->m_bMerker = FALSE;         //Entweder im Constructor oder OnInitDialog
    
    void CTest::OnPaint()
    {
       CPaintDC dc(this); // device context for painting
       if ( this->m_bMerker )
          this->ReDrawBgColor();
    }
    
    BOOL CTest::OnEraseBkgnd(CDC* pDC)
    {
       // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    
       CRect rect;
       GetClientRect(&rect); 
       pDC->FillSolidRect(&rect,this->m_crColors); 
    
       return CDialog::OnEraseBkgnd(pDC);
    }
    
    void CTest::ReDrawBgColor()
    {
       CDC *WindowCDC;
       WindowCDC = this->GetDC();
       this->OnEraseBkgnd(WindowCDC);
    }
    
    /////--------- Jetzt die Farbänderung per Buttonclick etc ------------- ////////
    
    void CTest::OnBnClickedButtonChangeColor()
    {
       this->m_crColors = RGB(0,255,0);
       this->m_bMerker = TRUE;
       this->ReDrawBgColor();
       this->Invalidate();
    }
    


  • da muss ich intervenieren^^

    this->ReDrawBgColor();
    lass das mal lieber raus

    Erstens holst du da drinnen mit GetDC() nen COntext und gibst ihn nicht wieder frei mit ReleaseDC -> MemLeak

    Zweitens: Invalidate() in dieser Form löst automatisch ein Erase-Background aus :), ist also unnötig das selber vorher noch zu tun



  • zu 1

    jo, sorry; hab ich gar net druf geachtet gehabt *schäm*

    zu 2

    hintergrund sollte sein, dass ich das net immer neu alles eintippen muss und in der OnErase... kannste das ja net erst machen, weil er ja einen übergabe DC braucht

    das einzigste wäre dafür eine member zu machen

    hab noch die idee gehabt, dass als zusätzliche methode in die CDC Klasse mit einzubinden

    aber das wird schwierig denke ich, denn du musst ja auch in die OnPaint schreiben....


Anmelden zum Antworten