Sollte ich hier besser new / delete verwenden?



  • Hallo alle zusammen,

    ich wollte mich mal schnell erkundigen wie ich eine Codezeile in meinem Projekt besser gestalten sollte. Ich habe eine Klasse, die einen RGB-Wert als Eigenschaft hat und in einer Methode soll dieser Wert als Hintergrund dienen. So wird also hier immer wieder eine Variale HBRUSH benötigt, sollte ich die da am Anfang der Methode mit new im Speicher bereitstellen und am Ende wieder mit delete freogeben oder reicht es hier vollkommen aus die Makros, also DeleteObject(), zu benutzen?

    Genau das gleiche frage ich mich aber auch bei einer Schrift, die je nach Größe des Fensters immer wieder neu erstellt werden muss, sprich größer oder kleiner.

    Wie sollte ich das am besten lösen?

    Gruß Tobi.

    [EDIT] Verdammt merk gerade, flasches Forum... BITTE MAL INS SUBFORUM "Rund um die Programmierung" VERSCHIEBEN, DANKE!



  • DeleteObject ist afaik kein Makro.
    Es kann sinnvoll sein, innerhalb eines Frameworks Objekte nicht per delete zu löschen, bzw. dies mit Methoden zu kapseln.
    Und bei einem Font wird ja nur die Eigenschaft geändert, wenn sich die Größe ändert.



  • Ich blicke nich ganz durch 😉
    Was hat nen HBRUSH (ein Handle) mit Speicher-bereitstellen zu tun?
    Um den Speicher der Objekte die mit dem Handle verbundenen sind kümmert sich doch Windows selbst?

    Worum man sich kümmern muss ist das die Handles auch wieder geschlossen werden GDI-Objekte mit DeleteObject() - sofern nicht mit SelectObject() in ein DC selektiert. Die meisten sonstigen Handles mit CloseHandle()



  • Zeige mal deine Klasse.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Neuigkeiten aus der realen Welt in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also hier die Klasse:

    class CPanel {
    
        private:
    
            HWND m_hDescWnd;
            RECT m_DescRect;
            RECT m_PanelRect;
    
            float m_LastxPos;
            float m_LastyPos;
            float m_LastWidth;
            float m_LastHeigth;
    
            COLORREF m_PanelBG;
    
        public:
    
            CPanel( );
            CPanel( HWND hDescWnd );
            CPanel( HWND hDescWnd, int xPos, int yPos, int width, int heigth );
    
            ~CPanel( );
    
            void m_SetDescWindow( HWND hDesc );
            void m_SetPanelSize( int xPos, int yPos, int width, int heigth );
            void m_SetPanelBG( COLORREF cPanelBrush );
            void m_UpdatePanel( bool bHidde );
    };
    

    Hier die Definition der Methode:

    void CPanel::m_SetPanelBG( COLORREF cPanelBrush ) {
    
        if( cPanelBrush == 0 ) {
    
            this->m_PanelBG = RGB( 255, 255, 255 );
        }
        else {
    
            this->m_PanelBG = cPanelBrush;
        }
    }
    
    void CPanel::m_UpdatePanel( bool bHidde ) {
    
        // ***** Determine whether the panel is hidden *****
        if( bHidde ) {
    
            SetRect( &this->m_PanelRect, -1, -1, 0, 0 );
            return;
        }
    
        HBRUSH hBackground = 0;
    
        // ***** Update panel *****
        GetClientRect( this->m_hDescWnd, &this->m_DescRect );
    
        SetRect( &this->m_PanelRect,
                 ( this->m_DescRect.right * ( this->m_LastxPos / 100 ) ),
                 ( this->m_DescRect.bottom * ( this->m_LastyPos / 100 ) ),
                 ( this->m_DescRect.right * ( this->m_LastWidth / 100 ) ),
                 ( this->m_DescRect.bottom * ( this->m_LastHeigth / 100 ) ) );
    
        HDC hDC = GetDC( this->m_hDescWnd );
    
        hBackground = CreateSolidBrush( this->m_PanelBG );
    
        ::FillRect( hDC, &this->m_PanelRect, hBackground );
    
        ReleaseDC( this->m_hDescWnd, hDC );
    
        DeleteObject( hBackground );
    }
    

    Hmm.. is das trotzdem richtig mit dem DeleteObject(), auch wenn ich des Handle nicht selektiert habe?

    Gruß Tobi.



  • *push*



  • gerade dann ist es richtig:

    msdn schrieb:

    Do not delete a drawing object (pen or brush) while it is still selected into a DC.

    Also völlig richtig so wie du es da hast.



  • Noch eine Frage: Ich habe die m_UpdatePanel in die WM_PAINT gepackt, duch da ist ja auch schon HDC hDC = BeginPaint( ) ...
    Ist des schlimm oder egal?

    Gruß Tobi.



  • sofern das passende EndPaint() dabei ist 😉

    Macht nichts aus innerhalb BeginPaint() und EndPaint() noch mit GetDC() zu arbeiten...



  • allet klar, danke dann erst mal.

    Gruß Tobi.


Anmelden zum Antworten