Wo ist die ReleaseDC() Methode?



  • HAllo leute,

    ich zeichne gerade eine Skala klasse, welche von CWnd abgeleitet ist.

    In OnPaint will ich die scalart zeichnen, was auch funktioniert, aber
    ich muss ja eigentlich nach GetDC(); auch ReleaseDC() aufrunfen, nachdem ich gezeichnet habe. gell

    1. Aber diese methode ist kein member von CDC???

    CDC *pScaleView = GetDC();
    
    pScale->ReleaseDC(); //gibts nich (eese gibt nur ReleaseOutputDC
    

    was nun?

    2. Muss ich wenn ich einen DC kopiere

    m_oDC.CreateCompatibleDC(GetDC());
    

    auch Release audführen?

    3. Wenn ich das ganze mit BeginPaint und EndPaint mache, dann zeichnet er mit die geschicht nicht wenn ich WM_PAINT aufrufe?

    PAINTSTRUCT ps;
    CDC *p =BeginPaint(&ps);
    p->DrawText(....);
    EnPaint(&ps);
    

    4. Und was soll dann noch das CPaintDC! Es sol genutzt werden wenn ich über WM_PAINT die OnPaint Methode aufrufe?

    Wann nun, verstehe das ganze nich? Will eigentlich nur flackerfrei und stilgemäß et was in mein CWnd abgleitetes Fenster zeichnen? 😃

    P.S.: Der weil schicke ich in dem OnMouesMove event die EM_PAINT message. mit UpdateWindow willer nich so recht..

    Kann mir jemand kurz eine übersicht geben mit dem Zeichnen aktualisieren etc.? grüße


  • Mod

    BorisDieKlinge schrieb:

    In OnPaint will ich die scalart zeichnen, was auch funktioniert, aber
    ich muss ja eigentlich nach GetDC(); auch ReleaseDC() aufrunfen, nachdem ich gezeichnet habe. gell

    Sicher! Aber Du brauchst GetDC nie! Warum auch? Es gibt ja CPaintDC, CWindowDC, CClientDC Objekte mit entsprechenden Destruktoren.

    BorisDieKlinge schrieb:

    1. Aber diese methode ist kein member von CDC???

    CDC *pScaleView = GetDC();
    
    pScale->ReleaseDC(); //gibts nich (eese gibt nur ReleaseOutputDC
    

    was nun?

    Bitte von welcher GetDC funktion redest Du? Welche Klasse bitte?
    Nur mal am Rande: Schonmal was von der MSDN gehört?
    http://msdn.microsoft.com/en-us/library/71eseab0(VS.80).aspx

    For common device contexts, GetDC assigns default attributes to the context each time it is retrieved. For class and private contexts, GetDC leaves the previously assigned attributes unchanged. The device context can be used in subsequent graphics device interface (GDI) functions to draw in the client area.

    Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting.

    BorisDieKlinge schrieb:

    2. Muss ich wenn ich einen DC kopiere

    m_oDC.CreateCompatibleDC(GetDC());
    

    auch Release audführen?

    Lesen!
    Natürlich. Du erzeugst doch einen neuen! Aber nicht in dem Fall, den Du zeigst, denn hier gibt es einen Destruktor!

    Mal eine Frage am Rande: Was sucht ein DC als Membervariable in Deiner Klasse!

    BorisDieKlinge schrieb:

    3. Wenn ich das ganze mit BeginPaint und EndPaint mache, dann zeichnet er mit die geschicht nicht wenn ich WM_PAINT aufrufe?

    PAINTSTRUCT ps;
    CDC *p =BeginPaint(&ps);
    p->DrawText(....);
    EnPaint(&ps);
    

    Wie bitte rufst Du WM_PAINT auf. Doch hoffentlich nicht mit SendMessage(...,WM_PAINT,...)
    Dafür gibt es RedrawWindow, IvalidateRect, UpdateWindow!

    BorisDieKlinge schrieb:

    4. Und was soll dann noch das CPaintDC! Es sol genutzt werden wenn ich über WM_PAINT die OnPaint Methode aufrufe?

    Wann nun, verstehe das ganze nich? Will eigentlich nur flackerfrei und stilgemäß et was in mein CWnd abgleitetes Fenster zeichnen? 😃

    P.S.: Der weil schicke ich in dem OnMouesMove event die EM_PAINT message. mit UpdateWindow willer nich so recht..

    Kann mir jemand kurz eine übersicht geben mit dem Zeichnen aktualisieren etc.? grüße

    Ohne Paint DC wird ein Fenster nie validiert, d.h. WM_APINT wird unendlich weiter gesendet.
    Ein CPaintDC ist die einzige Methode korrekt zu Zeichnen.



  • ok danke Martin, ich verwende dann CPaintDC 🙂

    Hab noch eine paar fragen (ja kenne msdn, aber bin dann oft noch verwirrt) 😉

    1. Wenn ich flakkerfrei zeichnen will muss ich doch memmory DC erzeugen, welchen ich dann auf den CWnd dc mappe, (der memory DC ist dann ein member von meiner klasse)

    2. Wie mach ich es wenn ich eine Basis klasse habe class

    CScale : public CWnd {..};
    

    und ich von diese jeweis CScaleX und CScaleY ableite..

    class CScaleX : public Scale {..};
    

    muss ich dann sowas alle events auch in Cscale definieren, welche ich CScaleX bzw. CScaleY verwenden will

    so:

    CScale:

    void CScale::OnPaint(){
     CWnd::OnPaint();
    }
    
    void CScaleX::OnPaint(){
     CScale::OnPaint();
    }
    

    ich denke ja, sonst wird das zeugs von ScaleX ja nich gezeichnet oder?

    sorry.. bin neue in dem genre..


  • Mod

    BorisDieKlinge schrieb:

    1. Wenn ich flakkerfrei zeichnen will muss ich doch memmory DC erzeugen, welchen ich dann auf den CWnd dc mappe, (der memory DC ist dann ein member von meiner klasse)

    Nicht korrekt! Manmacht DCs nicht statisch. Man erzeugt diesen dynmaisch im OnPaint/OnDraw..

    Schau doch mal einfach die CMemDC Klasse an!
    Warum machst Du eigentlich so etwas selber, wenn es dazu 1a dokumentierten Code gibt.

    http://www.codeproject.com/KB/GDI/flickerfree.aspx

    BorisDieKlinge schrieb:

    2. Wie mach ich es wenn ich eine Basis klasse habe class

    CScale : public CWnd {..};
    

    Gar nicht! Tenmporär auf dem Stack und Punkt!

    BorisDieKlinge schrieb:

    CScale:

    void CScale::OnPaint(){
     CWnd::OnPaint();
    }
    
    void CScaleX::OnPaint(){
     CScale::OnPaint();
    }
    

    ich denke ja, sonst wird das zeugs von ScaleX ja nich gezeichnet oder?

    sorry.. bin neue in dem genre..

    Man kann OnPaint nicht vernünftig ableiten.
    Das erzeugt letzten Endes immer einen neuen CPaintDC!

    Das ist genau der Grund warum OnDraw in den MFC Klassen eingeführt wurde.

    Es macht auch keinen Sinn. Warum sool ich einen Teil so und einen Teil erst und dann später einen abgeleiteten OnPaint durchführen.

    Besser ist das Zeichnen, dann in einzelne Funktionen zu zerlegen, die einen DC Zeiger übergeben bekommen.


Anmelden zum Antworten